[ https://issues.apache.org/jira/browse/CASSANDRA-11206?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15192977#comment-15192977 ]
Robert Stupp commented on CASSANDRA-11206: ------------------------------------------ Quick progress status: * refactored the code to be able to handle "flat byte structures" (i.e. a {{byte[]}} at the moment - as a pre-requisite to directly access the index file) * IndexInfo is only used from {{AbstractSSTableIterator.IndexState}} - an instance to an open index-file is available, so removing the {{byte[]}} and accessing the index file directly is the next step. * unit and dtests are mostly passing (i.e. there are some flakey ones on cassci, which are passing locally). Still need to identify what's going on with the failing paging dtests. * cstar tests show similar results compared to current trunk * IndexInfo is also used from {{UnfilteredRowIteratorWithLowerBound#getPartitionIndexLowerBound}} (CASSANDRA-8180) - not sure whether it's worth to deserialize the index for this functionality, as it is currently restricted to the entries that are present in the key cache. I tend to remove this access. (/cc [~Stefania]) Observations: * accesses to IndexInfo objects are "random" during the binary search operation (as expected) * accesses to IndexInfo objects are "nearly sequential" during scan operations - "nearly" means, it accesses index N, then index N-1, then index N+1 before it actually moves ahead - but does some random accesses to previously accessed IndexInfo instances afterwards. Therefore {{IndexState}} "caches" the already deserialised {{IndexInfo}} objects. These should stay in new-gen as these are only referenced during the lifetime of the actual read. Alternatively it is possible to use a plain & boring LRU like cache for the 10 last IndexInfo objects in IndexState. * index-file writes (flushes/compactions) also used {{IndexInfo}} objects - replaced with a buffered write ({{DataOutputBuffer}}) Assumptions: * heap pressure due to the vast amount of {{IndexInfo}} objects is already handled by this patch (exchanged to one {{byte[]}} at the moment) both for reads and flushes/compactions * after replacing the {{byte[]}} with index file access, we could lower the (default) key-cache size since we then no longer cache {{IndexInfo}} objects on heap So the next step is to remove the {{byte[]}} from {{IndexedEntry}} and replace it with index-file access from {{IndexState}}. > Support large partitions on the 3.0 sstable format > -------------------------------------------------- > > Key: CASSANDRA-11206 > URL: https://issues.apache.org/jira/browse/CASSANDRA-11206 > Project: Cassandra > Issue Type: Improvement > Reporter: Jonathan Ellis > Assignee: Robert Stupp > Fix For: 3.x > > > Cassandra saves a sample of IndexInfo objects that store the offset within > each partition of every 64KB (by default) range of rows. To find a row, we > binary search this sample, then scan the partition of the appropriate range. > The problem is that this scales poorly as partitions grow: on a cache miss, > we deserialize the entire set of IndexInfo, which both creates a lot of GC > overhead (as noted in CASSANDRA-9754) but is also non-negligible i/o activity > (relative to reading a single 64KB row range) as partitions get truly large. > We introduced an "offset map" in CASSANDRA-10314 that allows us to perform > the IndexInfo bsearch while only deserializing IndexInfo that we need to > compare against, i.e. log(N) deserializations. -- This message was sent by Atlassian JIRA (v6.3.4#6332)