From 544a7d269ec9d4546b03879b18bab7180636a3e8 Mon Sep 17 00:00:00 2001 From: jll2 Date: Wed, 24 Jun 2009 17:01:14 -0700 Subject: [PATCH] Create rsync_failure_codes option. User may optionally create a file rsync_failure_codes with a newline-separated list of rsync return codes that are to be regarded as complete failure. If rsync exits with such a code, then the backup will be marked for deletion during the next ccollect run (if delete_incomplete). I added documentation for this feature in doc/ccollect.text In my experience (yours may differ), two rsync exit codes that belong in this file are 12 and 255. I have seen 12 result from ssh errors and 255 result from a kernel module conflict. In both cases, the resulting backups were empty. Without the rsync_failure_codes option, such errors cause good backups to be deleted, as per c_interval, leaving behind the new empty backups. In the long run, we may want a different and more comprehensive method for analyzing rsync errors. In the short run, I find this option necessary. --- ccollect.sh | 36 ++++++++++++++++++++++++++---------- doc/ccollect.text | 10 ++++++++++ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/ccollect.sh b/ccollect.sh index d6831bc..2b67ba7 100755 --- a/ccollect.sh +++ b/ccollect.sh @@ -281,7 +281,8 @@ while [ "${i}" -lt "${no_sources}" ]; do c_dest="${backup}/destination" c_pre_exec="${backup}/pre_exec" c_post_exec="${backup}/post_exec" - for opt in exclude verbose very_verbose rsync_options summary delete_incomplete remote_host ; do + for opt in exclude verbose very_verbose rsync_options summary delete_incomplete \ + remote_host rsync_failure_codes ; do if [ -f "${backup}/$opt" -o -f "${backup}/no_$opt" ]; then eval c_$opt=\"${backup}/$opt\" else @@ -530,16 +531,31 @@ while [ "${i}" -lt "${no_sources}" ]; do _techo "Transferring files..." rsync "$@" "${source}" "${destination_full}"; ret=$? - - # - # remove marking here - # - pcmd rm "${destination_dir}.${c_marker}" || \ - _exit_err "Removing ${destination_dir}/${c_marker} failed." - _techo "Finished backup (rsync return code: $ret)." - if [ "${ret}" -ne 0 ]; then - _techo "Warning: rsync exited non-zero, the backup may be broken (see rsync errors)." + + # + # Check if rsync exit code indicates failure. + # + fail="" + if [ -f "$c_rsync_failure_codes" ]; then + while read code ; do + if [ "$ret" = "$code" ]; then + fail=1 + fi + done <"$c_rsync_failure_codes" + fi + + # + # Remove marking here unless rsync failed. + # + if [ -z "$fail" ]; then + pcmd rm "${destination_dir}.${c_marker}" || \ + _exit_err "Removing ${destination_dir}/${c_marker} failed." + if [ "${ret}" -ne 0 ]; then + _techo "Warning: rsync exited non-zero, the backup may be broken (see rsync errors)." + fi + else + _techo "Warning: rsync failed with return code $ret." fi # diff --git a/doc/ccollect.text b/doc/ccollect.text index f1451f8..3d9c480 100644 --- a/doc/ccollect.text +++ b/doc/ccollect.text @@ -359,6 +359,7 @@ Additionally a source may have the following files: - `delete_incomplete` delete incomplete backups - `remote_host` host to backup to + - `rsync_failure_codes` list of rsync exit codes that indicate complete failure Example: @@ -574,6 +575,15 @@ If you create the file `delete_incomplete` in a source specification directory, was interrupted) and remove them. Without this file `ccollect` will only warn the user. +Detailed description of "rsync_failure_codes" +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +If you have the file `rsync_failure_codes` in your source configuration +directory, it should contain a newline-separated list of numbers representing +rsync exit codes. If rsync exits with any code in this list, a marker will +be left in the destination directory indicating failure of this backup. If +you have enabled delete_incomplete, then this backup will be deleted during +the next ccollect run on the same interval. + Hints -----