Overwrite the orphan list periodically instead of using heuristics #156
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.
The orphan page list has some complicated logic around it so that it is "crash recoverable" to some extent. This logic is showing some flaws that are described in #151 and are reproduced by the new test in this PR.
Rather than trying to fix the logic, this PR changes it completely: pushing new items to the orphan page list now always appends items to the end of it. At commit time, if there's enough room, the orphans are moved to the start of the list, overwriting the reclaimed orphans.
This makes commits more expensive, but guarantees that all orphans are eventually used (as long as snapshots are non-decreasing), and also the amortized cost of adding orphans is still O(1).
TODO
push()
to ensure that snapshots are non-decreasingpush_pop_2
to something betterpop()