-
Type:
Sub-task
-
Status: Resolved
-
Priority:
Normal
-
Resolution: Fixed
-
Fix Version/s: 4.0, 4.0-alpha4
-
Component/s: Local/Compaction
-
Labels:None
-
Change Category:Performance
-
Complexity:Normal
-
Platform:All
-
Impacts:None
-
Source Control Link:
-
Test and Documentation Plan:
Allocations of BTree iterators contribute a lot amount of garbage to the compaction and read paths.
This patch removes most btree iterator allocations on hot paths by:
• using Row#apply where appropriate on frequently called methods (Row#digest, Row#validateData
• adding BTree accumulate method. Like the apply method, this method walks the btree with a function that takes and returns a long argument, this eliminates iterator allocations without adding helper object allocations (BTreeRow#hasComplex, BTreeRow#hasInvalidDeletions, BTreeRow#dataSize, BTreeRow#unsharedHeapSizeExcludingData, Rows#collectStats, UnfilteredSerializer#serializedRowBodySize) as well as eliminating the allocation of helper objects in places where apply was used previously^[1]^.
• Create map of columns in SerializationHeader, this lets us avoid allocating a btree search iterator for each row we serialize.
These optimizations reduce garbage created during compaction by up to 13.5%
[1] the memory test does measure memory allocated by lambdas capturing objects