X-Git-Url: https://git.distorted.org.uk/~mdw/rsync-backup/blobdiff_plain/d482de4ccee16ff91e5128bc8829882d8a17b3f6..1c0d861:/rsync-backup.in diff --git a/rsync-backup.in b/rsync-backup.in index e9bb3be..2c1e3b6 100644 --- a/rsync-backup.in +++ b/rsync-backup.in @@ -120,6 +120,15 @@ run () { return $rc } +run_diff () { + out=$1 old=$2 new=$3 + ## Write a unified diff from OLD to NEW, to OUT. + + set +e; diff -u "$old" "$new" >"$out"; rc=$?; set -e + case $rc in 1) cat "$out" ;; esac + return $rc +} + localp () { h=$1 ## Answer whether H is a local host. @@ -603,6 +612,7 @@ do_backup () { set -e attempt=0 + fshash_diff=nil ## Run a hook beforehand. set +e; runhook setup $host $fs $date; rc=$?; set -e @@ -630,6 +640,20 @@ do_backup () { esac $verbose " create snapshot" + ## If we had a fshash-mismatch, then clear out the potentially stale + ## entries, both locally and remotely. + case $fshash_diff in + nil) ;; + *) + $verbose " prune cache" + run -stdin "local prune fshash" \ + fshash -u -c$STOREDIR/fshash.cache -H$HASH new/ <$fshash_diff + run -stdin "@$host: prune fshash" \ + _hostrun $userat$host <$fshash_diff \ + "fshash -u -c$fshashdir/$fs.bkp -H$HASH ${snapmnt#*:}" + ;; + esac + ## Build the list of hardlink sources. linkdests="" for i in $host $like; do @@ -686,7 +710,9 @@ do_backup () { ## Compare the two maps. set +e - run "compare fshash maps for $host:$fs" diff -u new.fshash $localmap + fshash_diff=$STOREDIR/tmp/fshash-diff.$host.$fs.$date + run "compare fshash maps for $host:$fs" \ + run_diff $fshash_diff new.fshash $localmap rc_diff=$? set -e case $rc_diff in @@ -706,6 +732,7 @@ do_backup () { ## Glorious success. maybe rm -f $localmap + case $fshash_diff in nil) ;; *) maybe rm -f $fshash_diff ;; esac $verbose " fshash match" ## Commit this backup. @@ -860,7 +887,7 @@ host () { $verbose "host $host" } -snaptype () { snap=$1; shift; snapargs="$*"; retry=0; } +snaptype () { snap=$1; shift; snapargs="$*"; retry=1; } rsyncargs () { rsyncargs="$*"; } like () { like="$*"; } retry () { retry="$*"; }