20

I'm trying to figure out how if rsyncing files is atomic. I couldn't find any confirmation about it. Due to rsync being able to send only deltas, I was under the impression that it also updates only parts of the live files.

On the other hang DJB recommends rsync for synchronising live .cdb files and I've found this post ( http://lists.samba.org/archive/rsync/2002-April/002210.html ) which both would imply that the new file is created, then moved over to the proper location.

Can someone point me at an official source confirming one or the other?

3 Answers 3

22

Rsync creates a new temporary file which will contain blocks from the local (receiving) copy and whatever blocks it requires from the sending copy. When done the temporary file is moved into place replacing the original.

Full details are here;

http://rsync.samba.org/how-rsync-works.html

Sign up to request clarification or add additional context in comments.

4 Comments

You didn't answer the actual question. – Would this mean that the updating of each individual file is atomic?
Yes if you consider a file move operation within the same directory to be atomic.
"Consider"? Atomic vs non-atomic should be a matter of fact, not opinion, I think? :) Do you mean to say that there are instances where renaming of a file in a directory (on a local disk) is not atomic? If so, when would that happen?
@zrajm: yes, that depends, see even here for more fundamentally asked a yes and no answer: stackoverflow.com/q/7054844/367456
1

There is a perl script that is supposed to add this functionality: http://www.opensource.apple.com/source/rsync/rsync-40/rsync/support/atomic-rsync

The problem is that I tried to test it and it doesn't work. Also there is something strage because from the URL it looks like being something related to rsync 4.0 and the current version of rsync is 2.6.9 !

Comments

1

No, rsync does not write files atomically.

During transfer, a hidden temporary file is being created within the same target directory (.[original-filename].[6-random-characters]) which contains the transferred file in its current state.

If you should happen to lose connection during transfer or rsync encounters any other problem, causing the connection to be closed, before killing the rsync process make sure to copy the temporary file in order to keep all the already transferred packages. You can simply rename the temp file (remove the leading "." and the trailing ".xxxxxx" to get the original filename).

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.