Documentation
¶
Index ¶
- Constants
- func ComputeChecksum(data []byte) uint32
- func GenerateRandomString(length int) string
- func GetPayloadForCommit(ops [][]byte) []byte
- func GetPayloadForPut(key []byte, value []byte) []byte
- func GetSegmentIDFromIndexFilePath(filePath string) (uint64, error)
- func GetSegmentIDFromManifestFileName(fileName string) (uint64, error)
- func GetSegmentIDFromSegmentFilePath(filePath string) (uint64, error)
- func GetSparseIndexBytes(segmentID uint64, key []byte, offset int64) []byte
- func GetTempSegmentFileName(segmentId uint64) string
- func GetTempSparseIndexFileName(segmentId uint64) string
- func NewMergingIterator(memtableIter Iterator, segmentIters []Iterator) *mergingIterator
- func NewSegmentIterator(segmentPath string, index sparseIndex) (*segmentIterator, error)
- func PreCreateDirectories(config *KVStoreConfig) error
- func ScanRange(iter Iterator, startKey, endKey []byte, fn func(key, value []byte))
- func SerializeV2(recordType byte, sequenceNum uint64, term uint64, payload []byte) []byte
- func StartRaft(kv *KVStore, config *ApplicationConfig, peers []string) (*raft.Raft, error)
- type ApplicationConfig
- type CompactionPlan
- type Iterator
- type KVRecord
- type KVStore
- func (s *KVStore) AllocateNewSegmentID() uint64
- func (s *KVStore) AllocateSegmentIDUnsafe() uint64
- func (s *KVStore) Apply(logEntry *raft.Log) interface{}
- func (kv *KVStore) BeginTransaction() *Transaction
- func (kv *KVStore) CleanUpDirectories() error
- func (kv *KVStore) Close() error
- func (kv *KVStore) CloseAndCleanUp() error
- func (kv *KVStore) CollectRange(startKey, endKey []byte) ([]KVRecord, error)
- func (kv *KVStore) Delete(key []byte) error
- func (kv *KVStore) Get(key []byte) ([]byte, bool)
- func (s *KVStore) GetCurrentManifestFilePath() (string, error)
- func (s *KVStore) GetCurrentSegmentIDSafe() uint64
- func (s *KVStore) GetCurrentSegmentIDUnsafe() uint64
- func (kv *KVStore) GetLastSequenceNum() uint64
- func (kv *KVStore) NewIterator() Iterator
- func (kv *KVStore) Print()
- func (kv *KVStore) Put(key, value []byte) error
- func (s *KVStore) Restore(snapshot io.ReadCloser) error
- func (kv *KVStore) RollToNewSegment() (uint64, error)
- func (s *KVStore) Snapshot() (raft.FSMSnapshot, error)
- type KVStoreConfig
- func (c *KVStoreConfig) GetBaseDir() string
- func (c *KVStoreConfig) GetCheckpointSize() int64
- func (c *KVStoreConfig) GetMaintenanceIntervalMs() uint64
- func (c *KVStoreConfig) GetMemtableSizeThreshold() int64
- func (c *KVStoreConfig) GetSegmentFileSizeThresholdLX() int64
- func (c *KVStoreConfig) WithBaseDir(dir string) *KVStoreConfig
- func (c *KVStoreConfig) WithCheckpointSize(size int64) *KVStoreConfig
- func (c *KVStoreConfig) WithEnableCheckpoint(enable bool) *KVStoreConfig
- func (c *KVStoreConfig) WithEnableCompaction(enable bool) *KVStoreConfig
- func (c *KVStoreConfig) WithEnableMaintenance(enable bool) *KVStoreConfig
- func (c *KVStoreConfig) WithEnableSyncCheckpoint(enable bool) *KVStoreConfig
- func (c *KVStoreConfig) WithLog() *KVStoreConfig
- func (c *KVStoreConfig) WithMaintenanceIntervalMs(intervalMs uint64) *KVStoreConfig
- func (c *KVStoreConfig) WithMemtableSizeThreshold(size int64) *KVStoreConfig
- func (c *KVStoreConfig) WithNoLog() *KVStoreConfig
- func (c *KVStoreConfig) WithSegmentFileSizeThresholdLX(size int64) *KVStoreConfig
- type LockManager
- type LogRecord
- type LogRecordV2
- type MemState
- func (m *MemState) AddSparseIndexEntriesBulk(segmentID uint64, sparseIndexEntries []sparseIndexEntry)
- func (m *MemState) AddSparseIndexEntry(segmentID uint64, key []byte, offset int64)
- func (m *MemState) ClearState()
- func (m *MemState) Delete(key []byte)
- func (m *MemState) Deserialize(data []byte) error
- func (m *MemState) FindKeyInSparseIndex(segmentID uint64, key []byte) int64
- func (m *MemState) Flush(filePath string) ([]byte, []byte, error)
- func (m *MemState) FlushSparseIndex(filePath string) error
- func (m *MemState) Get(key []byte) ([]byte, bool)
- func (m *MemState) GetAllSegmentIDsDescendingOrder() ([]uint64, error)
- func (m *MemState) GetAllSortedPairs() []pair
- func (m *MemState) GetSparseIndex(segmentID uint64) sparseIndex
- func (m *MemState) NewIterator() *memtableIterator
- func (m *MemState) Print()
- func (m *MemState) Put(key, value []byte)
- func (m *MemState) RemoveSparseIndexEntry(segmentID uint64)
- func (m *MemState) Serialize() ([]byte, error)
- func (m *MemState) Size() int64
- type MinHeap
- type MinHeapRecord
- type Pair
- type SegmentMetadata
- type Server
- type SparseIndexRecord
- type Transaction
- func (txn *Transaction) Commit() error
- func (txn *Transaction) Delete(key []byte) error
- func (txn *Transaction) Get(key []byte) ([]byte, bool)
- func (txn *Transaction) GetForUpdate(key []byte) ([]byte, bool)
- func (txn *Transaction) Put(key, value []byte) error
- func (txn *Transaction) Rollback() error
- type WAL
Constants ¶
Variables ¶
This section is empty.
Functions ¶
func ComputeChecksum ¶
ComputeChecksum calculates a CRC32 checksum of the given byte slice
func GenerateRandomString ¶
GenerateRandomString generates a random string of a given length.
func GetPayloadForCommit ¶
GetPayloadForCommit returns the payload for a commit operation. The commit is a list of PUT operations.
func GetPayloadForPut ¶
GetPayloadForPut returns the payload for a single, non-transactional write.
func GetSegmentIDFromIndexFilePath ¶
getSegmentIDFromSegmentFilePath returns the segment ID from a segment file path.
func GetSegmentIDFromManifestFileName ¶
GetSegmentIDFromManifestFileName returns the segment ID from a manifest file name.
func GetSegmentIDFromSegmentFilePath ¶
getSegmentIDFromSegmentFilePath returns the segment ID from a segment file path.
func GetSparseIndexBytes ¶
GetSparseIndexBytes returns the bytes of the sparse index record.
func GetTempSegmentFileName ¶
func NewMergingIterator ¶
func NewSegmentIterator ¶
func PreCreateDirectories ¶
func PreCreateDirectories(config *KVStoreConfig) error
PreCreateDirectories creates the directories for the KVStore if they don't exist.
func ScanRange ¶
ScanRange scans the range of keys between startKey and endKey. It calls the provided function for each key-value pair in the range.
Note that the interval is [startKey, endKey), i.e. the endKey is not included.
func SerializeV2 ¶
SerializeV2 returns the bytes of the log record.
Types ¶
type ApplicationConfig ¶
type ApplicationConfig struct {
NodeID string
RaftAddr string
BaseDir string
Bootstrap bool
SnapshotInterval time.Duration
SnapshotRetention int
SnapshotThreshold int
}
ApplicationConfig is the configuration for the entire raft-based application.
See also: StartRaft()
func DefaultApplicationConfig ¶
func DefaultApplicationConfig(baseDir string) *ApplicationConfig
DefaultApplicationConfig creates a default configuration for a single-node, localhost setup. This is useful for testing.
func (*ApplicationConfig) GetBaseDir ¶
func (c *ApplicationConfig) GetBaseDir() string
GetBaseDir returns the base directory for the application.
It is used to store Raft snapshots.
type CompactionPlan ¶
type CompactionPlan struct {
// contains filtered or unexported fields
}
CompactionPlan is the plan for the compaction. It contains the base segments and the overlapping segments.
func (*CompactionPlan) GetAllSegments ¶
func (c *CompactionPlan) GetAllSegments() []SegmentMetadata
GetAllSegments returns all the segments in the compaction plan.
type Iterator ¶
type Iterator interface {
// Seek positions the iterator at the first key that is greater
// than or equal to the given key.
Seek(key []byte)
// Next advances the iterator to the next key in the sequence.
Next()
// Key returns the key at the current iterator position.
// The returned slice is only valid until the next call to Next().
Key() []byte
// Value returns the value at the current iterator position.
// The returned slice is only valid until the next call to Next().
Value() []byte
// Valid returns true if the iterator is positioned at a valid key-value pair.
Valid() bool
}
Iterator provides a way to seek and scan over key-value pairs.
type KVRecord ¶
Simple abstraction for a log record. +----------+---------------+-----------+-------------+-----+-------+ | Checksum | Key Size | Value Size | Key | Value | | (4 bytes)| (4 bytes) | (4 bytes) | ... | ... | +----------+---------------+-----------+-------------+-----+-------+ | <----------- Header (12 bytes) -----------------> | <- Payload -> |
func DeserializeKVRecord ¶
DeserializeKVRecord converts a byte array to a KVRecord according to the specified format.
func (*KVRecord) ComputeChecksumForRecord ¶
ComputeChecksumForRecord calculates checksum for the entire log record (excluding the checksum field itself)
func (*KVRecord) GetChecksum ¶
GetChecksum returns the checksum for the log record.
func (*KVRecord) Serialize ¶
Serialize converts the LogRecord to a byte array according to the specified format. The format is: Header (20 bytes) + Payload (Key + Value)
func (*KVRecord) SetChecksum ¶
func (lv *KVRecord) SetChecksum()
SetChecksum sets the checksum for the log record.
type KVStore ¶
type KVStore struct {
// contains filtered or unexported fields
}
func Open ¶
func Open(config *KVStoreConfig) (*KVStore, error)
Open opens/creates the log file and initializes the KVStore object.
1. Try to get the last checkpoint file path from the checkpoint file and the WAL files.
2. If the checkpoint is found, open it and read the last segment file path.
- Load the segment file into memtable.
- For all WAL files with segment ID greater than the last segment ID in the checkpoint file, replay them into memtable in ascending order.
- Truncate the WAL file (likely the last one) to the last good offset.
3. If the checkpoint is not found, simply start from the beginning of the WAL files and replay them into memtable in ascending order.
- Truncate the WAL file (likely the last one) to the last good offset.
4. Create and return the KVStore object.
func (*KVStore) AllocateNewSegmentID ¶
This method assumes that the lock is currently not withheld.
func (*KVStore) AllocateSegmentIDUnsafe ¶
This method assumes that the lock is currently withheld.
func (*KVStore) BeginTransaction ¶
func (kv *KVStore) BeginTransaction() *Transaction
BeginTransaction creates a new transaction.
func (*KVStore) CleanUpDirectories ¶
CleanUpDirectories cleans up the checkpoint and WAL directories.
func (*KVStore) CollectRange ¶
CollectRange collects the key-value pairs in the range between startKey and endKey.
It returns a slice of KVRecord.
func (*KVStore) Delete ¶
Delete deletes a key-value pair from the KVStore. It creates a new transaction and commits it. It is a wrapper around Transaction.Delete.
func (*KVStore) Get ¶
Get returns the value for a given key. The value is nil if the key is not found. It creates a new transaction and commits it. It is a wrapper around Transaction.Get.
func (*KVStore) GetCurrentManifestFilePath ¶
GetCurrentManifest returns the path to the current manifest file.
func (*KVStore) GetCurrentSegmentIDSafe ¶
GetCurrentSegmentIDSafe returns the ID of the current segment.
func (*KVStore) GetCurrentSegmentIDUnsafe ¶
This method assumes that the lock is currently withheld.
func (*KVStore) GetLastSequenceNum ¶
GetLastSequenceNum returns the last sequence number.
func (*KVStore) NewIterator ¶
NewIterator creates an iterator for range queries.
func (*KVStore) Put ¶
Put writes a key-value pair to the KVStore. It creates a new transaction and commits it. It is a wrapper around Transaction.Put.
func (*KVStore) RollToNewSegment ¶
RollToNewSegment rolls to a new segment. It creates a new WAL file and updates the WAL object. It also updates the current segment ID and the last sequence number.
type KVStoreConfig ¶
type KVStoreConfig struct {
CheckpointSize int64
BaseDir string
SegmentFileSizeThresholdLX int64
MaintenanceIntervalMs uint64
MemtableSizeThreshold int64
EnableSyncCheckpoint bool
EnableCheckpoint bool
EnableCompaction bool
EnableMaintenance bool
}
KVStoreConfig is the configuration for the KVStore.
func NewConfigurationNoMaintenance ¶
func NewConfigurationNoMaintenance() *KVStoreConfig
func NewDefaultConfiguration ¶
func NewDefaultConfiguration() *KVStoreConfig
NewDefaultConfiguration returns the default DB configuration.
func (*KVStoreConfig) GetBaseDir ¶
func (c *KVStoreConfig) GetBaseDir() string
GetBaseDir returns the base directory for the DB.
func (*KVStoreConfig) GetCheckpointSize ¶
func (c *KVStoreConfig) GetCheckpointSize() int64
GetCheckpointSize returns the checkpoint size for the DB.
func (*KVStoreConfig) GetMaintenanceIntervalMs ¶
func (c *KVStoreConfig) GetMaintenanceIntervalMs() uint64
GetCompactionIntervalMs returns the compaction interval for the DB.
func (*KVStoreConfig) GetMemtableSizeThreshold ¶
func (c *KVStoreConfig) GetMemtableSizeThreshold() int64
GetMemtableSizeThreshold returns the memtable size threshold for the DB.
func (*KVStoreConfig) GetSegmentFileSizeThresholdLX ¶
func (c *KVStoreConfig) GetSegmentFileSizeThresholdLX() int64
GetSegmentFileSizeThresholdLX returns the segment file size threshold for the DB.
func (*KVStoreConfig) WithBaseDir ¶
func (c *KVStoreConfig) WithBaseDir(dir string) *KVStoreConfig
WithBaseDir sets the base directory for the DB.
func (*KVStoreConfig) WithCheckpointSize ¶
func (c *KVStoreConfig) WithCheckpointSize(size int64) *KVStoreConfig
WithCheckpointSize sets the checkpoint size for the DB.
func (*KVStoreConfig) WithEnableCheckpoint ¶
func (c *KVStoreConfig) WithEnableCheckpoint(enable bool) *KVStoreConfig
func (*KVStoreConfig) WithEnableCompaction ¶
func (c *KVStoreConfig) WithEnableCompaction(enable bool) *KVStoreConfig
func (*KVStoreConfig) WithEnableMaintenance ¶
func (c *KVStoreConfig) WithEnableMaintenance(enable bool) *KVStoreConfig
func (*KVStoreConfig) WithEnableSyncCheckpoint ¶
func (c *KVStoreConfig) WithEnableSyncCheckpoint(enable bool) *KVStoreConfig
func (*KVStoreConfig) WithLog ¶
func (c *KVStoreConfig) WithLog() *KVStoreConfig
func (*KVStoreConfig) WithMaintenanceIntervalMs ¶
func (c *KVStoreConfig) WithMaintenanceIntervalMs(intervalMs uint64) *KVStoreConfig
func (*KVStoreConfig) WithMemtableSizeThreshold ¶
func (c *KVStoreConfig) WithMemtableSizeThreshold(size int64) *KVStoreConfig
WithMemtableSizeThreshold sets the memtable size threshold for the DB.
func (*KVStoreConfig) WithNoLog ¶
func (c *KVStoreConfig) WithNoLog() *KVStoreConfig
func (*KVStoreConfig) WithSegmentFileSizeThresholdLX ¶
func (c *KVStoreConfig) WithSegmentFileSizeThresholdLX(size int64) *KVStoreConfig
WithSegmentFileSizeThresholdLX sets the segment file size threshold for the DB.
type LockManager ¶
type LockManager struct {
// contains filtered or unexported fields
}
LockManager is a manager for per-key locks.
func (*LockManager) AcquireReadLock ¶
func (lm *LockManager) AcquireReadLock(key []byte)
func (*LockManager) AcquireWriteLock ¶
func (lm *LockManager) AcquireWriteLock(key []byte)
AcquireWriteLock acquires a write lock for the given key. If the key doesn't exist, the lock for it will be created.
func (*LockManager) ReleaseReadLocks ¶
func (lm *LockManager) ReleaseReadLocks(keys []string)
ReleaseReadLocks releases the read locks for the given keys.
func (*LockManager) ReleaseWriteLocks ¶
func (lm *LockManager) ReleaseWriteLocks(keys []string)
ReleaseWriteLocks releases the write locks for the given keys.
type LogRecord ¶
type LogRecord struct {
CheckSum uint32
SequenceNum uint64
KeySize uint32
ValueSize uint32
Key []byte
Value []byte
}
Simple abstraction for a log record. +----------+---------------+-----------+-------------+-----+-------+ | Checksum | Sequence Num | Key Size | Value Size | Key | Value | | (4 bytes)| (8 bytes) | (4 bytes) | (4 bytes) | ... | ... | +----------+---------------+-----------+-------------+-----+-------+ | <----------- Header (20 bytes) -----------------> | <- Payload -> |
func Deserialize ¶
Deserialize converts a byte array to a LogRecord according to the specified format.
func (*LogRecord) ComputeChecksumForRecord ¶
ComputeChecksumForRecord calculates checksum for the entire log record (excluding the checksum field itself)
type LogRecordV2 ¶
type LogRecordV2 struct {
CheckSum uint32
SequenceNum uint64
Term uint64
RecordType byte
PayloadSize uint32
Payload []byte
}
The new log record format in which the header is 25 bytes: 4 + 8 + 8 + 1 + 4 = 25 +----------+---------------+-----------+-----------+-------------+---------+ | Checksum | Sequence Num | Term | RecordType| PayloadSize | Payload | | (4 bytes)| (8 bytes) | (8 bytes) | (1 byte) | (4 bytes) | ... | +----------+---------------+-----------+-----------+-------------+---------+ | <----------- Header (25 bytes) ------------------------------> | | The record type can be: 0x01 -> Put -- a single, non-transactional write: [KeySize (4B)] [ValueSize (4B)] [Key (Var)] [Value (Var)] 0x02 -> Commit -- [NumOps (4B)] [Op1_KeySize] [Op1_ValueSize] [Op1_Key] [Op1_Value] [Op2_KeySize] ...
func DeserializeV2 ¶
func DeserializeV2(data []byte) (LogRecordV2, error)
DeserializeV2 deserializes a log record from a byte array.
func (*LogRecordV2) GetOps ¶
func (r *LogRecordV2) GetOps() ([]KVRecord, error)
GetOps returns the operations in the log record. If the record type is a Put, it returns a single operation. If the record type is a Commit, it returns a list of operations. Note that each KVRecord is assumed to be valid at this point so it contains no checksum.
type MemState ¶
type MemState struct {
// contains filtered or unexported fields
}
MemState is a simple in-memory key-value store. It doesn't have any concurrency protection.
func NewMemState ¶
func NewMemState() *MemState
func (*MemState) AddSparseIndexEntriesBulk ¶
func (*MemState) AddSparseIndexEntry ¶
AddSparseIndexEntry adds a new entry to the sparse index.
func (*MemState) ClearState ¶
func (m *MemState) ClearState()
ClearState clears the memtable and the sparse index.
func (*MemState) Deserialize ¶
Deserialize deserializes the memtable from the data.
func (*MemState) FindKeyInSparseIndex ¶
FindKeyInSparseIndex finds the offset of a key in the sparse index.
func (*MemState) Flush ¶
Flush flushes the memtable to the segment file. It writes the entries to the segment file in sorted order. TODO: It also updates the offset in the sparse index.
func (*MemState) FlushSparseIndex ¶
FlushSparseIndex flushes the sparse index to the sparse index file.
func (*MemState) Get ¶
Get returns the value for a given key. If the key is not found, it returns an error.
func (*MemState) GetAllSegmentIDsDescendingOrder ¶
GetAllSegmentFilePathsDescendingOrder gets all the segment files in the descending order of their segment IDs.
func (*MemState) GetAllSortedPairs ¶
func (m *MemState) GetAllSortedPairs() []pair
GetAllSortedPairs returns all the key-value pairs in the memtable sorted by key.
func (*MemState) GetSparseIndex ¶
GetSparseIndex returns the sparse index for a given segment ID.
func (*MemState) NewIterator ¶
func (m *MemState) NewIterator() *memtableIterator
func (*MemState) RemoveSparseIndexEntry ¶
type MinHeap ¶
type MinHeap []*MinHeapRecord
MinHeap is a min heap of MinHeapRecord. If the keys are the same, the segment file path is used to break the tie.
type MinHeapRecord ¶
MinHeapRecord is a record that is used to store the records in the min heap. It is used to store the records in the min heap for the compaction process. The record is the KVRecord and the segment file path is the path to the segment file that contains the record.
type SegmentMetadata ¶
type SegmentMetadata struct {
// contains filtered or unexported fields
}
SegmentMetadata is the metadata for a segment file.
func ReadSegmentMetadata ¶
func ReadSegmentMetadata(file *os.File) (*SegmentMetadata, error)
ReadSegmentMetadata reads the segment metadata from the file. The bytes are in the following order: checksum (4 bytes), id (8 bytes), level (4 bytes), minKeySize (4 bytes), maxKeySize (4 bytes), filePathSize (4 bytes), minKey (variable), maxKey (variable), filePath (variable)
func (*SegmentMetadata) GetBytes ¶
func (s *SegmentMetadata) GetBytes() []byte
GetBytes returns the bytes representation of the segment metadata. The bytes are in the following order: checksum (4 bytes), id (8 bytes), level (4 bytes), minKeySize (4 bytes), maxKeySize (4 bytes), filePathSize (4 bytes), minKey (variable), maxKey (variable), filePath (variable)
func (*SegmentMetadata) GetSparseIndexFileName ¶
func (s *SegmentMetadata) GetSparseIndexFileName() string
GetSparseIndexFileName returns the file name of the sparse index file for the segment.
func (*SegmentMetadata) HasOverlappingKeys ¶
func (s *SegmentMetadata) HasOverlappingKeys(other *SegmentMetadata) bool
HasOverlappingKeys checks if the two segments have overlapping keys.
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
Server is the main application server that wraps the Raft node and KVStore. It exposes an HTTP API for clients to interact with the database.
type SparseIndexRecord ¶
type SparseIndexRecord struct {
Checksum uint32 // 4 bytes
SegmentID uint64 // 8 bytes
KeySize uint32 // 4 bytes
Offset int64 // 8 bytes
Key []byte // KeySize bytes
}
func DecodeSparseIndexHeader ¶
func DecodeSparseIndexHeader(headerBytes []byte) (*SparseIndexRecord, error)
type Transaction ¶
type Transaction struct {
// contains filtered or unexported fields
}
Transaction allows multiple operations to be performed atomically.
func NewTransaction ¶
func NewTransaction(store *KVStore) *Transaction
NewTransaction creates a new transaction.
func (*Transaction) Commit ¶
func (txn *Transaction) Commit() error
Release Per-Key Locks: The final step is to tell the LockManager to release all the individual read and write locks that this transaction was holding. This allows other waiting transactions to proceed.
func (*Transaction) Delete ¶
func (txn *Transaction) Delete(key []byte) error
Delete deletes a key from the KVStore.
func (*Transaction) Get ¶
func (txn *Transaction) Get(key []byte) ([]byte, bool)
Get gets a value from the KVStore.
func (*Transaction) GetForUpdate ¶
func (txn *Transaction) GetForUpdate(key []byte) ([]byte, bool)
GetForUpdate gets a value from the KVStore and acquires a write lock. This should be used when you plan to update the key later in the same transaction. It prevents the deadlock that occurs when Get() acquires a read lock and Put() tries to acquire a write lock.
func (*Transaction) Put ¶
func (txn *Transaction) Put(key, value []byte) error
Put writes a key-value pair to the KVStore.
func (*Transaction) Rollback ¶
func (txn *Transaction) Rollback() error
Rollback rolls back the transaction.
Source Files
¶
- application.go
- application_config.go
- checkpoint.go
- compaction.go
- fsm.go
- iterator.go
- iterator_heap.go
- kv_record.go
- kv_store.go
- kv_store_config.go
- lock_manager.go
- log_record.go
- log_record_v2.go
- maintenance.go
- mem_state.go
- memtable_iterator.go
- merging_iterator.go
- minheap.go
- recovery.go
- segment_iterator.go
- segment_metadata.go
- server.go
- sparse_index_record.go
- test_util.go
- transaction.go
- wal.go