--- recepies/zfs/zfs-replicate-pool.pl 2011/09/05 22:18:01 268 +++ recepies/zfs/zfs-replicate-pool.pl 2011/09/05 22:52:27 269 @@ -5,14 +5,17 @@ use Net::OpenSSH; use Data::Dump qw(dump); use List::Util qw(first); -use Time::Hires; +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; $_; @@ -67,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"; @@ -77,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"; @@ -98,23 +101,25 @@ 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"; - sleep 0.1; # FIXME wait for netcat to start + sleep 1; # FIXME wait for netcat to start - my $send = "zfs send $snapshot | nc -q 0 -w 5 10.60.0.202 8888"; + 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; + $dev->system("zfs set readonly=on $to_pool/$name\@$snap") if $i == 0; die $dev->error if $dev->error; + sleep 1; $dev_snapshot = snapshots_from $dev; die "can't find new snapshot $snap" unless $dev_snapshot->{$to_dev};