Update comments in column_family.h (#5347)
Summary: Document relationships of data structures declared in column_family.h Pull Request resolved: https://github.com/facebook/rocksdb/pull/5347 Differential Revision: D15496941 Pulled By: siying fbshipit-source-id: 47b37835abba26aa31a94fabea6b2775483e0ccb
This commit is contained in:
parent
767d1f3ff1
commit
596cc1547a
@ -45,6 +45,112 @@ class InstrumentedMutexLock;
|
|||||||
struct SuperVersionContext;
|
struct SuperVersionContext;
|
||||||
|
|
||||||
extern const double kIncSlowdownRatio;
|
extern const double kIncSlowdownRatio;
|
||||||
|
// This file contains a list of data structures for managing column family
|
||||||
|
// level metadata.
|
||||||
|
//
|
||||||
|
// The basic relationships among classes declared here are illustrated as
|
||||||
|
// following:
|
||||||
|
//
|
||||||
|
// +----------------------+ +----------------------+ +--------+
|
||||||
|
// +---+ ColumnFamilyHandle 1 | +--+ ColumnFamilyHandle 2 | | DBImpl |
|
||||||
|
// | +----------------------+ | +----------------------+ +----+---+
|
||||||
|
// | +--------------------------+ |
|
||||||
|
// | | +-----------------------------+
|
||||||
|
// | | |
|
||||||
|
// | | +-----------------------------v-------------------------------+
|
||||||
|
// | | | |
|
||||||
|
// | | | ColumnFamilySet |
|
||||||
|
// | | | |
|
||||||
|
// | | +-------------+--------------------------+----------------+---+
|
||||||
|
// | | | | |
|
||||||
|
// | +-------------------------------------+ | |
|
||||||
|
// | | | | v
|
||||||
|
// | +-------------v-------------+ +-----v----v---------+
|
||||||
|
// | | | | |
|
||||||
|
// | | ColumnFamilyData 1 | | ColumnFamilyData 2 | ......
|
||||||
|
// | | | | |
|
||||||
|
// +---> | | |
|
||||||
|
// | +---------+ | |
|
||||||
|
// | | MemTable| | |
|
||||||
|
// | | List | | |
|
||||||
|
// +--------+---+--+-+----+----+ +--------------------++
|
||||||
|
// | | | |
|
||||||
|
// | | | |
|
||||||
|
// | | | +-----------------------+
|
||||||
|
// | | +-----------+ |
|
||||||
|
// v +--------+ | |
|
||||||
|
// +--------+--------+ | | |
|
||||||
|
// | | | | +----------v----------+
|
||||||
|
// +---> |SuperVersion 1.a +-----------------> |
|
||||||
|
// | +------+ | | MemTableListVersion |
|
||||||
|
// +---+-------------+ | | | | |
|
||||||
|
// | | | | +----+------------+---+
|
||||||
|
// | current | | | | |
|
||||||
|
// | +-------------+ | |mem | |
|
||||||
|
// | | | | | |
|
||||||
|
// +-v---v-------+ +---v--v---+ +-----v----+ +----v-----+
|
||||||
|
// | | | | | | | |
|
||||||
|
// | Version 1.a | | memtable | | memtable | | memtable |
|
||||||
|
// | | | 1.a | | 1.b | | 1.c |
|
||||||
|
// +-------------+ | | | | | |
|
||||||
|
// +----------+ +----------+ +----------+
|
||||||
|
//
|
||||||
|
// DBImpl keeps a ColumnFamilySet, which references to all column families by
|
||||||
|
// pointing to respective ColumnFamilyData object of each column family.
|
||||||
|
// This is how DBImpl can list and operate on all the column families.
|
||||||
|
// ColumnFamilyHandle also points to ColumnFamilyData directly, so that
|
||||||
|
// when a user executes a query, it can directly find memtables and Version
|
||||||
|
// as well as SuperVersion to the column family, without going through
|
||||||
|
// ColumnFamilySet.
|
||||||
|
//
|
||||||
|
// ColumnFamilySet points to the latest view of the LSM-tree (list of memtables
|
||||||
|
// and SST files) indirectly, while ongoing operations may hold references
|
||||||
|
// to a current or an out-of-date SuperVersion, which in turn points to a
|
||||||
|
// point-in-time view of the LSM-tree. This guarantees the memtables and SST
|
||||||
|
// files being operated on will not go away, until the SuperVersion is
|
||||||
|
// unreferenced to 0 and destoryed.
|
||||||
|
//
|
||||||
|
// The following graph illustrates a possible referencing relationships:
|
||||||
|
//
|
||||||
|
// Column +--------------+ current +-----------+
|
||||||
|
// Family +---->+ +------------------->+ |
|
||||||
|
// Data | SuperVersion +----------+ | Version A |
|
||||||
|
// | 3 | imm | | |
|
||||||
|
// Iter2 +----->+ | +-------v------+ +-----------+
|
||||||
|
// +-----+--------+ | MemtableList +----------------> Empty
|
||||||
|
// | | Version r | +-----------+
|
||||||
|
// | +--------------+ | |
|
||||||
|
// +------------------+ current| Version B |
|
||||||
|
// +--------------+ | +----->+ |
|
||||||
|
// | | | | +-----+-----+
|
||||||
|
// Compaction +>+ SuperVersion +-------------+ ^
|
||||||
|
// Job | 2 +------+ | |current
|
||||||
|
// | +----+ | | mem | +------------+
|
||||||
|
// +--------------+ | | +---------------------> |
|
||||||
|
// | +------------------------> MemTable a |
|
||||||
|
// | mem | | |
|
||||||
|
// +--------------+ | | +------------+
|
||||||
|
// | +--------------------------+
|
||||||
|
// Iter1 +-----> SuperVersion | | +------------+
|
||||||
|
// | 1 +------------------------------>+ |
|
||||||
|
// | +-+ | mem | MemTable b |
|
||||||
|
// +--------------+ | | | |
|
||||||
|
// | | +--------------+ +-----^------+
|
||||||
|
// | |imm | MemtableList | |
|
||||||
|
// | +--->+ Version s +------------+
|
||||||
|
// | +--------------+
|
||||||
|
// | +--------------+
|
||||||
|
// | | MemtableList |
|
||||||
|
// +------>+ Version t +--------> Empty
|
||||||
|
// imm +--------------+
|
||||||
|
//
|
||||||
|
// In this example, even if the current LSM-tree consists of Version A and
|
||||||
|
// memtable a, which is also referenced by SuperVersion, two older SuperVersion
|
||||||
|
// SuperVersion2 and Superversion1 still exist, and are referenced by a
|
||||||
|
// compaction job and an old iterator Iter1, respectively. SuperVersion2
|
||||||
|
// contains Version B, memtable a and memtable b; SuperVersion1 contains
|
||||||
|
// Version B and memtable b (mutable). As a result, Version B and memtable b
|
||||||
|
// are prevented from being destroyed or deleted.
|
||||||
|
|
||||||
// ColumnFamilyHandleImpl is the class that clients use to access different
|
// ColumnFamilyHandleImpl is the class that clients use to access different
|
||||||
// column families. It has non-trivial destructor, which gets called when client
|
// column families. It has non-trivial destructor, which gets called when client
|
||||||
|
Loading…
Reference in New Issue
Block a user