Repository navigation
fix(node): re-balance new tip after srotate promotees - #157
Open
IMGillusion wants to merge 1 commit into
Open
IMGillusion wants to merge 1 commit into
IMGillusion wants to merge 1 commit into
Conversation
Bulk construction (IntervalTree(ivs) / from_tuples) could leave the
root with a balance of +-2 because srotate() only refreshed the
balance of the new tip after its promotees step. When that step
promotes enough intervals out of the light child to prune it
entirely, the tip is left unbalanced and verify() fails:
AssertionError: Error: Rotation should have happened, but
didn't!
Re-balance the returned tip instead of merely refreshing it. This
is a no-op when the tip is already balanced, and corrects the
balance when the promotees step disturbed it.
Fixes chaimleib#135
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Building a tree from a bulk list (
IntervalTree(ivs)/from_tuples) could leave the root with a balance of +-2,failing
verify():Root cause --
srotate()ends withsave.refresh_balance().The
promoteesstep that runs just before it moves intervals out ofthe light child and, as a side effect of
remove(), can prune thatchild entirely. Once the light child is gone the new tip (
save) isleft with a balance of +-2, but it is only refreshed, never
re-balanced.
Fix -- re-balance the returned tip with
save.rotate()instead ofsave.refresh_balance().rotate()is a no-op when the tip is alreadybalanced (the common case), and corrects the balance when the promotees
step disturbed it. One-line change.
Verification
test/issues/issue135_test.py(RED before, GREEN after)verify()always passes, no data lossFixes #135