Note:
This page is primarily intended for developers of Mercurial.
2.9 Sprint Obsolete Markers Notes
Notes from the 2.9 development sprint pertaining to obsolete markers.
Contents
1. Cycles
A'' and A' both mark A obsolete, so you have a divergence. If Alice and Bob handle that case separately, Alice may pick A'' (by adding an obsolete marker for A'' -> A') and Bob may pick A' (by adding a marker for A' -> A''), thus introducing a direct cycle between A'' and A'.
2. Exchange
Possible solutions for exchange, given we know the set of markers that should be on the destination:
Solution |
sufficient |
partial |
hash tree |
|
|
boxed |
almost |
|
rsync |
|
|
time bucket |
|
no? |
sufficient = does the solution transmit everything MUST send - that is, the meta-history on both sides might mismatch, but the changeset history is correct on both sides
partial = can the solution transmit less than all the markers that have ever existed intelligently
box is "almost" sufficient for two reasons:
- We can't push isolated kills
- That is, if C is already on the server in draft phase, we can't push the kill marker for C with boxpush as it's currently defined.
- You can't handle a marker appearing after a push. That is
3. Proposed Exchange Algorithms
- Push will inspect incoming draft-phase heads from the server. If any are dead locally, we push their kill marker to the server. We would exchange (pull or push):
- markers that apply to changesets being exchanged
- kill markers for ctx in common post-exchange
We push [$NODE:↓:killed(heads(descendents($NODE)))]