Added an already running check
[zfs-nexenta/.git] / zfs-replicate
index a082ce3fe9de2214ca9d07e2c9dbf5f7fe76ac25..8b53d1fb0d4e7a53f4475778cb21c02fc4047251 100755 (executable)
@@ -1,4 +1,4 @@
-#/bin/bash
+#!/bin/bash
 
 # Author: Carl Baldwin & Alan Pippin
 # Description: This script replicates a remote zfs filesystem to a local zfs pool.
@@ -36,9 +36,24 @@ cleanup() {
 }
 fatal_and_exit() {
   echo -e 2>&1 "$1"
+  # Destroy the backup markers on the local filesystem if they exist
+  if [[ -n "$current_backup_marker" ]]; then
+    zfs list -t snapshot ${local_pool}/${current_backup_marker} > /dev/null 2>&1
+    if [ $? == 0 ]; then
+      $zfs destroy ${local_pool}/${current_backup_marker}
+    fi
+  fi
+  if [[ -n "$previous_backup_marker" ]]; then
+    zfs list -t snapshot ${local_pool}/${previous_backup_marker} > /dev/null 2>&1 
+    if [ $? == 0 ]; then
+      $zfs destroy ${local_pool}/${previous_backup_marker}
+    fi
+  fi
+  # send email notification
   if [[ -n "$2" ]]; then
     echo -e "$1" | $mailx -s "zfs replicate on $hostname failed" "$2"
   fi
+  # exit
   exit 1
 }
 trap fatal_and_exit INT
@@ -77,7 +92,7 @@ set -x
 # Create the remote lockdir before continuing with the replicate
 # Spinlock on creating the lock
 maxsleeptime=60
-maxattempts=100
+maxattempts=500
 attempts=0
 while true; do
   ssh $remote mkdir "$lockdir" >/dev/null 2>&1
@@ -162,8 +177,13 @@ if [ $no_markers == 0 ]; then
     fatal_and_exit "-E- remote incremental $zfs rollback command failed" $mailto
   fi
   # Now it should be safe to send the snaps
-  ssh $remote $zfs send -R -I${previous_backup_marker} ${current_backup_marker} | 
-      $zfs receive -vF -d ${local_pool}/${remote_pool}
+  if [[ $throttle_enable == 1 && -e $throttle ]]; then
+    ssh $remote $zfs send -R -I${previous_backup_marker} ${current_backup_marker} | 
+        $throttle $throttle_opt | $zfs receive -vF -d ${local_pool}/${remote_pool}
+  else 
+    ssh $remote $zfs send -R -I${previous_backup_marker} ${current_backup_marker} |
+        $zfs receive -vF -d ${local_pool}/${remote_pool}
+  fi
   if [ $? != 0 ]; then
     fatal_and_exit "-E- remote incremental $zfs send command failed" $mailto
   fi
@@ -182,8 +202,13 @@ else
 
   if [[ -n "$common" ]]; then
     # We found a common snapshot, incrementally send the new snaps
-    ssh $remote $zfs send -R -I${common/*@/@} ${current_backup_marker} |
-        $zfs receive -vF -d ${local_pool}/${remote_pool}
+    if [[ $throttle_enable == 1 && -e $throttle ]]; then
+      ssh $remote $zfs send -R -I${common/*@/@} ${current_backup_marker} |
+          $throttle $throttle_opt | $zfs receive -vF -d ${local_pool}/${remote_pool}
+    else
+      ssh $remote $zfs send -R -I${common/*@/@} ${current_backup_marker} |
+          $zfs receive -vF -d ${local_pool}/${remote_pool}
+    fi
     if [ $? != 0 ]; then
       fatal_and_exit "-E- remote incremental $zfs send command failed" $mailto
     fi
@@ -205,8 +230,13 @@ else
       fi
     fi
     # Send the full filesystem
-    ssh $remote $zfs send -R ${current_backup_marker} |
-        $zfs receive -vF -d ${local_pool}/${remote_pool}
+    if [[ $throttle_enable == 1 && -e $throttle ]]; then
+      ssh $remote $zfs send -R ${current_backup_marker} |
+          $throttle $throttle_opt | $zfs receive -vF -d ${local_pool}/${remote_pool}
+    else
+      ssh $remote $zfs send -R ${current_backup_marker} |
+          $zfs receive -vF -d ${local_pool}/${remote_pool}
+    fi
     if [ $? != 0 ]; then
       fatal_and_exit "-E- remote full $zfs send command failed" $mailto
     fi