diff --git a/zfs/replication_history.go b/zfs/replication_history.go index 2ad5abf..d420047 100644 --- a/zfs/replication_history.go +++ b/zfs/replication_history.go @@ -24,35 +24,36 @@ 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) if err != nil { - return 0, err + return 0, errors.Wrap(err, "zfs: replication cursor: get snapshot createtxg") } snapGuid, err := strconv.ParseUint(propsSnap.Get("guid"), 10, 64) bookmarkPath := fmt.Sprintf("%s#%s", fs.ToString(), ReplicationCursorBookmarkName) propsBookmark, err := zfsGet(bookmarkPath, []string{"createtxg"}, sourceAny) _, bookmarkNotExistErr := err.(*DatasetDoesNotExist) if err != nil && !bookmarkNotExistErr { - return 0, err + 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, "cannot parse bookmark createtxg") + 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, "cannot parse snapshot createtxg") + return 0, errors.Wrap(err, "zfs: replication cursor: parse snapshot createtxg") } if snapTxg < bookmarkTxg { - return 0, errors.New("replication cursor can only be advanced, not set back") + 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 - return 0, err + return 0, errors.Wrap(err, "zfs: replication cursor: destroy current cursor") } } if err := ZFSBookmark(fs, snapname, ReplicationCursorBookmarkName); err != nil { - return 0, err + return 0, errors.Wrapf(err, "zfs: replication cursor: create bookmark") } return snapGuid, nil } diff --git a/zfs/zfs.go b/zfs/zfs.go index d693f2c..40b1434 100644 --- a/zfs/zfs.go +++ b/zfs/zfs.go @@ -924,7 +924,7 @@ func ZFSGet(fs *DatasetPath, props []string) (*ZFSProperties, error) { return zfsGet(fs.ToString(), props, sourceAny) } -var zfsGetDatasetDoesNotExistRegexp = regexp.MustCompile(`^cannot open '(\S+)': (dataset does not exist|no such pool or dataset)`) +var zfsGetDatasetDoesNotExistRegexp = regexp.MustCompile(`^cannot open '([^)]+)': (dataset does not exist|no such pool or dataset)`) type DatasetDoesNotExist struct { Path string @@ -1080,6 +1080,8 @@ func ZFSBookmark(fs *DatasetPath, snapshot, bookmark string) (err error) { snapname := zfsBuildSnapName(fs, snapshot) bookmarkname := zfsBuildBookmarkName(fs, bookmark) + debug("bookmark: %q %q", snapname, bookmarkname) + cmd := exec.Command(ZFS_BINARY, "bookmark", snapname, bookmarkname) stderr := bytes.NewBuffer(make([]byte, 0, 1024))