Class ShardedSkipListMemtable

  • All Implemented Interfaces:
    java.lang.Comparable<Memtable>, Memtable, UnfilteredSource

    public class ShardedSkipListMemtable
    extends AbstractShardedMemtable
    A proof-of-concept sharded memtable implementation. This implementation splits the partition skip-list into several independent skip-lists each covering a roughly equal part of the token space served by this node. This reduces congestion of the skip-list from concurrent writes and can lead to improved write throughput. The implementation takes two parameters: - shards: the number of shards to split into. - serialize_writes: if false, each shard may serve multiple writes in parallel; if true, writes to each shard are synchronized. Also see Memtable_API.md.
    • Method Detail

      • isClean

        public boolean isClean()
        Description copied from interface: Memtable
        True if the memtable contains no data
      • put

        public long put​(PartitionUpdate update,
                        UpdateTransaction indexer,
                        OpOrder.Group opGroup)
        Should only be called by ColumnFamilyStore.apply via Keyspace.apply, which supplies the appropriate OpOrdering. commitLogSegmentPosition should only be null if this is a secondary index, in which case it is *expected* to be null
        Parameters:
        update - the partition update, may be a new partition or an update to an existing one
        indexer - receives information about the update's effect
        opGroup - write operation group, used to permit the operation to complete if it is needed to complete a flush to free space.
        Returns:
        the smallest timestamp delta between corresponding rows from existing and update. A timestamp delta being computed as the difference between the cells and DeletionTimes from any existing partition and those in update. See CASSANDRA-7979.
      • getLiveDataSize

        public long getLiveDataSize()
        Technically we should scatter gather on all the core threads because the size in following calls are not using volatile variables, but for metrics purpose this should be good enough.
      • partitionCount

        public long partitionCount()
        Description copied from interface: Memtable
        Number of partitions stored in the memtable
      • getMinTimestamp

        public long getMinTimestamp()
        Returns the minTS if one available, otherwise NO_MIN_TIMESTAMP. EncodingStats uses a synthetic epoch TS at 2015. We don't want to leak that (CASSANDRA-18118) so we return NO_MIN_TIMESTAMP instead.
        Specified by:
        getMinTimestamp in interface UnfilteredSource
        Overrides:
        getMinTimestamp in class AbstractMemtable
        Returns:
        The minTS or NO_MIN_TIMESTAMP if none available
      • rowIterator

        public UnfilteredRowIterator rowIterator​(DecoratedKey key,
                                                 Slices slices,
                                                 ColumnFilter selectedColumns,
                                                 boolean reversed,
                                                 SSTableReadsListener listener)
        Description copied from interface: UnfilteredSource
        Returns a row iterator for the given partition, applying the specified row and column filters.
        Parameters:
        key - the partition key
        slices - the row ranges to return
        selectedColumns - filter to apply to all returned partitions
        reversed - true if the content should be returned in reverse order
        listener - a listener used to handle internal read events
      • factory

        public static org.apache.cassandra.db.memtable.ShardedSkipListMemtable.Factory factory​(java.util.Map<java.lang.String,​java.lang.String> optionsCopy)