Documentation
¶
Overview ¶
Package database provides enhanced database utilities with VictoriaMetrics-style optimizations
Package database provides memory management utilities inspired by VictoriaMetrics
Index ¶
- Constants
- Variables
- func AtomicClear(readerDB Iteratee, deleterDB KeyValueDeleter) error
- func AtomicClearPrefix(readerDB Iteratee, deleterDB KeyValueDeleter, prefix []byte) error
- func Clear(db Database, writeSize int) error
- func ClearPrefix(db Database, prefix []byte, writeSize int) error
- func Count(db Iteratee) (int, error)
- func GetBool(db KeyValueReader, key []byte) (bool, error)
- func GetID(db KeyValueReader, key []byte) (ids.ID, error)
- func GetTimestamp(db KeyValueReader, key []byte) (time.Time, error)
- func GetUInt32(db KeyValueReader, key []byte) (uint32, error)
- func GetUInt64(db KeyValueReader, key []byte) (uint64, error)
- func IsEmpty(db Iteratee) (bool, error)
- func NewErrBackendDisabled(backend string) error
- func PackUInt32(val uint32) []byte
- func PackUInt64(val uint64) []byte
- func ParseID(b []byte) (ids.ID, error)
- func ParseTimestamp(b []byte) (time.Time, error)
- func ParseUInt32(b []byte) (uint32, error)
- func ParseUInt64(b []byte) (uint64, error)
- func PutBool(db KeyValueWriter, key []byte, b bool) error
- func PutID(db KeyValueWriter, key []byte, val ids.ID) error
- func PutTimestamp(db KeyValueWriter, key []byte, val time.Time) error
- func PutUInt32(db KeyValueWriter, key []byte, val uint32) error
- func PutUInt64(db KeyValueWriter, key []byte, val uint64) error
- func Size(db Iteratee) (int, error)
- type BadgerDBWithCache
- type Batch
- type BatchOp
- type BatchOps
- type BatchedDatabase
- type Batcher
- type Compacter
- type Database
- type ErrBackendDisabled
- type HeightIndex
- type Iteratee
- type Iterator
- type IteratorError
- type KeyValueDeleter
- type KeyValueReader
- type KeyValueReaderWriter
- type KeyValueReaderWriterDeleter
- type KeyValueWriter
- type KeyValueWriterDeleter
- type MemoryManager
- func (mm *MemoryManager) Allowed() int64
- func (mm *MemoryManager) Available() int64
- func (mm *MemoryManager) GetMemoryStats() MemoryStats
- func (mm *MemoryManager) Release(size int64)
- func (mm *MemoryManager) ReleaseCritical(size int64)
- func (mm *MemoryManager) Reserve(size int64)
- func (mm *MemoryManager) ReserveCritical(size int64)
- func (mm *MemoryManager) TryReserve(size int64) bool
- func (mm *MemoryManager) Used() int64
- func (mm *MemoryManager) WithReserve(size int64, fn func() error) error
- type MemoryStats
- type ObjectPool
- type OpType
- type Operation
- type RangeIterator
- type Syncer
Constants ¶
const ( // MaxExcessCapacityFactor is the factor above which capacity is considered excessive MaxExcessCapacityFactor = 4 // CapacityReductionFactor is the factor by which to reduce capacity when it's excessive CapacityReductionFactor = 2 )
const ( Uint64Size = 8 // bytes BoolSize = 1 // bytes BoolFalse = 0x00 BoolTrue = 0x01 )
Variables ¶
var ( ErrClosed = errors.New("closed") ErrNotFound = errors.New("not found") )
common errors
Functions ¶
func AtomicClear ¶
func AtomicClear(readerDB Iteratee, deleterDB KeyValueDeleter) error
func AtomicClearPrefix ¶
func AtomicClearPrefix(readerDB Iteratee, deleterDB KeyValueDeleter, prefix []byte) error
AtomicClearPrefix deletes from [deleterDB] all keys in [readerDB] that have the given [prefix].
func ClearPrefix ¶
Removes all keys with the given [prefix] from [db]. Writes each batch when it reaches [writeSize].
func GetTimestamp ¶
func GetTimestamp(db KeyValueReader, key []byte) (time.Time, error)
func NewErrBackendDisabled ¶
NewErrBackendDisabled creates a new ErrBackendDisabled error
func PackUInt32 ¶
func PackUInt64 ¶
func ParseUInt32 ¶
func ParseUInt64 ¶
func PutTimestamp ¶
func PutTimestamp(db KeyValueWriter, key []byte, val time.Time) error
Types ¶
type BadgerDBWithCache ¶ added in v1.17.37
type BadgerDBWithCache struct {
// contains filtered or unexported fields
}
BadgerDBWithCache wraps BadgerDB with caching and compression optimizations
func NewBadgerDBWithCache ¶ added in v1.17.37
func NewBadgerDBWithCache(db Database, cacheSize int, compressionLevel zstd.EncoderLevel, maxConcurrency int, reg *metric.MetricsRegistry) (*BadgerDBWithCache, error)
NewBadgerDBWithCache creates a new BadgerDB wrapper with caching and compression
func (*BadgerDBWithCache) Delete ¶ added in v1.17.37
func (bdb *BadgerDBWithCache) Delete(key []byte) error
Delete removes a key from the database and cache
func (*BadgerDBWithCache) Get ¶ added in v1.17.37
func (bdb *BadgerDBWithCache) Get(key []byte) ([]byte, error)
Get retrieves a value from the database with caching
func (*BadgerDBWithCache) Has ¶ added in v1.17.37
func (bdb *BadgerDBWithCache) Has(key []byte) (bool, error)
Has checks if a key exists in the database
func (*BadgerDBWithCache) Put ¶ added in v1.17.37
func (bdb *BadgerDBWithCache) Put(key, value []byte) error
Put inserts a value into the database with caching and compression
type Batch ¶
type Batch interface {
KeyValueWriterDeleter
// Size retrieves the amount of data queued up for writing, this includes
// the keys, values, and deleted keys.
Size() int
// Write flushes any accumulated data to disk.
Write() error
// Reset resets the batch for reuse.
Reset()
// Replay replays the batch contents in the same order they were written
// to the batch.
Replay(w KeyValueWriterDeleter) error
// Inner returns a Batch writing to the inner database, if one exists. If
// this batch is already writing to the base DB, then itself should be
// returned.
Inner() Batch
}
Batch is a write-only database that commits changes to its host database when Write is called. A batch cannot be used concurrently.
type BatchOps ¶
type BatchOps struct {
Ops []BatchOp
// contains filtered or unexported fields
}
func (*BatchOps) Replay ¶
func (b *BatchOps) Replay(w KeyValueWriterDeleter) error
type BatchedDatabase ¶ added in v1.17.37
type BatchedDatabase struct {
// contains filtered or unexported fields
}
BatchedDatabase provides batched operations with optimizations
func NewBatchedDatabase ¶ added in v1.17.37
func NewBatchedDatabase(db Database, batchSize int, batchTimeout time.Duration, reg *metric.MetricsRegistry) *BatchedDatabase
NewBatchedDatabase creates a new batched database wrapper
func (*BatchedDatabase) Close ¶ added in v1.17.37
func (b *BatchedDatabase) Close() error
Close closes the batched database and flushes any remaining operations
func (*BatchedDatabase) Delete ¶ added in v1.17.37
func (b *BatchedDatabase) Delete(key []byte) error
Delete adds a delete operation to the batch
func (*BatchedDatabase) Flush ¶ added in v1.17.37
func (b *BatchedDatabase) Flush() error
Flush forces a flush of all pending operations
func (*BatchedDatabase) Put ¶ added in v1.17.37
func (b *BatchedDatabase) Put(key, value []byte) error
Put adds a put operation to the batch
type Batcher ¶
type Batcher interface {
// NewBatch creates a write-only database that buffers changes to its host db
// until a final write is called.
NewBatch() Batch
}
Batcher wraps the NewBatch method of a backing data store.
type Compacter ¶
type Compacter interface {
// Compact the underlying DB for the given key range.
// Specifically, deleted and overwritten versions are discarded,
// and the data is rearranged to reduce the cost of operations
// needed to access the data. This operation should typically only
// be invoked by users who understand the underlying implementation.
//
// A nil start is treated as a key before all keys in the DB.
// And a nil limit is treated as a key after all keys in the DB.
// Therefore if both are nil then it will compact entire DB.
//
// Note: [start] and [limit] are safe to modify and read after calling Compact.
Compact(start []byte, limit []byte) error
}
Compacter wraps the Compact method of a backing data store.
type Database ¶
type Database interface {
KeyValueReaderWriterDeleter
Batcher
Iteratee
Compacter
Syncer
io.Closer
HealthCheck(context.Context) (interface{}, error)
// Backup performs a backup of the database to the provided writer.
// This should be a consistent snapshot of the database state.
// since: 0 for full backup, or the version of the last backup for incremental.
// returns: the version (timestamp/sequence) of this backup, to be used for the next incremental.
Backup(w io.Writer, since uint64) (uint64, error)
// Load restores the database from the provided reader.
// This will overwrite the current database state with the backup.
// Note: The database should generally be empty or fresh when calling Load.
Load(r io.Reader) error
}
Database contains all the methods required to allow handling different key-value data stores backing the database.
type ErrBackendDisabled ¶
type ErrBackendDisabled struct {
Backend string
}
ErrBackendDisabled is returned when a database backend is disabled at compile time
func (*ErrBackendDisabled) Error ¶
func (e *ErrBackendDisabled) Error() string
type HeightIndex ¶ added in v1.2.8
type HeightIndex interface {
// Put inserts the value at the given height.
//
// Note: [value] is safe to modify and read after calling Put.
//
// If [value] is nil or an empty slice, then when it's retrieved
// it may be nil or an empty slice.
Put(height uint64, value []byte) error
// Get retrieves the value at the given height.
// Returns ErrNotFound if the height does not exist.
//
// The returned byte slice is safe to read, but cannot be modified.
Get(height uint64) ([]byte, error)
// Has retrieves if a value exists at the given height.
Has(height uint64) (bool, error)
// Delete removes the value at the given height.
Delete(height uint64) error
// Close releases any resources associated with the index.
Close() error
}
HeightIndex provides height-based key-value storage for blockchain state. Heights are stored as big-endian uint64 keys for efficient range queries.
type Iteratee ¶
type Iteratee interface {
// NewIterator creates an iterator over the entire keyspace contained within
// the key-value database.
NewIterator() Iterator
// NewIteratorWithStart creates an iterator over a subset of database
// content starting at a particular initial key.
NewIteratorWithStart(start []byte) Iterator
// NewIteratorWithPrefix creates an iterator over a subset of database
// content with a particular key prefix.
NewIteratorWithPrefix(prefix []byte) Iterator
// NewIteratorWithStartAndPrefix creates an iterator over a subset of
// database content with a particular key prefix starting at a specified
// key.
NewIteratorWithStartAndPrefix(start, prefix []byte) Iterator
}
Iteratee wraps the NewIterator methods of a backing data store.
type Iterator ¶
type Iterator interface {
// Next moves the iterator to the next key/value pair. It returns whether
// the iterator successfully moved to a new key/value pair.
// The iterator may return false if the underlying database has been closed
// before the iteration has completed, in which case future calls to Error()
// must return [ErrClosed].
Next() bool
// Error returns any accumulated error. Exhausting all the key/value pairs
// is not considered to be an error.
// Error should be called after all key/value pairs have been exhausted ie.
// after Next() has returned false.
Error() error
// Key returns the key of the current key/value pair, or nil if done.
// If the database is closed, must still report the current contents.
// Behavior is undefined after Release is called.
Key() []byte
// Value returns the value of the current key/value pair, or nil if done.
// If the database is closed, must still report the current contents.
// Behavior is undefined after Release is called.
Value() []byte
// Release releases associated resources. Release should always succeed and
// can be called multiple times without causing error.
Release()
}
Iterator iterates over a database's key/value pairs.
When it encounters an error any seek will return false and will yield no key/ value pairs. The error can be queried by calling the Error method. Calling Release is still necessary.
An iterator must be released after use, but it is not necessary to read an iterator until exhaustion. An iterator is not safe for concurrent use, but it is safe to use multiple iterators concurrently.
type IteratorError ¶
type IteratorError struct {
Err error
}
IteratorError does nothing and returns the provided error
func (*IteratorError) Error ¶
func (i *IteratorError) Error() error
func (*IteratorError) Key ¶
func (*IteratorError) Key() []byte
func (*IteratorError) Next ¶
func (*IteratorError) Next() bool
func (*IteratorError) Release ¶
func (*IteratorError) Release()
func (*IteratorError) Value ¶
func (*IteratorError) Value() []byte
type KeyValueDeleter ¶
type KeyValueDeleter interface {
// Delete removes the key from the key-value data store.
//
// Note: [key] is safe to modify and read after calling Delete.
Delete(key []byte) error
}
KeyValueDeleter wraps the Delete method of a backing data store.
type KeyValueReader ¶
type KeyValueReader interface {
// Has retrieves if a key is present in the key-value data store.
//
// Note: [key] is safe to modify and read after calling Has.
Has(key []byte) (bool, error)
// Get retrieves the given key if it's present in the key-value data store.
// Returns ErrNotFound if the key is not present in the key-value data store.
//
// Note: [key] is safe to modify and read after calling Get.
// The returned byte slice is safe to read, but cannot be modified.
Get(key []byte) ([]byte, error)
}
KeyValueReader wraps the Has and Get method of a backing data store.
type KeyValueReaderWriter ¶
type KeyValueReaderWriter interface {
KeyValueReader
KeyValueWriter
}
KeyValueReaderWriter allows read/write access to a backing data store.
type KeyValueReaderWriterDeleter ¶
type KeyValueReaderWriterDeleter interface {
KeyValueReader
KeyValueWriter
KeyValueDeleter
}
KeyValueReaderWriterDeleter allows read/write/delete access to a backing data store.
type KeyValueWriter ¶
type KeyValueWriter interface {
// Put inserts the given value into the key-value data store.
//
// Note: [key] and [value] are safe to modify and read after calling Put.
//
// If [value] is nil or an empty slice, then when it's retrieved
// it may be nil or an empty slice.
//
// Similarly, a nil [key] is treated the same as an empty slice.
Put(key []byte, value []byte) error
}
KeyValueWriter wraps the Put method of a backing data store.
type KeyValueWriterDeleter ¶
type KeyValueWriterDeleter interface {
KeyValueWriter
KeyValueDeleter
}
KeyValueWriterDeleter allows write/delete access to a backing data store.
type MemoryManager ¶ added in v1.17.37
type MemoryManager struct {
// contains filtered or unexported fields
}
MemoryManager provides memory management similar to VictoriaMetrics
func NewMemoryManager ¶ added in v1.17.37
func NewMemoryManager(allowedPercent float64, reg *metric.MetricsRegistry) (*MemoryManager, error)
NewMemoryManager creates a new memory manager with the specified percentage of system memory
func (*MemoryManager) Allowed ¶ added in v1.17.37
func (mm *MemoryManager) Allowed() int64
Allowed returns the amount of memory allowed for use
func (*MemoryManager) Available ¶ added in v1.17.37
func (mm *MemoryManager) Available() int64
Available returns the amount of memory available for allocation
func (*MemoryManager) GetMemoryStats ¶ added in v1.17.37
func (mm *MemoryManager) GetMemoryStats() MemoryStats
GetMemoryStats returns current memory statistics
func (*MemoryManager) Release ¶ added in v1.17.37
func (mm *MemoryManager) Release(size int64)
Release releases previously reserved memory
func (*MemoryManager) ReleaseCritical ¶ added in v1.17.37
func (mm *MemoryManager) ReleaseCritical(size int64)
ReleaseCritical releases memory from the critical reserve pool
func (*MemoryManager) Reserve ¶ added in v1.17.37
func (mm *MemoryManager) Reserve(size int64)
Reserve reserves memory, blocking until it's available
func (*MemoryManager) ReserveCritical ¶ added in v1.17.37
func (mm *MemoryManager) ReserveCritical(size int64)
ReserveCritical reserves memory from the critical reserve pool This is for operations that must not fail due to memory limits
func (*MemoryManager) TryReserve ¶ added in v1.17.37
func (mm *MemoryManager) TryReserve(size int64) bool
TryReserve attempts to reserve memory without blocking Returns true if successful, false otherwise
func (*MemoryManager) Used ¶ added in v1.17.37
func (mm *MemoryManager) Used() int64
Used returns the amount of memory currently in use
func (*MemoryManager) WithReserve ¶ added in v1.17.37
func (mm *MemoryManager) WithReserve(size int64, fn func() error) error
WithReserve executes a function with reserved memory
type MemoryStats ¶ added in v1.17.37
type MemoryStats struct {
Allowed int64 // Allowed memory in bytes
Used int64 // Used memory in bytes
Available int64 // Available memory in bytes
System uint64 // Total system memory in bytes
Percent float64 // Percentage of system memory allowed
}
MemoryStats holds memory statistics
type ObjectPool ¶ added in v1.17.37
type ObjectPool[T any] struct { // contains filtered or unexported fields }
ObjectPool provides an optimized object pool similar to VictoriaMetrics
func NewObjectPool ¶ added in v1.17.37
func NewObjectPool[T any](newFn func() T, size int64, mm *MemoryManager, reg *metric.MetricsRegistry) *ObjectPool[T]
NewObjectPool creates a new object pool with memory management
func (*ObjectPool[T]) Clear ¶ added in v1.17.37
func (op *ObjectPool[T]) Clear()
Clear clears the object pool
func (*ObjectPool[T]) Get ¶ added in v1.17.37
func (op *ObjectPool[T]) Get() T
Get acquires an object from the pool
func (*ObjectPool[T]) GetPoolSize ¶ added in v1.17.37
func (op *ObjectPool[T]) GetPoolSize() int64
GetPoolSize returns the approximate number of objects in the pool
func (*ObjectPool[T]) Put ¶ added in v1.17.37
func (op *ObjectPool[T]) Put(obj T)
Put returns an object to the pool
type RangeIterator ¶ added in v1.17.37
type RangeIterator struct {
// contains filtered or unexported fields
}
RangeIterator provides optimized range iteration
func NewRangeIterator ¶ added in v1.17.37
func NewRangeIterator(db Database, start, end []byte, limit int, reverse bool, reg *metric.MetricsRegistry) *RangeIterator
NewRangeIterator creates a new range iterator
func (*RangeIterator) Count ¶ added in v1.17.37
func (r *RangeIterator) Count() int
Count returns the number of items iterated
type Syncer ¶ added in v1.2.17
type Syncer interface {
// Sync flushes all buffered writes to persistent storage.
// This ensures that data written before Sync is called will
// survive a crash or power failure. This is important for
// databases configured with async writes for performance.
//
// Implementations should ensure all in-memory buffers (memtables,
// write-ahead logs, etc.) are flushed to disk.
Sync() error
}
Syncer wraps the Sync method of a backing data store.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package databasemock is a generated GoMock package.
|
Package databasemock is a generated GoMock package. |
|
heightindexdb
|
|
|
Package hookdb wraps a database to fire async callbacks on write operations.
|
Package hookdb wraps a database to fire async callbacks on write operations. |
|
state
|
|
|
syncapi
Package syncapi exposes the *data* formats needed by trie-/code-sync.
|
Package syncapi exposes the *data* formats needed by trie-/code-sync. |