On 04/12/2009 11:44 AM, David Abrahams wrote:
From the TRAMP info file:
`rsync' -- `ssh' and `rsync'
Using the `ssh' command to connect securely to the remote machine
and the `rsync' command to transfer files is almost identical to
the `scp' method.
While `rsync' performs much better than `scp' when transferring
files that exist on both hosts, this advantage is lost if the file
exists only on one side of the connection.
That's pretty un-specific. *Where*, exactly, does the file need to
exist on both machines in order to get this advantage?
Perhaps I wrote it and I was waving my hand because I didn't know the
correct answer either :-(
Of course, on a superficial level, the answer is clear: Suppose you
execute the following sequence of commands:
rsync $REMOTE_FILE $LOCAL_FILE
emacs $LOCAL_FILE # small changes here
rsync $LOCAL_FILE $REMOTE_FILE
In this case, the second rsync command can execute faster because it
only needs to transfer the small change and not the whole file. And if
tomorrow someone changes the $REMOTE_FILE, and the day after tomorrow,
you repeat those three commands, and if you have kept the $LOCAL_FILE,
then even the first rsync command in that sequence may run faster, for
it too only needs to transfer the changes.
The more interesting question is how does this interact with Tramp?
That is the question I was trying to evade (if indeed it was me who
wrote this). I *believe* that it works like this:
* When you use C-x C-f to open a remote file, then Tramp will fetch
the file contents to a temporary local file, and it will use a new
local file name every time. This means that there is no local
file, and thus rsync cannot play out its advantage.
* When you use C-x C-s to save a remote file, then it may happen
that Tramp writes to a new temporary remote file first, then
renames the remote temp file to the real name, but it may also
happen that Tramp writes directly to the existing remote file. In
that latter case, rsync can play out its advantage.
o Perhaps backup-by-copying and friends come into play here.
o If backup-by-copying is false, then saving a file foo means
to rename foo to its backup, foo~, then to write a new file
foo. In this case, there is no advantage.
o If backup-by-copying is true, then saving a file foo means
to copy foo to foo~, then overwrite the original file foo
with new contents. rsync speedup, here I come!
It's sad, really, I think. Only saving a file can take advantage of the
speedup, and only if some variables are set correctly. We could speed
up C-x C-f sometimes if Tramp were to keep a local cache of remote
files. Then we could use the cache to "prime" the transfer (by copying
the cached file to the temporary file, then using rsync to update that
temporary file). I think this should be doable within the Emacs framework.
We could speed up C-x C-s if we could hook into the saving procedure,
and after renaming foo to its backup foo~, we would then copy foo~ back
to foo before using rsync to update its content from the local copy. I
am afraid this might not be doable within the Emacs framework.
I wonder if this is worth the effort or not. This would only help
people who use Tramp to edit large remote files on a routinely basis.
Tramp is somewhat optimized for the small-files case (by its inline
transfer methods, which are required for multiple hops (unless Michael
changed this)).
Kai
_______________________________________________
Tramp-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/tramp-devel