]> git.llucax.com Git - software/bacap.git/commitdiff
Avoid creation of dangling symlinks
authorRodrigo Campos <rodrigo@sdfg.com.ar>
Wed, 2 Feb 2011 14:24:30 +0000 (11:24 -0300)
committerLeandro Lucarella <luca@burns.springfield.home>
Wed, 2 Feb 2011 16:42:49 +0000 (13:42 -0300)
If rsync fails, possibly the new directory does not exist, so we should
not create the symlink. Because if we create it, the next backup would
not be incremental, because the --link-dest option does not point to an
existing directory.

This patch fixes this by checking the return code of rsync and only
creates the symlink if rsync exits successful or with error 24 ("Partial
transfer due to vanished source files") which is somewhat expected.

Signed-off-by: Rodrigo Campos <rodrigo@sdfg.com.ar>
bacap

diff --git a/bacap b/bacap
index 1f6f9cbced35d621c7e78f1fe4eb4015b7d8eff2..8be3167341569d5d86e13c3c8e1d0893ce619cde 100755 (executable)
--- a/bacap
+++ b/bacap
@@ -132,15 +132,33 @@ do
                extra_flags="$extra_flags --include-from=$include"
        plog "Running rsync..."
        $run rsync $RSYNC_FLAGS $extra_flags \
-                               --link-dest="$current_dir" $src "$dst/" ||
-               ret=$(($ret+1))
-       plog "Moving current..."
-       $run rm -f $V "$current_link" ||
+                               --link-dest="$current_dir" $src "$dst/"
+       rsync_ret=$?
+       case $rsync_ret in
+               0)
+                       # Normal return
+                       ;;
+               24)
+                       # Ignore error 24 from rsync ("Partial transfer due to
+                       # vanished source files") which is somewhat expected
+                       # since we don't do a snapshot
+                       ;;
+               *)
+                       # Any other error is important enough
+                       ret=$(($ret+1))
+                       ;;
+       esac
+
+       if [ $ret -eq $saved_ret ]
+       then
+               # Only move current if rsync did not fail, to avoid dangling
+               # symlinks
+               plog "Moving current..."
+               $run rm -f $V "$current_link" ||
                ret=$(($ret+1))
-       $run ln -s $V "$date" "$current_link" ||
+               $run ln -s $V "$date" "$current_link" ||
                ret=$(($ret+1))
-       if [ $ret -ne $saved_ret ]
-       then
+       else
                ERROR_HOSTS="$ERROR_HOSTS $host"
        fi
 done