rsync --backup is non-atomic -- does it need to be?
JD Paul
jdpaul at interstel.net
Fri Jul 27 14:36:30 MDT 2012
It appears that 'rsync --backup' is non-atomic.
The code in question is in backup.c, in make_simple_backup():
64 if (do_rename(fname, fnamebak) == 0) {
65 if (verbose > 1) {
66 rprintf(FINFO, "backed up %s to %s\n",
67 fname, fnamebak);
68 }
69 break;
70 }
This has a race condition because 'fname' will be gone until the
rename() from the temp file happens. It's a small window, but I've
seen it get tripped.
Is there some deep reason to NOT do
do_unlink(fnamebak);
do_link(fname, fnamebak);
instead of the do_rename(), so that fname never disappears, and is
updated atomically?
(This is, of course, not actual code; it requires error checking,
verbosity, and a judgement call on what to do about a backup file that
is not unlink()-able. I figured I'd ask about the underlying logic
before attempting a patch.)
Thanks --
JD Paul
More information about the rsync
mailing list