rsync of symbolic links bug

jw schultz jw at pegasys.ws
Fri May 9 11:00:05 EST 2003


On Thu, May 08, 2003 at 09:44:10AM -0600, Tom Schmidt wrote:
> I am seeing a problem with the way the rsync of symbolic links
> is done.  Here is a simple example to duplicate this issue:
> 
[snip]
> 
> ACK!  The symbolically linked file pointing to foo/file4 got
> updated first, causing anyone using it to see it pointing at a
> non-existant file!
> 
> This bug is essentially a race condition that can cause
> the mirrored system to see the symbolic link get updated to
> point to a non-existant file since the file it is pointing
> at has not been mirrored yet.

Not a bug, it is a race condition.  rsync is not atomic.

> We see this problem quite often when we are mirroring our
> /usr/local filesystem.  For example, if we have /usr/local/lib/libz.so
> symbolically linked to /usr/local/zlib/1.1.3/libz.so, but then
> update it to point to /usr/local/zlib/1.1.4/libz.so, then
> when the filesystem is mirrored, the /usr/local/lib/libz.so
> link gets updated long before the /usr/local/zlib/1.1.4 directory
> tree gets pushed.  This causes any application that is started
> that using libz.so to fail while the rsync is running!  This
> downtime can be quite long when pushing many updates across our
> WAN to servers on the other side of the world!
> 
> It appears that the rsync pushes the updates out alphabetically,
> which is why the symbolic link to bar/file3 above worked OK, but
> the symbolic link to foo/file4 fails with the race condition.
> 
> The fix for this would be to have rsync internally sort its filelist
> to push the updated files and directories first, then the updated
> symbolic links last.  How can this be done?  Or am I missing
> some rsync commandline issue to fix this problem?
> 
> My only workaround at this point is to rsync twice, the first time
> without pushing any symbolic links, but this workaround can
> still burn us if an update is made to the master copy between
> the two rsync runs.

If you need atomic updates use a staging area.  Have two
directories.  rsync to the unused one and then swap them.

--copy-links might also be of use.


-- 
________________________________________________________________
	J.W. Schultz            Pegasystems Technologies
	email address:		jw at pegasys.ws

		Remember Cernan and Schmitt


More information about the rsync mailing list