5 |
use Net::OpenSSH; |
use Net::OpenSSH; |
6 |
use Data::Dump qw(dump); |
use Data::Dump qw(dump); |
7 |
use List::Util qw(first); |
use List::Util qw(first); |
8 |
use Time::Hires; |
use Time::HiRes; |
9 |
|
|
10 |
|
my $compress = '| lzop -c'; |
11 |
|
my $decompress = 'lzop -d |'; |
12 |
|
|
13 |
my $arh = Net::OpenSSH->new('root@10.60.0.204'); |
my $arh = Net::OpenSSH->new('root@10.60.0.204'); |
14 |
my $dev = Net::OpenSSH->new('root@10.60.0.202'); |
my $dev = Net::OpenSSH->new('root@10.60.0.202'); |
15 |
|
|
16 |
sub on { |
sub on { |
17 |
my ($ssh,$command) = @_; |
my ($ssh,$command) = @_; |
18 |
warn "## ", $ssh->get_host, "> $command\n"; |
warn "## ", $ssh->get_host, "> $command\n" if $ENV{DEBUG}; |
19 |
if ( $command =~ m/zfs list/ ) { |
if ( $command =~ m/zfs list/ ) { |
20 |
map { |
map { |
21 |
chomp; $_; |
chomp; $_; |
70 |
} |
} |
71 |
|
|
72 |
my $max_snapshot = $#{ $arh_snapshot->{$fs} }; |
my $max_snapshot = $#{ $arh_snapshot->{$fs} }; |
73 |
warn "$max_snapshot snapshots of $fs on arh\n"; |
warn "$fs has ",$max_snapshot+1," snapshots\n"; |
74 |
|
|
75 |
my $to_dev = "$to_pool/$name"; |
my $to_dev = "$to_pool/$name"; |
76 |
|
|
80 |
my $dev_snapshot = snapshots_from $dev; |
my $dev_snapshot = snapshots_from $dev; |
81 |
if ( exists $dev_snapshot->{$to_dev} ) { |
if ( exists $dev_snapshot->{$to_dev} ) { |
82 |
if ( first { /^\Q$snap\E$/ } @{ $dev_snapshot->{$to_dev} } ) { |
if ( first { /^\Q$snap\E$/ } @{ $dev_snapshot->{$to_dev} } ) { |
83 |
warn "+ $name exists\n"; |
warn "+ $name @ $snap exists\n"; |
84 |
next; |
next; |
85 |
} else { |
} else { |
86 |
warn "- $name missing\n"; |
warn "- $name @ $snap missing\n"; |
87 |
} |
} |
88 |
} else { |
} else { |
89 |
warn "$name not found on target yet"; |
warn "$name not found on target yet"; |
101 |
|
|
102 |
my $t = time(); |
my $t = time(); |
103 |
|
|
104 |
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"; |
105 |
warn ">> $recv\n"; |
warn ">> $recv\n"; |
106 |
my ($rin1,$pid1) = $dev->pipe_in($recv); |
my ($rin1,$pid1) = $dev->pipe_in($recv); |
107 |
warn ">> pid: $pid1"; |
warn ">> pid: $pid1"; |
108 |
|
|
109 |
sleep 0.1; # FIXME wait for netcat to start |
sleep 1; # FIXME wait for netcat to start |
110 |
|
|
111 |
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"; |
112 |
warn "<< $send\n"; |
warn "<< $send\n"; |
113 |
$arh->system($send); |
$arh->system($send); |
114 |
|
die $arh->error if $arh->error; |
115 |
|
|
116 |
$t = time() - $t; |
$t = time() - $t; |
117 |
warn "took $t seconds to complete\n"; |
warn "took $t seconds to complete\n"; |
118 |
|
|
119 |
$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; |
120 |
die $dev->error if $dev->error; |
die $dev->error if $dev->error; |
121 |
|
|
122 |
|
sleep 1; |
123 |
$dev_snapshot = snapshots_from $dev; |
$dev_snapshot = snapshots_from $dev; |
124 |
die "can't find new snapshot $snap" unless $dev_snapshot->{$to_dev}; |
die "can't find new snapshot $snap" unless $dev_snapshot->{$to_dev}; |
125 |
|
|