/[sysadmin-cookbook]/recepies/zfs/zfs-replicate-pool.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /recepies/zfs/zfs-replicate-pool.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 268 by dpavlin, Mon Sep 5 22:18:01 2011 UTC revision 269 by dpavlin, Mon Sep 5 22:52:27 2011 UTC
# Line 5  use strict; Line 5  use strict;
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; $_;
# Line 67  foreach my $fs ( @arh ) { Line 70  foreach my $fs ( @arh ) {
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    
# Line 77  foreach my $fs ( @arh ) { Line 80  foreach my $fs ( @arh ) {
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";
# Line 98  foreach my $fs ( @arh ) { Line 101  foreach my $fs ( @arh ) {
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    

Legend:
Removed from v.268  
changed lines
  Added in v.269

  ViewVC Help
Powered by ViewVC 1.1.26