From 967d28a8ebcab9970e85ad3791326a27288d470e Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Mon, 5 Sep 2011 22:52:27 +0000 Subject: [PATCH] added network compression using lzo and cleanup timeouts for reliable operation git-svn-id: svn://svn.rot13.org/sysadmin-cookbook@269 191e9f34-6774-4a6d-acfc-7664dacd4a2a --- recepies/zfs/zfs-replicate-pool.pl | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/recepies/zfs/zfs-replicate-pool.pl b/recepies/zfs/zfs-replicate-pool.pl index 4c5b494..71e4b05 100755 --- a/recepies/zfs/zfs-replicate-pool.pl +++ b/recepies/zfs/zfs-replicate-pool.pl @@ -5,14 +5,17 @@ use strict; 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 @@ foreach my $fs ( @arh ) { } 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 @@ foreach my $fs ( @arh ) { 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 @@ foreach my $fs ( @arh ) { 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}; -- 2.20.1