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; $_;
}
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";
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";
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};