mirror of https://github.com/jimsalterjrs/sanoid
Merge remote-tracking branch 'upstream/master' into handle-same-second-bookmarks
This commit is contained in:
commit
2143f629d5
|
|
@ -320,6 +320,11 @@ As of 1.4.18, syncoid also automatically supports and enables resume of interrup
|
|||
|
||||
This argument tells syncoid to set the recordsize on the target before writing any data to it matching the one set on the replication src. This only applies to initial sends.
|
||||
|
||||
+ --delete-target-snapshots
|
||||
|
||||
With this argument snapshots which are missing on the source will be destroyed on the target. Use this if you only want to handle snapshots on the source.
|
||||
Note that snapshot deletion is only done after a successful synchronization. If no new snapshots are found, no synchronization is done and no deletion either.
|
||||
|
||||
+ --no-clone-rollback
|
||||
|
||||
Do not rollback clones on target
|
||||
|
|
|
|||
29
syncoid
29
syncoid
|
|
@ -25,7 +25,8 @@ GetOptions(\%args, "no-command-checks", "monitor-version", "compress=s", "dumpsn
|
|||
"source-bwlimit=s", "target-bwlimit=s", "sshconfig=s", "sshkey=s", "sshport=i", "sshcipher|c=s", "sshoption|o=s@",
|
||||
"debug", "quiet", "no-stream", "no-sync-snap", "no-resume", "exclude=s@", "skip-parent", "identifier=s",
|
||||
"no-clone-handling", "no-privilege-elevation", "force-delete", "no-rollback", "create-bookmark",
|
||||
"pv-options=s" => \$pvoptions, "keep-sync-snap", "preserve-recordsize", "mbuffer-size=s" => \$mbuffer_size)
|
||||
"pv-options=s" => \$pvoptions, "keep-sync-snap", "preserve-recordsize", "mbuffer-size=s" => \$mbuffer_size,
|
||||
"delete-target-snapshots")
|
||||
or pod2usage(2);
|
||||
|
||||
my %compressargs = %{compressargset($args{'compress'} || 'default')}; # Can't be done with GetOptions arg, as default still needs to be set
|
||||
|
|
@ -97,7 +98,7 @@ my $pscmd = 'ps';
|
|||
my $pvcmd = 'pv';
|
||||
my $mbuffercmd = 'mbuffer';
|
||||
my $sudocmd = 'sudo';
|
||||
my $mbufferoptions = "-q -s 128k -m $mbuffer_size 2>/dev/null";
|
||||
my $mbufferoptions = "-q -s 128k -m $mbuffer_size";
|
||||
# currently using POSIX compatible command to check for program existence because we aren't depending on perl
|
||||
# being present on remote machines.
|
||||
my $checkcmd = 'command -v';
|
||||
|
|
@ -888,6 +889,29 @@ sub syncdataset {
|
|||
}
|
||||
}
|
||||
|
||||
if (defined $args{'delete-target-snapshots'}) {
|
||||
# Find the snapshots that exist on the target, filter with
|
||||
# those that exist on the source. Remaining are the snapshots
|
||||
# that are only on the target. Then sort by creation date, as
|
||||
# to remove the oldest snapshots first.
|
||||
my @to_delete = sort { $snaps{'target'}{$a}{'creation'}<=>$snaps{'target'}{$b}{'creation'} } grep {!exists $snaps{'source'}{$_}} keys %{ $snaps{'target'} };
|
||||
while (@to_delete) {
|
||||
# Create batch of snapshots to remove
|
||||
my $snaps = join ',', splice(@to_delete, 0, 50);
|
||||
my $command;
|
||||
if ($targethost ne '') {
|
||||
$command = "$sshcmd $targethost " . escapeshellparam("$targetsudocmd $zfscmd destroy $targetfsescaped\@$snaps");
|
||||
} else {
|
||||
$command = "$targetsudocmd $zfscmd destroy $targetfsescaped\@$snaps";
|
||||
}
|
||||
if ($debug) { print "$command\n"; }
|
||||
my ($stdout, $stderr, $result) = capture { system $command; };
|
||||
if ($result != 0 && !$quiet) {
|
||||
warn "$command failed: $stderr";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} # end syncdataset()
|
||||
|
||||
sub compressargset {
|
||||
|
|
@ -2017,6 +2041,7 @@ Options:
|
|||
--create-bookmark Creates a zfs bookmark for the newest snapshot on the source after replication succeeds (only works with --no-sync-snap)
|
||||
--preserve-recordsize Preserves the recordsize on initial sends to the target
|
||||
--no-rollback Does not rollback snapshots on target (it probably requires a readonly target)
|
||||
--delete-target-snapshots With this argument snapshots which are missing on the source will be destroyed on the target. Use this if you only want to handle snapshots on the source.
|
||||
--exclude=REGEX Exclude specific datasets which match the given regular expression. Can be specified multiple times
|
||||
--sendoptions=OPTIONS Use advanced options for zfs send (the arguments are filtered as needed), e.g. syncoid --sendoptions="Lc e" sets zfs send -L -c -e ...
|
||||
--recvoptions=OPTIONS Use advanced options for zfs receive (the arguments are filtered as needed), e.g. syncoid --recvoptions="ux recordsize o compression=lz4" sets zfs receive -u -x recordsize -o compression=lz4 ...
|
||||
|
|
|
|||
|
|
@ -45,6 +45,9 @@ wait
|
|||
sleep 1
|
||||
|
||||
../../../syncoid --debug --compress=none --no-resume "${POOL_NAME}"/src "${POOL_NAME}"/dst | grep "reset partial receive state of syncoid"
|
||||
|
||||
sleep 1
|
||||
|
||||
../../../syncoid --debug --compress=none "${POOL_NAME}"/src "${POOL_NAME}"/dst
|
||||
|
||||
exit $?
|
||||
|
|
|
|||
|
|
@ -47,6 +47,9 @@ sleep 1
|
|||
|
||||
zfs destroy "${POOL_NAME}"/src@big
|
||||
../../../syncoid --debug --compress=none "${POOL_NAME}"/src "${POOL_NAME}"/dst # | grep "reset partial receive state of syncoid"
|
||||
|
||||
sleep 1
|
||||
|
||||
../../../syncoid --debug --compress=none "${POOL_NAME}"/src "${POOL_NAME}"/dst
|
||||
|
||||
exit $?
|
||||
|
|
|
|||
Loading…
Reference in New Issue