1.0.19 - working recursive sync in syncoid!
This commit is contained in:
parent
12a9919063
commit
5c157f821c
|
@ -1,3 +1,5 @@
|
||||||
|
1.0.19 working recursive sync (sync specified dataset and all child datasets, ie pool/ds, pool/ds/1, pool, ds/1/a, pool/ds/2 ...) with --recursive or -r in syncoid!
|
||||||
|
|
||||||
1.0.18 updated syncoid to break sync out of main routine and into syncdataset(). this will allow doing recursive sync, in next update :)
|
1.0.18 updated syncoid to break sync out of main routine and into syncdataset(). this will allow doing recursive sync, in next update :)
|
||||||
|
|
||||||
1.0.17 updated syncoid to use sudo when necessary if it isn't already root - working user needs NOPASSWD for /sbin/zfs in /etc/sudoers
|
1.0.17 updated syncoid to use sudo when necessary if it isn't already root - working user needs NOPASSWD for /sbin/zfs in /etc/sudoers
|
||||||
|
|
40
syncoid
40
syncoid
|
@ -4,7 +4,7 @@
|
||||||
# from http://www.gnu.org/licenses/gpl-3.0.html on 2014-11-17. A copy should also be available in this
|
# from http://www.gnu.org/licenses/gpl-3.0.html on 2014-11-17. A copy should also be available in this
|
||||||
# project's Git repository at https://github.com/jimsalterjrs/sanoid/blob/master/LICENSE.
|
# project's Git repository at https://github.com/jimsalterjrs/sanoid/blob/master/LICENSE.
|
||||||
|
|
||||||
my $version = '1.0.18';
|
my $version = '1.0.19';
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use Data::Dumper;
|
use Data::Dumper;
|
||||||
|
@ -53,7 +53,20 @@ my %snaps;
|
||||||
|
|
||||||
## break here to call replication individually so that we can loop across children separately, for recursive replication ##
|
## break here to call replication individually so that we can loop across children separately, for recursive replication ##
|
||||||
|
|
||||||
syncdataset($sourcehost, $sourcefs, $targethost, $targetfs);
|
if (! $args{'recursive'}) {
|
||||||
|
print "syncdataset($sourcehost, $sourcefs, $targethost, $targetfs);\n";
|
||||||
|
} else {
|
||||||
|
if ($debug) { print "DEBUG: recursive sync of $sourcefs.\n"; }
|
||||||
|
my @datasets = getchilddatasets($sourcehost, $sourcefs, $sourceisroot);
|
||||||
|
foreach my $dataset(@datasets) {
|
||||||
|
$dataset =~ s/$sourcefs//;
|
||||||
|
chomp $dataset;
|
||||||
|
my $childsourcefs = $sourcefs . $dataset;
|
||||||
|
my $childtargetfs = $targetfs . $dataset;
|
||||||
|
# print "syncdataset($sourcehost, $childsourcefs, $targethost, $childtargetfs); \n";
|
||||||
|
syncdataset($sourcehost, $childsourcefs, $targethost, $childtargetfs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
exit 0;
|
exit 0;
|
||||||
|
|
||||||
|
@ -62,11 +75,28 @@ exit 0;
|
||||||
##############################################################################
|
##############################################################################
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
|
sub getchilddatasets {
|
||||||
|
my ($rhost,$fs,$isroot,%snaps) = @_;
|
||||||
|
my $mysudocmd;
|
||||||
|
|
||||||
|
if ($isroot) { $mysudocmd = ''; } else { $mysudocmd = $sudocmd; }
|
||||||
|
if ($rhost ne '') { $rhost = "$sshcmd $rhost"; }
|
||||||
|
|
||||||
|
my $getchildrencmd = "$rhost $mysudocmd $zfscmd list -o name -Hpr $fs |";
|
||||||
|
if ($debug) { print "DEBUG: getting list of child datasets on $fs using $getchildrencmd...\n"; }
|
||||||
|
open FH, $getchildrencmd;
|
||||||
|
my @children = <FH>;
|
||||||
|
close FH;
|
||||||
|
|
||||||
|
return @children;
|
||||||
|
}
|
||||||
|
|
||||||
sub syncdataset {
|
sub syncdataset {
|
||||||
|
|
||||||
my ($sourcehost, $sourcefs, $targethost, $targetfs) = @_;
|
my ($sourcehost, $sourcefs, $targethost, $targetfs) = @_;
|
||||||
|
|
||||||
|
if ($debug) { print "DEBUG: syncing source $sourcefs to target $targetfs.\n"; }
|
||||||
|
|
||||||
# make sure target is not currently in receive.
|
# make sure target is not currently in receive.
|
||||||
if (iszfsbusy($targethost,$targetfs,$targetisroot)) {
|
if (iszfsbusy($targethost,$targetfs,$targetisroot)) {
|
||||||
die "Cannot sync now: $targetfs is already target of a zfs receive process.\n";
|
die "Cannot sync now: $targetfs is already target of a zfs receive process.\n";
|
||||||
|
@ -115,7 +145,7 @@ sub syncdataset {
|
||||||
my $disp_pvsize = readablebytes($pvsize);
|
my $disp_pvsize = readablebytes($pvsize);
|
||||||
if ($pvsize == 0) { $disp_pvsize = 'UNKNOWN'; }
|
if ($pvsize == 0) { $disp_pvsize = 'UNKNOWN'; }
|
||||||
my $synccmd = buildsynccmd($sendcmd,$recvcmd,$pvsize,$sourceisroot,$targetisroot);
|
my $synccmd = buildsynccmd($sendcmd,$recvcmd,$pvsize,$sourceisroot,$targetisroot);
|
||||||
print "INFO: Sending oldest full snapshot $oldestsnap (~ $disp_pvsize) to new target filesystem:\n";
|
print "INFO: Sending oldest full snapshot $sourcefs\@$oldestsnap (~ $disp_pvsize) to new target filesystem:\n";
|
||||||
if ($debug) { print "DEBUG: $synccmd\n"; }
|
if ($debug) { print "DEBUG: $synccmd\n"; }
|
||||||
|
|
||||||
# make sure target is (still) not currently in receive.
|
# make sure target is (still) not currently in receive.
|
||||||
|
@ -143,7 +173,7 @@ sub syncdataset {
|
||||||
die "Cannot sync now: $targetfs is already target of a zfs receive process.\n";
|
die "Cannot sync now: $targetfs is already target of a zfs receive process.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
print "INFO: Updating new target filesystem with incremental $oldestsnap ... $newsyncsnap (~ $disp_pvsize):\n";
|
print "INFO: Updating new target filesystem with incremental $sourcefs\@$oldestsnap ... $newsyncsnap (~ $disp_pvsize):\n";
|
||||||
if ($debug) { print "DEBUG: $synccmd\n"; }
|
if ($debug) { print "DEBUG: $synccmd\n"; }
|
||||||
system($synccmd);
|
system($synccmd);
|
||||||
|
|
||||||
|
@ -182,7 +212,7 @@ sub syncdataset {
|
||||||
if ($pvsize == 0) { $disp_pvsize = "UNKNOWN"; }
|
if ($pvsize == 0) { $disp_pvsize = "UNKNOWN"; }
|
||||||
my $synccmd = buildsynccmd($sendcmd,$recvcmd,$pvsize,$sourceisroot,$targetisroot);
|
my $synccmd = buildsynccmd($sendcmd,$recvcmd,$pvsize,$sourceisroot,$targetisroot);
|
||||||
|
|
||||||
print "Sending incremental $matchingsnap ... $newsyncsnap (~ $disp_pvsize):\n";
|
print "Sending incremental $sourcefs\@$matchingsnap ... $newsyncsnap (~ $disp_pvsize):\n";
|
||||||
if ($debug) { print "DEBUG: $synccmd\n"; }
|
if ($debug) { print "DEBUG: $synccmd\n"; }
|
||||||
system("$synccmd");
|
system("$synccmd");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue