summaryrefslogtreecommitdiff
path: root/Assistant/Threads
Commit message (Collapse)AuthorAge
* Merge branch 'master' into xmppGravatar Joey Hess2012-10-26
|\ | | | | | | | | | | Conflicts: Assistant/Threads/MountWatcher.hs Assistant/Threads/NetWatcher.hs
| * improved dbus error handlingGravatar Joey Hess2012-10-26
| | | | | | | | | | | | | | Now when the dbus connection is dropped, it'll fall back to polling. I could make it try to reconnect, but there's a FD leak in the dbus library, so not yet.
* | convert the assistant to use a bound thread for XMPPGravatar Joey Hess2012-10-25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This *may* solve the segfault I was seeing when the XMPP library called startTLS. My hypothesis is as follows: * TLS is documented (http://www.gnu.org/software/gnutls/manual/gnutls.html#Thread-safety) thread safe, but only when a single thread accesses it. * forkIO threads are not bound to an OS thread, so it was possible for the threaded runtime to run part of the XMPP code on one thread, and then switch to another thread later. So, forkOS, with its bound threads, should be used for the XMPP thread. Since the crash doesn't happen reliably, I am not yet sure about this fix. Note that I kept all the other threads in the assistant unbound, because bound threads have significantly higher overhead.
* | only use one push attributeGravatar Joey Hess2012-10-25
| | | | | | | | | | When pushing to multiple UUIDs, combine them all into a single push attribute.
* | switch from presence toggle hack to git-annex tag in presence extended contentGravatar Joey Hess2012-10-25
| | | | | | | | Push notifications are actually working over XMPP now!
* | add a separate field for the JIDGravatar Joey Hess2012-10-24
| |
* | flip availablilityGravatar Joey Hess2012-10-24
| | | | | | | | | | | | | | | | | | Seems presence notifications are not sent to clients that have marked themselves unavailable. (Testing with google talk.) This is the death knell for the presence hack, because it has to stay available, and even the toggle to unavailable and back could cause it to miss a notification. Still, flipped it so it basically works, for now.
* | pull from one of the remotes in a push notificationGravatar Joey Hess2012-10-24
| | | | | | | | | | Still need to do something about transfer queueing, however. This could be a real can of worms.
* | initial implementation of XMPP push notifier (untested)Gravatar Joey Hess2012-10-24
| | | | | | | | | | | | | | Lacking error handling, reconnection, credentials configuration, and doesn't actually do anything when it receives an incoming notification. Other than that, it might work! :)
* | added push notifier thread, currently a no-opGravatar Joey Hess2012-10-24
|/ | | | | | | | | | | Hooked up everything that needs to notify on pushes. Note that syncNewRemote does not notify. This is probably ok, and I'd need to thread more state through to make it do so. This is only set up to support a single push notification method; I didn't use a NotificationBroadcaster. Partly because I don't yet know what info about pushes needs to be communicated, so my data types are only preliminary.
* push out config changesGravatar Joey Hess2012-10-21
|
* !! removalGravatar Joey Hess2012-10-21
|
* add ConfigMonitor threadGravatar Joey Hess2012-10-20
| | | | | | | | | | | | | | | | | | | | Monitors git-annex branch for changes, which are noticed by the Merger thread whenever the branch ref is changed (either due to an incoming push, or a local change), and refreshes cached config values for modified config files. Rate limited to run no more often than once per minute. This is important because frequent git-annex branch changes happen when files are being added, or transferred, etc. A primary use case is that, when preferred content changes are made, and get pushed to remotes, the remotes start honoring those settings. Other use cases include propigating repository description and trust changes to remotes, and learning when a remote has added a new special remote, so the webapp can present the GUI to enable that special remote locally. Also added a uuid.log cache. All other config files already had caches.
* nasty race workaroundGravatar Joey Hess2012-10-19
|
* check preferred content when a file is moved or createdGravatar Joey Hess2012-10-19
| | | | | | | | | This can result in the file being dropped, or being downloaded, or even being dropped from some other repo. It's even possible to create a file in a directory where content is not wanted, which will make the assistant immediately send it elsewhere, and then drop it.
* check and drop after uploadsGravatar Joey Hess2012-10-18
|
* check and drop unwanted content from remotes after receiving a transferGravatar Joey Hess2012-10-18
|
* splitGravatar Joey Hess2012-10-18
|
* drop unwanted content in the transfer scanGravatar Joey Hess2012-10-18
| | | | | | | | This was complicated quite a bit by needing to check numcopies. I optimised that, so it only looks up numcopies once per file, no matter how many remotes it checks to drop from. Although it did just occur to me that it might be better to first check if it wants to drop content, and only then check numcopies..
* minor transfer scanner code reworkingGravatar Joey Hess2012-10-18
| | | | Also a small optimisation using a Set
* import S3 only when enabledGravatar Nicolas Pouillard2012-10-18
|
* fix display of transfers for remotes not in syncRemotes listGravatar Joey Hess2012-10-14
|
* better variable nameGravatar Joey Hess2012-10-14
|
* avoid queuing transfers for remotes after syncing to them is pausedGravatar Joey Hess2012-10-14
| | | | | | | | | | | | | This avoids the expensive transfer scan relying on its list of remotes to scan being accurate throughout, which it will not be when the user pauses syncing to a remote. I feel it's ok to queue transfers to *any* known remote, not just the ones being scanned. Note that there are still small races where after syncing to a remote is paused, a transfer can be queued for it. Not just in the expensive transfer scan, but in the cheap failed transfer scan, and elsewhere.
* use gitRepoGravatar Joey Hess2012-10-12
|
* avoid pairlistener crashGravatar Joey Hess2012-10-10
| | | | | | | | | | | I noticed this while offline (so that lack of solar power is good for something). Apparently it tries to bind multicast to lo, and that fails. If this happens, catch it, and retry until a real network interface becomes available. It may be that this should tie into the NetWatcher, and rebind whenever an interface comes up. Needs testing..
* add "configure" link to each repository in the webapp's repo listGravatar Joey Hess2012-10-09
|
* revert bad changeGravatar Joey Hess2012-10-09
|
* assistant: Now honors preferred content settings when deciding what to transfer.Gravatar Joey Hess2012-10-09
| | | | | | | | | Both when queueing downloads, and uploads, consults the preferred content settings. I didn't make it check yet when requeing failed transfers or queuing deferred downloads; dealing with the preferred content settings (or indeed, other settings) changing while the assistant is running still needs work.
* fix last zombies in the assistantGravatar Joey Hess2012-10-04
| | | | | Made Git.LsFiles return cleanup actions, and everything waits on processes now, except of course for Seek.
* avoid crashing committer if it fails to stage changesGravatar Joey Hess2012-10-02
| | | | Just retry later.
* always check with ls-files before adding new filesGravatar Joey Hess2012-10-02
| | | | | | | | | | | | | | | | | | | | | | | Makes it safe to use git annex unlock with the watcher/assistant. And also to mix use of the watcher/assistant with regular files stored in git. Long ago, I had avoided doing this check, except during the startup scan, because it would be slow to run ls-files repeatedly. But then I added the lsof check, and to make that fast, got it to detect batch file adds. So let's move the ls-files check to also occur when it'll have a batch, and can check them all with one call. This does slow down adding a single file by just a bit, but really only a little bit. (The lsof check is probably more expensive.) It also speeds up the startup scan, especially when there are lots of new files found by the scan. Also, fixed the sleep for annex.delayadd to not run while the threadstate lock is held, so it doesn't unnecessarily freeze everything else. Also, --force no longer makes it skip the lsof check, which was not documented, and seems never a good idea.
* avoid some warnings when built w/o dbusGravatar Joey Hess2012-09-29
|
* close unreproducible bug and remove expensive code added to debug itGravatar Joey Hess2012-09-28
|
* add a configurator for S3Gravatar Joey Hess2012-09-26
|
* quiet calls to transferkeyGravatar Joey Hess2012-09-24
|
* don't queue uploads for failed downloadsGravatar Joey Hess2012-09-24
|
* default annex.delayadd to 1 on OSXGravatar Joey Hess2012-09-21
|
* watch for changes to transfer info files, to update progress bars on uploadGravatar Joey Hess2012-09-20
| | | | | | | | | | | | | | This is handled differently for inotify, which can track modifications of existing files, and kqueue, which cannot (TTBOMK). On the inotify side, the TransferWatcher just waits for the file to be updated and reads the new bytesComplete. On the kqueue side, the TransferPoller has to re-read the file every update (currently 0.5 seconds, might need to increase that). I did think about working around kqueue's limitations by somehow creating a new file each time the size changed. But cleaning up all the files that would result seemed difficult. And really, this is not a lot worse than the TransferWatcher's behavior for downloads, which stats a file every 0.5 seconds. As long as the OS has decent file caching behavior..
* upload progress bar for git remote on same filesystemGravatar Joey Hess2012-09-20
| | | | | | | cp is used here, but we can just watch the size of the destination file This commit made from within the ruins of an old mill, overlooking a beautiful waterfall.
* add annex.delayadd configurationGravatar Joey Hess2012-09-19
|
* support old versions of git that do not have --allow-empty-messageGravatar Joey Hess2012-09-19
|
* add missing --no-verify to prevent the pre-commit hook's git annex fixGravatar Joey Hess2012-09-19
|
* make other repositories list list all autostarted reposGravatar Joey Hess2012-09-18
| | | | And add a form to add another, unrelated repository
* avoid making empty commitsGravatar Joey Hess2012-09-18
| | | | | | | | | | | This doesn't avoid it sometimes attempting to commit when there are no changes. Typically that happens when a change is pushed in from another repo; the watcher sees the file and tries to stage it, resulting in an empty commit. Really fixing that would probably use more CPU than occasionally trying to make an empty commit. However, this does save a lot of unnecessary work, as those empty commits had to be synced out, which no longer happens.
* avoid sending uploads right back to where the download came fromGravatar Joey Hess2012-09-18
| | | | Just an optimisation.
* when a Download finishes, queue UploadsGravatar Joey Hess2012-09-18
| | | | | | | | | | | | | | | | | | | This ensures file propigate takes place in situations such as: Usb drive A is connected to B. A's master branch is already in sync with B, but it is being used to sneakernet some files around, so B downloads those. There is no master branch change, so C does not request these files. B needs to upload the files it just downloaded on to C, etc. My first try at this, I saw loops happen. B uploaded to C, which then tried to upload back to B (because it had not received the updated git-annex branch from B yet). B already had the file, but it still created a transfer info file from the incoming transfer, and its watcher saw that be removed, and tried to upload back to C. These loops should have been fixed by my previous commit. (They never affected ssh remotes, only local ones, it seemed.) While C might still try to upload to B, or to some other remote that already has the file, the extra work dies out there.
* run current branch merge in annex monadGravatar Joey Hess2012-09-17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I was seeing some interesting crashes after the previous commit, when making file changes slightly faster than the assistant could keep up. error: Ref refs/heads/master is at 7074f8e0a11110c532d06746e334f2fec6af6ab4 but expected 95ea86008d72a40d97a81cfc8fb47a0da92166bd fatal: cannot lock HEAD ref Committer crashed: git commit [Param "--allow-empty-message",Param "-m",Param "",Param "--allow-empty",Param "--quiet"] failed Pusher crashed: thread blocked indefinitely in an STM transaction Clearly the the merger ended up running at the same time as the committer, and with both modifying HEAD the committer crashed. I fixed that by making the Merger run its merge inside the annex monad, which avoids it running concurrently with other git operations. Also by making the committer not crash if git fails. What I don't understand is why the pusher then crashed with a STM deadlock. That must be in either the DaemonStatusHandle or the FailedPushMap, and the latter is only used by the pusher. Did the committer's crash somehow break STM? The BlockedIndefinitelyOnSTM exception is described as: -- |The thread is waiting to retry an STM transaction, but there are no -- other references to any @TVar@s involved, so it can't ever continue. If the Committer had a reference to a TVar and crashed, I can sort of see this leading to that exception.. The crash was quite easy to reproduce after the previous commit, but after making the above change, I have yet to see it again. Here's hoping.
* deferred downloadsGravatar Joey Hess2012-09-17
| | | | | | | | | | | | | Now when a download is queued and there's no known remote to get it from, it's added to a deferred download list, which will be retried later. The Merger thread tries to queue any deferred downloads when it receives a push to the git-annex branch. Note that the Merger thread now also forces an update of the git-annex branch. The assistant was not updating this branch before, and it saw a (mostly) correct view of state, but now that incoming pushes go to synced/git-annex, it needs to be merged in.
* cleanupGravatar Joey Hess2012-09-17
|