diff options
author | Joey Hess <joey@kitenet.net> | 2011-12-11 16:41:56 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2011-12-11 16:41:56 -0400 |
commit | 81f311103d99ec5bfd31ae5a76d6add05ff40121 (patch) | |
tree | a26d15035c1ea9bedf4d89f990425e947af1f162 /doc | |
parent | 0236bb020b7b055676b06d1cdf582746864f3d78 (diff) |
a new bug report to track a race
Diffstat (limited to 'doc')
-rw-r--r-- | doc/bugs/git-annex_branch_push_race.mdwn | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/doc/bugs/git-annex_branch_push_race.mdwn b/doc/bugs/git-annex_branch_push_race.mdwn new file mode 100644 index 000000000..257c477bf --- /dev/null +++ b/doc/bugs/git-annex_branch_push_race.mdwn @@ -0,0 +1,43 @@ +The fix for the [[git-annex_branch_corruption]] bug is subject to a race. +With that fix, git-annex does this when committing a change to the branch: + +1. lock the journal file (this avoids git-annex racing itself, FWIW) +2. check what the head of the branch points to, to see if a newer branch + has appeared +3. if so, updates the index file from the branch +4. stages changes in the index +5. commits to the branch using the index file + +If a push to the branch comes in during 2-5, then +[[git-annex_branch_corruption]] could still occur. + +--- + +## approach 1, using locking + +Add an update hook and a post-update hook. The update hook +will use locking to ensure that no git-annex is currently running +a commit, and block any git-annex's from starting one. It +will background itself, and remain running during the push. +The post-update hook will signal it to exit. + +I don't like this approach much, since it involves a daemon, two hooks, +and lots of things to go wrong. And it blocks using git-annex during a +push. This approach should be a last resort. + +## approach 2, lockless method + +After a commit is made to the branch, check to see if the parent of +the commit is the same ref that the index file was last updated to. If it's +not, then the race occurred. + +How to recover from the race? Well, just union merging the parent of the +commit into the index file and re-committing should work, I think. When +the race occurs, the commit reverts its parent's changes, and this will +redo them. + +(Of course, this re-commit will also be subject to the race, and +will need the same check for the race as the other commits. It won't loop +forever, I hope.) + +--[[Joey]] |