-
Notifications
You must be signed in to change notification settings - Fork 21
CNDB-10302: Tombstone-capable trie memtable #2005
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
e358a60 to
6914cba
Compare
This also changes the behaviour of subtries to always include boundaries, their prefixes and their descendant branches. This is necessary for well-defined reverse walks and helps present metadata on the path of queried ranges, and is not a real limitation for the prefix-free keys that we use.
Range tries are tries made of ranges of coverage, which track applicable ranges and are mainly to be used to store deletions and deletion ranges.
Deletion-aware tries combine data and deletion tries. The cursor of a deletion-aware trie walks the data part of the trie, but also provides a `deletionBranchCursor` that can return a deletion/ tombstone branch covering the current position and the branch below it as a range trie. Such a branch can be given only once for any path in the trie (i.e. there cannot be a deletion branch covering another deletion branch). Deletion-aware merges and updates to in-memory tries take deletion branches into account when merging data so that deleted data is not produced in the resulting merge.
Implements a row-level trie memtable that uses deletion-aware tries to store deletions separately from live data, together with the associated TrieBackedPartition and TriePartitionUpdate. Every deletion is first converted to its range version (e.g. deleted rows are now represented as a WHERE ck <= x AND ck >= x, deleted partitions -- as deletions covering from LT_EXCLUDED to GT_NEXT_COMPONENT to include static and all normal rows) and then stored in the deletion path of the trie. To make tests work, all such ranges are converted back to rows and partition deletion times on conversion to UnfiteredPartitionIterator.
Adds a new method to UnfilteredRowIterator that is implemented by the new trie-backed partitions to ask them to stop issuing tombstones. This is done on filtering (i.e. conversion from UnfilteredRowIterator to RowIterator) where tombstones have already done their job and are no longer needed. Adds JMH tests of tombstones that demonstrate the improvement.
In the initial implementation row deletions were mapped to range tombstones, which works but isn't compatible with the multitude of tests, which require deletions to be returned in the form they were made. This commit changes the representation of deleted rows to use point tombstones. In addition to making the tests pass, this improves the memory usage of memtables with row deletions. Although they only add complexity at this stage, point tombstones (expanded to apply to the covered branch) will be needed in the next stage of development.
|
|
Some benchmark results demonstrating the effect: In the table above, the first 99.7% of all rows in each partition are deleted with one of the following operations: and then a An example with hundreds of thousands of tombstones per read partition: (this throws Here is the table of the build time and memory usage: Unlike the previous memtables, the new implementation will delete data from the trie when it receives a range tombstone, resulting in some cases in longer build time but lower memory usage. Full benchmark run to be posted soon. |
test/unit/org/apache/cassandra/db/tries/DeletionAwareTestBase.java
Outdated
Show resolved
Hide resolved
test/unit/org/apache/cassandra/db/tries/DeletionBranchConsistencyTest.java
Outdated
Show resolved
Hide resolved
test/unit/org/apache/cassandra/db/tries/InMemoryDeletionAwareTrieConsistencyTest.java
Outdated
Show resolved
Hide resolved
test/unit/org/apache/cassandra/db/tries/InMemoryDeletionAwareTrieThreadedTest.java
Outdated
Show resolved
Hide resolved
test/unit/org/apache/cassandra/db/tries/DeletionAwareRandomizedTest.java
Outdated
Show resolved
Hide resolved
test/unit/org/apache/cassandra/db/tries/DeletionAwareRandomizedTest.java
Outdated
Show resolved
Hide resolved
test/unit/org/apache/cassandra/db/tries/DeletionAwareRandomizedTest.java
Outdated
Show resolved
Hide resolved
test/unit/org/apache/cassandra/db/tries/DeletionAwareRandomizedTest.java
Outdated
Show resolved
Hide resolved
src/java/org/apache/cassandra/db/rows/TrieTombstoneMarkerImpl.java
Outdated
Show resolved
Hide resolved
src/java/org/apache/cassandra/db/rows/TrieTombstoneMarkerImpl.java
Outdated
Show resolved
Hide resolved
test/unit/org/apache/cassandra/db/partition/PartitionImplementationTest.java
Outdated
Show resolved
Hide resolved
|
Impressive work @blambov ! |
… using Range operations
and use it to avoid a couple of intermediate objects in set union
Fix Cursor.skipToWhenAhead for reverse iteration Add Cursor.dumpBranch for debugging Fix various methods to return Preencoded byte-comparables Fix deletion-aware collection merge cursor's reporting of deletion branch at tail points Fix deletion-aware collection merge cursor's failure on one deletion branch
… relevant deletions
|
✔️ Build ds-cassandra-pr-gate/PR-2005 approved by ButlerApproved by Butler |



What is the issue
https://github.com/riptano/cndb/issues/10302
What does this PR fix and why was it fixed
Implements the necessary trie machinery to work with trie sets, range and deletion-aware tries, and a memtable that uses it to store deletions in separate per-partition branches of the memtable trie.
Implements a method of skipping over tombstones when converting
UnfilteredRowIteratorto the filteredRowIterator, which has the effect of ignoring all tombstones when looking for data and speeds up next-live lookups dramatically. Adds a test to demonstrate this effect with the new memtable.The changes are described in further detail with each commit.