weird interaction between --delete-delay and --partial-dir when transfer is interrupted

Michal Soltys soltys at
Mon Dec 22 08:46:40 GMT 2008


>> Either way - as a workaround, you could drop delete-excluded, and
>> then just finalize the thing with something like: find /bar/ -depth
>> -name ".rsync-partial" -exec rm -rf "{}" \;

I meant more like: -name ".rsync-partial" -prune -exec .....

Shivkumar Venkatasubrahmanyam wrote:
> Makes sense.  And this does seem like a corner case :)  I did some more 
> testing along the lines you suggested ...
> mkdir src ; touch src/a
> mkdir dst ; mkdir dst/.rp
> rsync -a -vvvv --delete-excluded --delete-delay --delay-updates 
> --partial-dir=.rp src/ dest/ >log 2>&1
> It seems this bug/corner case requires all the following conditions:
> (1) [...]

I've straced it a bit - it looks like the flow is as follows:

1) with delete-excluded + delay-updates - .rp is deleted before 
transfers (delete-excluded implies --delete-during, which in turn 
behaves like per-dir --delete-before), then recreated when there's a 
need to rename temporary file to that dir `rename(".a.7e7C6w", ".rp/a"` 
then .rp is deleted as it's no longer needed, /unless/ it has something 
left in it.

2) with delete-excluded + delete-delay - due to lack of delay-updates, 
.rp is not needed by rsync at all, /unless/ the transfer is interrupted 
(then .rp will be created, and parital file moved there). Deletion 
happens only once, at the end, due to delete-delay.

3) with all the 3 above - situation similar to 1) happens, but at the 
very end, and there's funny conflict - .rp will be deleted due to not 
being needed anymore, but then delete-delay will take the action. First 
trying to delete .rp's contents, but ... the dir is not there anymore, 
thus ENOENT (due to opendir failing) and rsync's exit code 23.

> I use all three of these options: --delete-excluded because I have added 
> "--filter" options over time and I want the destination to reflect these 
> newly excluded files,

Any particular reason for that ? Sender/receiver rules can achieve the
same, with much nicer flexibility. What delete-exclude does, is just 
turn exclude into sender-exclude globally. You can do that explicitly, e.g.

H, something
-,s something

More information about the rsync mailing list