Class SSTable

  • Direct Known Subclasses:
    BigTableZeroCopyWriter, SSTableReader, SSTableWriter

    public abstract class SSTable
    extends java.lang.Object
    This class is built on top of the SequenceFile. It stores data on disk in sorted fashion. However the sorting is upto the application. This class expects keys to be handed to it in sorted order. A separate index file is maintained as well, containing the SSTable keys and the offset into the SSTable at which they are found. Every 1/indexInterval key is read into memory when the SSTable is opened. Finally, a bloom filter file is also kept for the keys in each SSTable.
    • Field Detail

      • TOMBSTONE_HISTOGRAM_BIN_SIZE

        public static final int TOMBSTONE_HISTOGRAM_BIN_SIZE
        See Also:
        Constant Field Values
      • TOMBSTONE_HISTOGRAM_SPOOL_SIZE

        public static final int TOMBSTONE_HISTOGRAM_SPOOL_SIZE
        See Also:
        Constant Field Values
      • TOMBSTONE_HISTOGRAM_TTL_ROUND_SECONDS

        public static final int TOMBSTONE_HISTOGRAM_TTL_ROUND_SECONDS
      • components

        protected final java.util.Set<Component> components
      • compression

        public final boolean compression
    • Method Detail

      • delete

        public static boolean delete​(Descriptor desc,
                                     java.util.Set<Component> components)
        We use a ReferenceQueue to manage deleting files that have been compacted and for which no more SSTable references exist. But this is not guaranteed to run for each such file because of the semantics of the JVM gc. So, we write a marker to `compactedFilename` when a file is compacted; if such a marker exists on startup, the file should be removed. This method will also remove SSTables that are marked as temporary.
        Returns:
        true if the file was deleted
      • decorateKey

        public DecoratedKey decorateKey​(java.nio.ByteBuffer key)
      • getMinimalKey

        public static DecoratedKey getMinimalKey​(DecoratedKey key)
        If the given @param key occupies only part of a larger buffer, allocate a new buffer that is only as large as necessary.
      • getFilename

        public java.lang.String getFilename()
      • getIndexFilename

        public java.lang.String getIndexFilename()
      • getColumnFamilyName

        public java.lang.String getColumnFamilyName()
      • getKeyspaceName

        public java.lang.String getKeyspaceName()
      • getAllFilePaths

        public java.util.List<java.lang.String> getAllFilePaths()
      • tryComponentFromFilename

        public static Pair<Descriptor,​Component> tryComponentFromFilename​(java.io.File file)
        Parse a sstable filename into both a Descriptor and Component object.
        Parameters:
        file - the filename to parse.
        Returns:
        a pair of the Descriptor and Component corresponding to file if it corresponds to a valid and supported sstable filename, null otherwise. Note that components of an unknown type will be returned as CUSTOM ones.
      • tryDescriptorFromFilename

        public static Descriptor tryDescriptorFromFilename​(java.io.File file)
        Parse a sstable filename into a Descriptor object.

        Note that this method ignores the component part of the filename; if this is not what you want, use tryComponentFromFilename(java.io.File) instead.

        Parameters:
        file - the filename to parse.
        Returns:
        the Descriptor corresponding to file if it corresponds to a valid and supported sstable filename, null otherwise.
      • componentsFor

        public static java.util.Set<Component> componentsFor​(Descriptor desc)
        Discovers existing components for the descriptor. Slow: only intended for use outside the critical path.
      • discoverComponentsFor

        public static java.util.Set<Component> discoverComponentsFor​(Descriptor desc)
      • estimateRowsFromIndex

        public static long estimateRowsFromIndex​(RandomAccessReader ifile,
                                                 Descriptor descriptor)
                                          throws java.io.IOException
        Returns:
        An estimate of the number of keys contained in the given index file.
        Throws:
        java.io.IOException
      • bytesOnDisk

        public long bytesOnDisk()
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object
      • readTOC

        protected static java.util.Set<Component> readTOC​(Descriptor descriptor)
                                                   throws java.io.IOException
        Reads the list of components from the TOC component.
        Returns:
        set of components found in the TOC
        Throws:
        java.io.IOException
      • readTOC

        protected static java.util.Set<Component> readTOC​(Descriptor descriptor,
                                                          boolean skipMissing)
                                                   throws java.io.IOException
        Reads the list of components from the TOC component.
        Parameters:
        skipMissing - , skip adding the component to the returned set if the corresponding file is missing.
        Returns:
        set of components found in the TOC
        Throws:
        java.io.IOException
      • appendTOC

        protected static void appendTOC​(Descriptor descriptor,
                                        java.util.Collection<Component> components)
        Appends new component names to the TOC component.
      • addComponents

        public void addComponents​(java.util.Collection<Component> newComponents)
        Registers new custom components. Used by custom compaction strategies. Adding a component for the second time is a no-op. Don't remove this - this method is a part of the public API, intended for use by custom compaction strategies.
        Parameters:
        newComponents - collection of components to be added
      • validateRepairedMetadata

        public static void validateRepairedMetadata​(long repairedAt,
                                                    java.util.UUID pendingRepair,
                                                    boolean isTransient)