--- recepies/zfs/zfs-replicate-pool.pl 2011/09/05 22:02:00 267 +++ recepies/zfs/zfs-replicate-pool.pl 2011/09/06 09:09:37 270 @@ -5,13 +5,17 @@ use Net::OpenSSH; use Data::Dump qw(dump); use List::Util qw(first); +use Time::HiRes; + +my $compress = '| lzop -c'; +my $decompress = 'lzop -d |'; my $arh = Net::OpenSSH->new('root@10.60.0.204'); my $dev = Net::OpenSSH->new('root@10.60.0.202'); sub on { my ($ssh,$command) = @_; - warn "## ", $ssh->get_host, "> $command\n"; + warn "## ", $ssh->get_host, "> $command\n" if $ENV{DEBUG}; if ( $command =~ m/zfs list/ ) { map { chomp; $_; @@ -45,7 +49,7 @@ push @{ $snapshot->{$fs} }, $name; } - warn "snapshots_from $host ",dump($snapshot),$/; +# warn "snapshots_from $host ",dump($snapshot),$/; return $snapshot; } @@ -66,7 +70,7 @@ } my $max_snapshot = $#{ $arh_snapshot->{$fs} }; - warn "$max_snapshot snapshots of $fs on arh\n"; + warn "$fs has ",$max_snapshot+1," snapshots\n"; my $to_dev = "$to_pool/$name"; @@ -76,10 +80,10 @@ my $dev_snapshot = snapshots_from $dev; if ( exists $dev_snapshot->{$to_dev} ) { if ( first { /^\Q$snap\E$/ } @{ $dev_snapshot->{$to_dev} } ) { - warn "+ $name exists\n"; + warn "+ $name @ $snap exists\n"; next; } else { - warn "- $name missing\n"; + warn "- $name @ $snap missing\n"; } } else { warn "$name not found on target yet"; @@ -93,24 +97,31 @@ $snapshot = "-i $from_pool/$name\@$prev $from_pool/$name\@$snap"; } - warn "zfs transfer $snapshot -> $to_dev"; + warn "zfs transfer $snapshot -> $to_dev\n"; my $t = time(); - my $recv = "nc -w 5 -l -p 8888 | zfs receive $to_dev"; + my $recv = "nc -w 3 -l -p 8888 | $decompress zfs receive $to_dev"; warn ">> $recv\n"; my ($rin1,$pid1) = $dev->pipe_in($recv); warn ">> pid: $pid1"; - my $send = "zfs send $snapshot | nc -q 0 -w 5 10.60.0.202 8888"; + sleep 1; # FIXME wait for netcat to start + + my $send = "zfs send $snapshot $compress | nc -q 0 -w 2 10.60.0.202 8888"; warn "<< $send\n"; $arh->system($send); + die $arh->error if $arh->error; $t = time() - $t; warn "took $t seconds to complete\n"; $dev->system("zfs set readonly=on $to_pool/$name") if $i == 0; - die $dev->error if $dev->error; + warn "ERROR: ",$dev->error if $dev->error; + + sleep 1; + $dev_snapshot = snapshots_from $dev; + die "can't find new snapshot $snap" unless $dev_snapshot->{$to_dev}; }