mirror of
https://github.com/zrepl/zrepl.git
synced 2024-12-22 15:11:16 +01:00
30cdc1430e
This commit - adds a configuration in which no step holds, replication cursors, etc. are created - removes the send.step_holds.disable_incremental setting - creates a new config option `replication` for active-side jobs - adds the replication.protection.{initial,incremental} settings, each of which can have values - `guarantee_resumability` - `guarantee_incremental` - `guarantee_nothing` (refer to docs/configuration/replication.rst for semantics) The `replication` config from an active side is sent to both endpoint.Sender and endpoint.Receiver for each replication step. Sender and Receiver then act accordingly. For `guarantee_incremental`, we add the new `tentative-replication-cursor` abstraction. The necessity for that abstraction is outlined in https://github.com/zrepl/zrepl/issues/340. fixes https://github.com/zrepl/zrepl/issues/340
81 lines
2.7 KiB
Go
81 lines
2.7 KiB
Go
package tests
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/zrepl/zrepl/endpoint"
|
|
"github.com/zrepl/zrepl/platformtest"
|
|
"github.com/zrepl/zrepl/zfs"
|
|
)
|
|
|
|
func CreateReplicationCursor(ctx *platformtest.Context) {
|
|
|
|
platformtest.Run(ctx, platformtest.PanicErr, ctx.RootDataset, `
|
|
CREATEROOT
|
|
+ "foo bar"
|
|
+ "foo bar@1 with space"
|
|
R zfs bookmark "${ROOTDS}/foo bar@1 with space" "${ROOTDS}/foo bar#1 with space"
|
|
+ "foo bar@2 with space"
|
|
R zfs bookmark "${ROOTDS}/foo bar@2 with space" "${ROOTDS}/foo bar#2 with space"
|
|
+ "foo bar@3 with space"
|
|
R zfs bookmark "${ROOTDS}/foo bar@3 with space" "${ROOTDS}/foo bar#3 with space"
|
|
- "foo bar@3 with space"
|
|
`)
|
|
|
|
jobid := endpoint.MustMakeJobID("zreplplatformtest")
|
|
|
|
ds, err := zfs.NewDatasetPath(ctx.RootDataset + "/foo bar")
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
fs := ds.ToString()
|
|
|
|
checkCreateCursor := func(createErr error, c endpoint.Abstraction, references zfs.FilesystemVersion) {
|
|
assert.NoError(ctx, createErr)
|
|
expectName, err := endpoint.ReplicationCursorBookmarkName(fs, references.Guid, jobid)
|
|
assert.NoError(ctx, err)
|
|
require.Equal(ctx, expectName, c.GetFilesystemVersion().Name)
|
|
}
|
|
|
|
snap := fsversion(ctx, fs, "@1 with space")
|
|
book := fsversion(ctx, fs, "#1 with space")
|
|
book3 := fsversion(ctx, fs, "#3 with space")
|
|
|
|
// create first cursor
|
|
cursorOfSnap, err := endpoint.CreateReplicationCursor(ctx, fs, snap, jobid)
|
|
checkCreateCursor(err, cursorOfSnap, snap)
|
|
// check CreateReplicationCursor is idempotent (for snapshot target)
|
|
cursorOfSnapIdemp, err := endpoint.CreateReplicationCursor(ctx, fs, snap, jobid)
|
|
checkCreateCursor(err, cursorOfSnap, snap)
|
|
// check CreateReplicationCursor is idempotent (for bookmark target of snapshot)
|
|
cursorOfBook, err := endpoint.CreateReplicationCursor(ctx, fs, book, jobid)
|
|
checkCreateCursor(err, cursorOfBook, snap)
|
|
// ... for target = non-cursor bookmark
|
|
_, err = endpoint.CreateReplicationCursor(ctx, fs, book3, jobid)
|
|
assert.Equal(ctx, zfs.ErrBookmarkCloningNotSupported, err)
|
|
// ... for target = replication cursor bookmark to be created
|
|
cursorOfCursor, err := endpoint.CreateReplicationCursor(ctx, fs, cursorOfSnapIdemp.GetFilesystemVersion(), jobid)
|
|
checkCreateCursor(err, cursorOfCursor, cursorOfSnap.GetFilesystemVersion())
|
|
|
|
snapProps, err := zfs.ZFSGetFilesystemVersion(ctx, snap.FullPath(fs))
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
bm, err := endpoint.GetMostRecentReplicationCursorOfJob(ctx, fs, jobid)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
if bm.CreateTXG != snapProps.CreateTXG {
|
|
panic(fmt.Sprintf("createtxgs do not match: %v != %v", bm.CreateTXG, snapProps.CreateTXG))
|
|
}
|
|
if bm.Guid != snapProps.Guid {
|
|
panic(fmt.Sprintf("guids do not match: %v != %v", bm.Guid, snapProps.Guid))
|
|
}
|
|
|
|
}
|