added network compression using lzo and cleanup timeouts for reliable operation
authorDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 5 Sep 2011 22:52:27 +0000 (22:52 +0000)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 5 Sep 2011 22:52:27 +0000 (22:52 +0000)
git-svn-id: svn://svn.rot13.org/sysadmin-cookbook@269 191e9f34-6774-4a6d-acfc-7664dacd4a2a

recepies/zfs/zfs-replicate-pool.pl

index 4c5b494..71e4b05 100755 (executable)
@@ -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};