zfs: helper for ZFSGet guid and createtxg

This commit is contained in:
Christian Schwarz
2019-10-14 17:48:47 +02:00
parent 18d2c350de
commit 0ba4b5eda6
2 changed files with 41 additions and 19 deletions
+5 -18
View File
@@ -2,7 +2,6 @@ package zfs
import (
"fmt"
"strconv"
"github.com/pkg/errors"
)
@@ -26,30 +25,18 @@ func ZFSGetReplicationCursor(fs *DatasetPath) (*FilesystemVersion, error) {
func ZFSSetReplicationCursor(fs *DatasetPath, snapname string) (guid uint64, err error) {
snapPath := fmt.Sprintf("%s@%s", fs.ToString(), snapname)
debug("replication cursor: snap path %q", snapPath)
propsSnap, err := zfsGet(snapPath, []string{"createtxg", "guid"}, sourceAny)
snapProps, err := ZFSGetCreateTXGAndGuid(snapPath)
if err != nil {
return 0, errors.Wrap(err, "zfs: replication cursor: get snapshot createtxg")
}
snapGuid, err := strconv.ParseUint(propsSnap.Get("guid"), 10, 64)
if err != nil {
return 0, errors.Wrap(err, "zfs: replication cursor: parse snapshot guid")
return 0, errors.Wrapf(err, "get properties of %q", snapPath)
}
bookmarkPath := fmt.Sprintf("%s#%s", fs.ToString(), ReplicationCursorBookmarkName)
propsBookmark, err := zfsGet(bookmarkPath, []string{"createtxg"}, sourceAny)
propsBookmark, err := ZFSGetCreateTXGAndGuid(bookmarkPath)
_, bookmarkNotExistErr := err.(*DatasetDoesNotExist)
if err != nil && !bookmarkNotExistErr {
return 0, errors.Wrap(err, "zfs: replication cursor: get bookmark txg")
}
if err == nil {
bookmarkTxg, err := strconv.ParseUint(propsBookmark.Get("createtxg"), 10, 64)
if err != nil {
return 0, errors.Wrap(err, "zfs: replication cursor: parse bookmark createtxg")
}
snapTxg, err := strconv.ParseUint(propsSnap.Get("createtxg"), 10, 64)
if err != nil {
return 0, errors.Wrap(err, "zfs: replication cursor: parse snapshot createtxg")
}
if snapTxg < bookmarkTxg {
if snapProps.CreateTXG < propsBookmark.CreateTXG {
return 0, errors.New("zfs: replication cursor: can only be advanced, not set back")
}
if err := ZFSDestroy(bookmarkPath); err != nil { // FIXME make safer by using new temporary bookmark, then rename, possible with channel programs
@@ -59,5 +46,5 @@ func ZFSSetReplicationCursor(fs *DatasetPath, snapname string) (guid uint64, err
if err := ZFSBookmark(fs, snapname, ReplicationCursorBookmarkName); err != nil {
return 0, errors.Wrapf(err, "zfs: replication cursor: create bookmark")
}
return snapGuid, nil
return snapProps.Guid, nil
}