sync: Pushes the git-annex branch to remote/synced/git-annex, rather than directly to remote/git-annex.
This fixes a problem I was seeing in the assistant where two remotes would attempt to sync with one another at the same time, and both failed pushing the diverged git-annex branch. Then when both tried to resolve the failed push, they each modified their git-annex branch, which again each blocked the other from pushing into it. The result was that the git-annex branches were perpetually diverged (despite having the same content!) and once the assistant fell into this trap, it couldn't get out and always had to do the slow push/fail/pull/merge/push/fail cycle.
This commit is contained in:
parent
e61512f42d
commit
601ee470af
4 changed files with 42 additions and 9 deletions
|
@ -154,15 +154,15 @@ pushRemote remote branch = go =<< needpush
|
||||||
pushBranch :: Remote -> Git.Ref -> Git.Repo -> IO Bool
|
pushBranch :: Remote -> Git.Ref -> Git.Repo -> IO Bool
|
||||||
pushBranch remote branch g =
|
pushBranch remote branch g =
|
||||||
Git.Command.runBool "push"
|
Git.Command.runBool "push"
|
||||||
[ Param (Remote.name remote)
|
[ Param $ Remote.name remote
|
||||||
, Param (show Annex.Branch.name)
|
, Param $ refspec Annex.Branch.name
|
||||||
, Param refspec
|
, Param $ refspec branch
|
||||||
] g
|
] g
|
||||||
where
|
where
|
||||||
refspec = concat
|
refspec b = concat
|
||||||
[ show $ Git.Ref.base branch
|
[ show $ Git.Ref.base b
|
||||||
, ":"
|
, ":"
|
||||||
, show $ Git.Ref.base $ syncBranch branch
|
, show $ Git.Ref.base $ syncBranch b
|
||||||
]
|
]
|
||||||
|
|
||||||
mergeAnnex :: CommandStart
|
mergeAnnex :: CommandStart
|
||||||
|
|
2
debian/changelog
vendored
2
debian/changelog
vendored
|
@ -22,6 +22,8 @@ git-annex (3.20120826) UNRELEASED; urgency=low
|
||||||
rather than moving to .git/annex/bad/
|
rather than moving to .git/annex/bad/
|
||||||
* Avoid crashing on encoding errors in filenames when writing transfer info
|
* Avoid crashing on encoding errors in filenames when writing transfer info
|
||||||
files and reading from checksum commands.
|
files and reading from checksum commands.
|
||||||
|
* sync: Pushes the git-annex branch to remote/synced/git-annex, rather
|
||||||
|
than directly to remote/git-annex.
|
||||||
|
|
||||||
-- Joey Hess <joeyh@debian.org> Mon, 27 Aug 2012 13:27:39 -0400
|
-- Joey Hess <joeyh@debian.org> Mon, 27 Aug 2012 13:27:39 -0400
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,37 @@ all the other git clones, at both the git level and the key/value level.
|
||||||
(in a fresh clone each time) several times in a row, but then stops happening,
|
(in a fresh clone each time) several times in a row, but then stops happening,
|
||||||
which has prevented me from debugging it.
|
which has prevented me from debugging it.
|
||||||
This could possibly have been caused by the bug fixed in 750c4ac6c282d14d19f79e0711f858367da145e4.
|
This could possibly have been caused by the bug fixed in 750c4ac6c282d14d19f79e0711f858367da145e4.
|
||||||
* The git repository syncing sometimes fails due to the remote having updated.
|
|
||||||
While syncing retries, this sometimes doesn't work.
|
* The transfer code doesn't always manage to transfer file contents.
|
||||||
|
|
||||||
|
Besides reconnection events, there are two places where transfers get queued:
|
||||||
|
|
||||||
|
1. When the committer commits a file, it queues uploads.
|
||||||
|
2. When the watcher sees a broken symlink be created, it queues downloads.
|
||||||
|
|
||||||
|
Consider a doubly-linked chain of three repositories, A B and C.
|
||||||
|
(C and A do not directly communicate.)
|
||||||
|
|
||||||
|
* File is added to A.
|
||||||
|
* A uploads its content to B.
|
||||||
|
* At the same time, A git syncs to B.
|
||||||
|
* Once B gets the git sync, it git syncs to C.
|
||||||
|
* When C's watcher sees the file appear, it tries to download it. But if
|
||||||
|
B had not finished receiving the file from A, C doesn't know B has it,
|
||||||
|
and cannot download it from anywhere.
|
||||||
|
|
||||||
|
Possible solution: After B receives content, it could queue uploads of it
|
||||||
|
to all remotes that it doesn't know have it yet, which would include C.
|
||||||
|
|
||||||
|
In practice, this has the problem that when C receives the content,
|
||||||
|
it will queue uploads of it, which can send back to B (or to some other repo
|
||||||
|
that already has the content) and loop, until the git-annex branches catch
|
||||||
|
up and break the cycle.
|
||||||
|
|
||||||
|
Possible solution: C could record a download intent. (Similar to a failed
|
||||||
|
download, but with an unknown source.) When C next receives a git-annex
|
||||||
|
branch push, it could try to requeue downloads that it has such intents
|
||||||
|
registered for.
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
|
|
|
@ -5,4 +5,6 @@ that then has to be auto-resolved.
|
||||||
This seems similar to the laddering problem described in this old bug:
|
This seems similar to the laddering problem described in this old bug:
|
||||||
[[bugs/making_annex-merge_try_a_fast-forward]]
|
[[bugs/making_annex-merge_try_a_fast-forward]]
|
||||||
|
|
||||||
--[[Joey]]
|
--[[Joey]]
|
||||||
|
|
||||||
|
Think I've fixed this. [[done]] --[[Joey]]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue