Problem with exact moment of issuing transfer log entry for a [recv]
action
Konstantin Khomoutov
flatworm at users.sourceforge.net
Wed Aug 20 13:13:48 GMT 2008
Some background: I have been assigned a task to implement one-way
synchronization of a large file storage to another box. The problem is
that on the target box a special directory has to be maintained in which
symlinks to received files should be created using special logic.
After some experimentation I have set up a named pipe which is used by
the receiving rsync daemon for transfer logging; on the reading end of
that pipe another daemon sits which reads log entries as the files are
being received and creates the necessary symlinks for them.
After setting up a test environment I have noticed a problem: some files
were linked successfully while some others were not. After studying
rsync manuals and its receiver.c more closely it turned out that rsync
daemon logs successful "received" event after the file has been received
from the wire to a temporary location but has not yet been copied to its
target place (I use "rsync -a ..." on the client, so in-place mode is
not used).
I have created a patch which postpones logging of the "file received"
event until after the file has been copied to its target location and so
it is really available under the name which is being logged. The patch
is attached.
I understand that my setup is somewhat unusual and probably could be
reimplemented by running a script at the "post-xfer" stage which would
consume the transfer log file created by the rsync daemon, process files
listed in it and then (re)move the log file. Anyway I think that the
solution proposed matches the logging behaviour specified in rsyncd
manual more closely; it would be great if someone with sufficient
knowledge of rsync internals commented on it.
-------------- next part --------------
Postpones logging of successful file transfer up to the
moment temporary file was really copied to its target place,
not just received.
This doesn't change anything for the case when --delay-updates
is used, but for this case syncing of external actions on
[recv] log entries is explicitly meaningless.
--- rsync-3.0.3.orig/receiver.c 2008-08-20 16:28:41.000000000 +0400
+++ rsync-3.0.3/receiver.c 2008-08-20 16:33:06.000000000 +0400
@@ -678,8 +678,6 @@
recv_ok = receive_data(f_in, fnamecmp, fd1, st.st_size,
fname, fd2, F_LENGTH(file));
- log_item(log_code, file, &initial_stats, iflags, NULL);
-
if (fd1 != -1)
close(fd1);
if (close(fd2) < 0) {
@@ -719,6 +717,7 @@
if (remove_source_files || inc_recurse
|| (preserve_hard_links && F_IS_HLINKED(file)))
send_msg_int(MSG_SUCCESS, ndx);
+ log_item(log_code, file, &initial_stats, iflags, NULL);
break;
case 0: {
enum logcode msgtype = redoing ? FERROR_XFER : FWARNING;
More information about the rsync
mailing list