/!\ This page is primarily intended for Mercurial's developers.

2.9 Sprint Obsolete Markers Notes

Notes from the 2.9 development sprint pertaining to obsolete markers.

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:




hash tree




time bucket


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:

  1. We can't push isolated kills

3. Proposed Exchange Algorithms

  1. 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):
    1. markers that apply to changesets being exchanged
    2. kill markers for ctx in common post-exchange
  2. We push [$NODE:↓:killed(heads(descendents($NODE)))]

2.9sprintObsoleteNotes (last edited 2013-11-20 17:57:44 by Sean Farley)