mirror of https://github.com/jimsalterjrs/sanoid
Merge pull request #523 from mat813/snapshot-removal
Add target snapshot deletion.
This commit is contained in:
commit
ed1c542850
|
|
@ -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.
|
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
|
+ --no-clone-rollback
|
||||||
|
|
||||||
Do not rollback clones on target
|
Do not rollback clones on target
|
||||||
|
|
|
||||||
27
syncoid
27
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@",
|
"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",
|
"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",
|
"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);
|
or pod2usage(2);
|
||||||
|
|
||||||
my %compressargs = %{compressargset($args{'compress'} || 'default')}; # Can't be done with GetOptions arg, as default still needs to be set
|
my %compressargs = %{compressargset($args{'compress'} || 'default')}; # Can't be done with GetOptions arg, as default still needs to be set
|
||||||
|
|
@ -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()
|
} # end syncdataset()
|
||||||
|
|
||||||
sub compressargset {
|
sub compressargset {
|
||||||
|
|
@ -1999,6 +2023,7 @@ Options:
|
||||||
--create-bookmark Creates a zfs bookmark for the newest snapshot on the source after replication succeeds (only works with --no-sync-snap)
|
--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
|
--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)
|
--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
|
--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 ...
|
--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 ...
|
--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 ...
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue