aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Git/Merge.hs6
-rw-r--r--doc/design/assistant/blog/day_37__back.mdwn64
-rw-r--r--doc/design/assistant/syncing.mdwn7
-rw-r--r--doc/todo/assistant_threaded_runtime.mdwn3
4 files changed, 78 insertions, 2 deletions
diff --git a/Git/Merge.hs b/Git/Merge.hs
index 08fc6fb48..bad9f8258 100644
--- a/Git/Merge.hs
+++ b/Git/Merge.hs
@@ -10,8 +10,10 @@ module Git.Merge where
import Common
import Git
import Git.Command
+import Git.Version
{- Avoids recent git's interactive merge. -}
mergeNonInteractive :: Ref -> Repo -> IO Bool
-mergeNonInteractive branch = runBool "merge"
- [Param "--no-edit", Param $ show branch]
+mergeNonInteractive branch
+ | older "1.7.7.6" = runBool "merge" [Param $ show branch]
+ | otherwise = runBool "merge" [Param "--no-edit", Param $ show branch]
diff --git a/doc/design/assistant/blog/day_37__back.mdwn b/doc/design/assistant/blog/day_37__back.mdwn
new file mode 100644
index 000000000..7aef0b681
--- /dev/null
+++ b/doc/design/assistant/blog/day_37__back.mdwn
@@ -0,0 +1,64 @@
+Back home and laptop is fixed.. back to work.
+
+Warmup exercises:
+
+* Went in to make it queue transfers when a broken symlink is received,
+ only to find I'd already written code to do that, and forgotten about it.
+ Heh. Did check that the git-annex branch is always sent first,
+ which will ensure that code always knows where to transfer a key from.
+ I had probably not considered this wrinkle when first writing the code;
+ it worked by accident.
+
+* Made the assistant check that a remote is known to have a key before
+ queueing a download from it.
+
+* Fixed a bad interaction between the `git annex map` command and the
+ assistant.
+
+----
+
+Tried using a modified version of `MissingH` that doesn't use `HSLogger`
+to make git-annex work with the threaded GHC runtime. Unfortunatly,
+I am still seeing hangs in at least 3 separate code paths when
+running the test suite. I may have managed to fix one of the hangs,
+but have not grokked what's causing the others.
+
+----
+
+I now have access to a Mac OSX system, thanks to Kevin M. I've fixed
+some portability problems in git-annex with it before, but today I tested
+the assistant on it:
+
+* Found a problem with the kqueue code that prevents incoming pushes from
+ being noticed.
+
+ The problem was that the newly added git ref file does not trigger an add
+ event. The kqueue code saw a generic change event for the refs directory,
+ but since the old file was being deleted and replaced by the new file,
+ the kqueue code, which already had the old file in its cache, did not notice
+ the file had been replaced.
+
+ I fixed that by making the kqueue code also track the inode of each file.
+ Currently that adds the overhead of a stat of each file, which could be
+ avoided if haskell exposed the inode returned by `readdir`. Room to
+ optimise this later...
+
+* Also noticed that the kqueue code was not separating out file deletions
+ from directory deletions. IIRC Jimmy had once mentioned a problem with file
+ deletions not being noticed by the assistant, and this could be responsible
+ for that, although the directory deletion code seems to handle them ok
+ normally. It was making the transfer watching thread not notice when
+ any transfers finished, for sure. I fixed this oversight, looking in the
+ cache to see if there used to be a file or a directory, and running the
+ appropriate hook.
+
+Even with these fixes, the assistant does not yet reliably transfer file
+contents on OSX. I think the problem is that with kqueue we're not
+guaranteed to get an add event, and a deletion event for a transfer
+info file -- if it's created and quickly deleted, the code that
+synthensizes those events doesn't run in time to know it existed.
+Since the transfer code relies on deletion events to tell when transfers
+are complete, it stops sending files after the first transfer, if the
+transfer ran so quickly it doesn't get the expected events.
+
+So, will need to work on OSX support some more...
diff --git a/doc/design/assistant/syncing.mdwn b/doc/design/assistant/syncing.mdwn
index a9f59f496..3fe27d5ac 100644
--- a/doc/design/assistant/syncing.mdwn
+++ b/doc/design/assistant/syncing.mdwn
@@ -10,6 +10,13 @@ all the other git clones, at both the git level and the key/value level.
on remotes, and transfer. But first, need to ensure that when a remote
receives content, and updates its location log, it syncs that update
out.
+* Transfer watching has a race on kqueue systems, which makes finished
+ fast transfers not be noticed by the TransferWatcher. Which in turn
+ prevents the transfer slot being freed and any further transfers
+ from happening. So, this approach is too fragile to rely on for
+ maintaining the TransferSlots. Instead, need [[todo/assistant_threaded_runtime]],
+ which would allow running something for sure when a transfer thread
+ finishes.
## longer-term TODO
diff --git a/doc/todo/assistant_threaded_runtime.mdwn b/doc/todo/assistant_threaded_runtime.mdwn
index 095ffa435..edfa51669 100644
--- a/doc/todo/assistant_threaded_runtime.mdwn
+++ b/doc/todo/assistant_threaded_runtime.mdwn
@@ -20,6 +20,9 @@ The test suite tends to hang when testing add. `git-annex` occasionally
hangs, apparently in a futex lock. This is not the assistant hanging, and
git-annex does not otherwise use threads, so this is surprising. --[[Joey]]
+> I've spent a lot of time debugging this, and trying to fix it, in the
+> "threaded" branch. There are still deadlocks. --[[Joey]]
+
---
It would be possible to not use the threaded runtime. Instead, we could