Webapp needs a simple speed control knob, especially to avoid saturating bandwidth on uploads.
We have basic throttling support in git-annex for rsync,
but none for any special remotes. A good first step would be to expose
this in the webapp, and ensure that git-annex-shell
also honors it when
sending/receiving data.
We actually need two speed controls, one for upload and one for download.
It is probably not necessary to throttle git push/pull operations, as the data transfers tend to be small. Only throttling file transfers is essential.
possibility: trickle
Since git-annex transferkeys
is a separate process, one easy option would
be to run it inside trickle
. If the user changes the bandwidth limits,
it could kill the transfer and restart it with different trickle options.
Problem: Not all special remotes support resuming transfers, so this is suboptimal. (So too are the pause/resume buttons, when using those remotes!)
trickle
is available for OSX as well as Linux and BSDs.
http://hints.macworld.com/comment.php?mode=view&cid=65362
http://mac.softpedia.com/get/Network-Admin/Trickle.shtml
It is probably not easily available for Android, as it uses LD_PRELOAD
.
possibility: built in IO limiting
A cleaner method would be to do the limiting inside git-annex. We already have metered file IO. It should be possible to make the meter not only report on the transfer speed, but detect when it's going too fast, and delay. This will delay the file streaming through the special remote's transfer code, so should work for a variety of special remotes. (Not for rsync or bup or git-annex-shell though, so those need to be handled separately.)
Should work well for uploads at least. I don't know how well it would work for throttling downloads; the sender may just keep sending data and the data buffer before it gets to the IO meter. Maybe once the buffers fill the OS would have the TCP throttled down. Needs investigation; trickle claims to throttle downloads.
communications channels
There would need to be a communication channel for the assistant to tell
git annex transferkeys
when the rate limit has changed. It could for
example send it a SIGUSR1, and then leave it up to the process to reload
the git config. Inside the IO meter, we could have an MVar that contains
the current throttle value, so the IO meter could check it each time it's
called and adjust its throttling appropriately.
Ideally, the assistant could also communicate in the same way with
git-annex-shell
to tell it when the limit has changed. Since
git-annex-shell
uses rsync, it would need to abort the transfer, and rely
on the other side retrying to start it up with the new limit.