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.
This commit is contained in:
parent
142fd24fc8
commit
544a7d269e
2 changed files with 36 additions and 10 deletions
36
ccollect.sh
36
ccollect.sh
|
@ -281,7 +281,8 @@ while [ "${i}" -lt "${no_sources}" ]; do
|
||||||
c_dest="${backup}/destination"
|
c_dest="${backup}/destination"
|
||||||
c_pre_exec="${backup}/pre_exec"
|
c_pre_exec="${backup}/pre_exec"
|
||||||
c_post_exec="${backup}/post_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
|
if [ -f "${backup}/$opt" -o -f "${backup}/no_$opt" ]; then
|
||||||
eval c_$opt=\"${backup}/$opt\"
|
eval c_$opt=\"${backup}/$opt\"
|
||||||
else
|
else
|
||||||
|
@ -530,16 +531,31 @@ while [ "${i}" -lt "${no_sources}" ]; do
|
||||||
|
|
||||||
_techo "Transferring files..."
|
_techo "Transferring files..."
|
||||||
rsync "$@" "${source}" "${destination_full}"; ret=$?
|
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)."
|
_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
|
fi
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -359,6 +359,7 @@ Additionally a source may have the following files:
|
||||||
|
|
||||||
- `delete_incomplete` delete incomplete backups
|
- `delete_incomplete` delete incomplete backups
|
||||||
- `remote_host` host to backup to
|
- `remote_host` host to backup to
|
||||||
|
- `rsync_failure_codes` list of rsync exit codes that indicate complete failure
|
||||||
|
|
||||||
|
|
||||||
Example:
|
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
|
was interrupted) and remove them. Without this file `ccollect` will only warn
|
||||||
the user.
|
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
|
Hints
|
||||||
-----
|
-----
|
||||||
|
|
Loading…
Reference in a new issue