Documentation ¶
Index ¶
- Constants
- Variables
- func AddTreePrintTree(edge string, tree treeprint.Tree, rwt KVCallbackIterableReader) error
- func CompareKeys(k1, k2 []byte) int
- func EnsureKeyFormatStore(ks interface{}) ([][]byte, error)
- func KeyOrder(key []byte) int
- func NormaliseDomain(low, high []byte) ([]byte, []byte)
- type ByteSlicable
- type CommitID
- func (*CommitID) Descriptor() ([]byte, []int)
- func (m *CommitID) GetHash() []byte
- func (m *CommitID) GetVersion() int64
- func (m *CommitID) Marshal() (dAtA []byte, err error)
- func (cid *CommitID) MarshalBinary() ([]byte, error)
- func (m *CommitID) MarshalTo(dAtA []byte) (int, error)
- func (m *CommitID) MarshalToSizedBuffer(dAtA []byte) (int, error)
- func (*CommitID) ProtoMessage()
- func (m *CommitID) Reset()
- func (m *CommitID) Size() (n int)
- func (cid CommitID) String() string
- func (m *CommitID) Unmarshal(dAtA []byte) error
- func (cid *CommitID) UnmarshalBinary(data []byte) error
- func (m *CommitID) XXX_DiscardUnknown()
- func (m *CommitID) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)
- func (m *CommitID) XXX_Merge(src proto.Message)
- func (*CommitID) XXX_MessageName() string
- func (m *CommitID) XXX_Size() int
- func (m *CommitID) XXX_Unmarshal(b []byte) error
- type ForestOption
- type ForestReader
- type ImmutableForest
- type ImmutableTree
- type KVCallbackIterable
- type KVCallbackIterableReader
- type KVIterable
- type KVIterableReader
- type KVIterator
- type KVReader
- type KVReaderWriter
- type KVStore
- type KVWriter
- type KeyFormat
- func (kf *KeyFormat) Fix(args ...interface{}) (*KeyFormat, error)
- func (kf *KeyFormat) Iterator(iterable KVIterable, start, end []byte, reverse ...bool) (KVIterator, error)
- func (kf *KeyFormat) Key(args ...interface{}) ([]byte, error)
- func (kf *KeyFormat) KeyBytes(segments ...[]byte) ([]byte, error)
- func (kf *KeyFormat) KeyNoPrefix(args ...interface{}) (Prefix, error)
- func (kf *KeyFormat) Layout() []int
- func (kf *KeyFormat) NumSegments() int
- func (kf *KeyFormat) Prefix() Prefix
- func (kf *KeyFormat) Scan(key []byte, args ...interface{}) error
- func (kf *KeyFormat) ScanBytes(key []byte) [][]byte
- func (kf *KeyFormat) ScanNoPrefix(key []byte, args ...interface{}) error
- func (kf *KeyFormat) String() string
- func (kf *KeyFormat) Unprefixed() *KeyFormat
- type MustKeyFormat
- func (kf *MustKeyFormat) Fix(args ...interface{}) *MustKeyFormat
- func (kf *MustKeyFormat) Key(args ...interface{}) []byte
- func (kf *MustKeyFormat) KeyBytes(segments ...[]byte) []byte
- func (kf *MustKeyFormat) KeyNoPrefix(args ...interface{}) Prefix
- func (kf *MustKeyFormat) Unprefixed() *MustKeyFormat
- type MutableForest
- func (muf *MutableForest) Delete(prefix []byte) (*CommitID, error)
- func (muf *MutableForest) GetImmutable(version int64) (*ImmutableForest, error)
- func (muf *MutableForest) Hash() []byte
- func (muf *MutableForest) IterateRWTree(start, end []byte, ascending bool, fn func(prefix []byte, tree *RWTree) error) error
- func (muf *MutableForest) Load(version int64) error
- func (muf *MutableForest) Save() (hash []byte, version int64, _ error)
- func (muf *MutableForest) Version() int64
- func (muf *MutableForest) Write(prefix []byte, writer func(tree *RWTree) error) error
- type MutableTree
- func (mut *MutableTree) Get(key []byte) ([]byte, error)
- func (mut *MutableTree) GetImmutable(version int64) (*ImmutableTree, error)
- func (mut *MutableTree) Has(key []byte) (bool, error)
- func (mut *MutableTree) Iterate(start, end []byte, ascending bool, fn func(key []byte, value []byte) error) error
- func (mut *MutableTree) IterateWriteTree(start, end []byte, ascending bool, fn func(key []byte, value []byte) error) error
- func (mut *MutableTree) Load(version int64, overwriting bool) error
- type Prefix
- func (p Prefix) Above() []byte
- func (p Prefix) Below() []byte
- func (p Prefix) CallbackIterable(source KVCallbackIterable) *prefixCallbackIterable
- func (p Prefix) HexString() string
- func (p Prefix) Iterable(source KVIterable) KVIterable
- func (p Prefix) Iterator(iteratorFn func(start, end []byte) (dbm.Iterator, error), start, end []byte) (KVIterator, error)
- func (p Prefix) Key(key []byte) []byte
- func (p Prefix) Length() int
- func (p Prefix) Store(source KVStore) KVStore
- func (p Prefix) String() string
- func (p Prefix) Suffix(key []byte) []byte
- type PrefixDB
- func (pdb *PrefixDB) Close() error
- func (pdb *PrefixDB) Delete(key []byte) error
- func (pdb *PrefixDB) DeleteSync(key []byte) error
- func (pdb *PrefixDB) Get(key []byte) ([]byte, error)
- func (pdb *PrefixDB) Has(key []byte) (bool, error)
- func (pdb *PrefixDB) Iterator(low, high []byte) (KVIterator, error)
- func (pdb *PrefixDB) NewBatch() dbm.Batch
- func (pdb *PrefixDB) Print() error
- func (pdb *PrefixDB) ReverseIterator(low, high []byte) (KVIterator, error)
- func (pdb *PrefixDB) Set(key, value []byte) error
- func (pdb *PrefixDB) SetSync(key, value []byte) error
- func (pdb *PrefixDB) Stats() map[string]string
- type RWTree
- func (rwt *RWTree) Delete(key []byte) ([]byte, bool)
- func (rwt *RWTree) Dump() string
- func (rwt *RWTree) Get(key []byte) ([]byte, error)
- func (rwt *RWTree) GetImmutable(version int64) (*ImmutableTree, error)
- func (rwt *RWTree) Has(key []byte) (bool, error)
- func (rwt *RWTree) Hash() []byte
- func (rwt *RWTree) Iterate(low, high []byte, ascending bool, fn func(key []byte, value []byte) error) error
- func (rwt *RWTree) IterateWriteTree(start, end []byte, ascending bool, fn func(key []byte, value []byte) error) error
- func (rwt *RWTree) Load(version int64, overwriting bool) error
- func (rwt *RWTree) Save() ([]byte, int64, error)
- func (rwt *RWTree) Set(key, value []byte) bool
- func (rwt *RWTree) Updated() bool
- func (rwt *RWTree) Version() int64
- type SortOrder
- type Versioned
Constants ¶
const ( DelimiterSegmentLength = -1 VariadicSegmentLength = 0 )
Variables ¶
Functions ¶
func AddTreePrintTree ¶ added in v0.24.0
func AddTreePrintTree(edge string, tree treeprint.Tree, rwt KVCallbackIterableReader) error
func CompareKeys ¶
Sorts the keys as if they were compared lexicographically with their KeyOrder prepended
func EnsureKeyFormatStore ¶ added in v0.24.0
Checks that a struct containing KeyFormat fields has no collisions on prefix and so acts as a sane 'KeyFormatStore'
func KeyOrder ¶
KeyOrder maps []byte{} -> -1, []byte(nil) -> 1, and everything else to 0. This encodes the assumptions of the KVIterator domain endpoints
func NormaliseDomain ¶
NormaliseDomain encodes the assumption that when nil is used as a lower bound is interpreted as low rather than high
Types ¶
type ByteSlicable ¶
type ByteSlicable interface {
Bytes() []byte
}
type CommitID ¶ added in v0.24.0
type CommitID struct { Version int64 `protobuf:"varint,1,opt,name=Version,proto3" json:"Version,omitempty"` Hash []byte `protobuf:"bytes,2,opt,name=Hash,proto3" json:"Hash,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` }
This is the object that is stored in the leaves of the commitsTree - it captures the sub-tree hashes so that the commitsTree's hash becomes a mixture of the hashes of all the sub-trees.
func (*CommitID) Descriptor ¶ added in v0.28.0
func (*CommitID) GetVersion ¶ added in v0.28.0
func (*CommitID) MarshalBinary ¶ added in v0.27.0
func (*CommitID) MarshalToSizedBuffer ¶ added in v0.30.0
func (*CommitID) ProtoMessage ¶ added in v0.28.0
func (*CommitID) ProtoMessage()
func (*CommitID) UnmarshalBinary ¶ added in v0.27.0
func (*CommitID) XXX_DiscardUnknown ¶ added in v0.28.0
func (m *CommitID) XXX_DiscardUnknown()
func (*CommitID) XXX_Marshal ¶ added in v0.28.0
func (*CommitID) XXX_MessageName ¶ added in v0.28.0
func (*CommitID) XXX_Unmarshal ¶ added in v0.28.0
type ForestOption ¶ added in v0.24.0
type ForestOption func(*ImmutableForest)
var WithOverwriting ForestOption = func(imf *ImmutableForest) { imf.overwriting = true }
type ForestReader ¶ added in v0.24.0
type ForestReader interface {
Reader(prefix []byte) (KVCallbackIterableReader, error)
}
Access the read path of a forest
type ImmutableForest ¶ added in v0.24.0
type ImmutableForest struct { // Synchronises tree loading sync.Mutex // contains filtered or unexported fields }
ImmutableForest contains much of the implementation for MutableForest yet it's external API is immutable
func NewImmutableForest ¶ added in v0.24.0
func NewImmutableForest(commitsTree KVCallbackIterableReader, treeDB dbm.DB, cacheSize int, options ...ForestOption) (*ImmutableForest, error)
func (*ImmutableForest) Dump ¶ added in v0.24.0
func (imf *ImmutableForest) Dump() string
Dump a text representation of the the forest. Thread-safe.
func (*ImmutableForest) Iterate ¶ added in v0.24.0
func (imf *ImmutableForest) Iterate(start, end []byte, ascending bool, fn func(prefix []byte, tree KVCallbackIterableReader) error) error
Iterate over the trees in the forest. Thread-safe.
func (*ImmutableForest) Reader ¶ added in v0.24.0
func (imf *ImmutableForest) Reader(prefix []byte) (KVCallbackIterableReader, error)
Get the tree at prefix for making reads. Calls to Reader are thread-safe as are reads from the returned tree.
type ImmutableTree ¶ added in v0.24.0
type ImmutableTree struct {
*iavl.ImmutableTree
}
func (*ImmutableTree) Get ¶ added in v0.24.0
func (imt *ImmutableTree) Get(key []byte) ([]byte, error)
type KVCallbackIterable ¶ added in v0.24.0
type KVCallbackIterable interface { // low must be lexicographically less than high. high is exclusive unless it is nil in which case it is inclusive. // ascending == false reverses order. Iterate(low, high []byte, ascending bool, fn func(key []byte, value []byte) error) error }
Provides the native iteration for IAVLTree
type KVCallbackIterableReader ¶ added in v0.24.0
type KVCallbackIterableReader interface { KVReader KVCallbackIterable }
type KVIterable ¶
type KVIterable interface { // Iterator over a domain of keys in ascending order. high is exclusive. // low must be less than high, or the Iterator is invalid. // Iterator must be closed by caller. // To iterate over entire domain, use store.Iterator(nil, nil) // CONTRACT: No writes may happen within a domain while an iterator exists over it. Iterator(low, high []byte) (KVIterator, error) // Iterator over a domain of keys in descending order. high is exclusive. // must be less than high, or the Iterator is invalid. // Iterator must be closed by caller. // CONTRACT: No writes may happen within a domain while an iterator exists over it. ReverseIterator(low, high []byte) (KVIterator, error) }
This is partially extracted from Cosmos SDK for alignment but is more minimal, we should suggest this becomes an embedded interface
type KVIterableReader ¶
type KVIterableReader interface { KVReader KVIterable }
type KVIterator ¶
type KVReaderWriter ¶
KVStore is a simple interface to get/set data
type KVStore ¶
type KVStore interface { KVReaderWriter KVIterable }
type KeyFormat ¶
type KeyFormat struct {
// contains filtered or unexported fields
}
Provides a fixed-width lexicographically sortable []byte key format
func NewKeyFormat ¶
Create a []byte key format based on a single byte prefix and fixed width key segments each of whose length is specified by by the corresponding element of layout. A final segment length of 0 can be used to indicate a variadic final element that may be of arbitrary length.
For example, to store keys that could index some objects by a version number and their SHA256 hash using the form: 'c<version uint64><hash [32]byte>' then you would define the KeyFormat with:
var keyFormat = NewKeyFormat('c', 8, 32)
Then you can create a key with:
func ObjectKey(version uint64, objectBytes []byte) []byte { hasher := sha256.New() hasher.Sum(nil) return keyFormat.Key(version, hasher.Sum(nil)) }}
func (*KeyFormat) Fix ¶
Fixes the first args many segments as the prefix of a new KeyFormat by using the args to generate a key that becomes that prefix. Any remaining unassigned segments become the layout of the new KeyFormat.
func (*KeyFormat) Iterator ¶
func (kf *KeyFormat) Iterator(iterable KVIterable, start, end []byte, reverse ...bool) (KVIterator, error)
Returns an iterator over the underlying iterable using this KeyFormat's prefix. This is to support proper iteration over the prefix in the presence of nil start or end which requests iteration to the inclusive edges of the domain. An optional argument for reverse can be passed to get reverse iteration.
func (*KeyFormat) Key ¶
Format the args passed into the key format - will panic if the arguments passed do not match the length of the segment to which they correspond. When called with no arguments returns the raw prefix (useful as a start element of the entire keys space when sorted lexicographically).
func (*KeyFormat) KeyBytes ¶
Format the byte segments into the key format - will panic if the segment lengths do not match the layout.
func (*KeyFormat) KeyNoPrefix ¶ added in v0.24.0
Like Key but removes the prefix string
func (*KeyFormat) NumSegments ¶
func (*KeyFormat) Prefix ¶
Return the Key as a prefix - may just be the literal prefix, or an entire key
func (*KeyFormat) Scan ¶
Extracts the segments into the values pointed to by each of args. Each arg must be a pointer to int64, uint64, or []byte, and the width of the args must match layout.
func (*KeyFormat) ScanBytes ¶
Reads out the bytes associated with each segment of the key format from key.
func (*KeyFormat) ScanNoPrefix ¶ added in v0.24.0
Like Scan but adds expects a key with the KeyFormat's prefix trimmed
func (*KeyFormat) Unprefixed ¶
type MustKeyFormat ¶
type MustKeyFormat struct {
KeyFormat
}
MustKeyFormat for panicking early when a KeyFormat does not parse
func NewMustKeyFormat ¶
func NewMustKeyFormat(prefix string, layout ...int) *MustKeyFormat
func (*MustKeyFormat) Fix ¶
func (kf *MustKeyFormat) Fix(args ...interface{}) *MustKeyFormat
func (*MustKeyFormat) Key ¶
func (kf *MustKeyFormat) Key(args ...interface{}) []byte
func (*MustKeyFormat) KeyBytes ¶
func (kf *MustKeyFormat) KeyBytes(segments ...[]byte) []byte
func (*MustKeyFormat) KeyNoPrefix ¶ added in v0.24.0
func (kf *MustKeyFormat) KeyNoPrefix(args ...interface{}) Prefix
func (*MustKeyFormat) Unprefixed ¶ added in v0.24.0
func (kf *MustKeyFormat) Unprefixed() *MustKeyFormat
type MutableForest ¶ added in v0.24.0
type MutableForest struct { // Much of the implementation of MutableForest is contained in ImmutableForest which is embedded here and used // mutable via its private API. This embedded instance holds a reference to commitsTree above. ImmutableForest // Synchronises dirty state sync.RWMutex // contains filtered or unexported fields }
func NewMutableForest ¶ added in v0.24.0
func NewMutableForest(db dbm.DB, cacheSize int) (*MutableForest, error)
Create a new MutableForest against the backing database with tree cache and node caches of size cacheSize.
MutableForest is concurrency safe for all reads and writes. Most read operations are designed to be lock-free. Writes are accumulated within a mutable 'head' until MutableForest.Save is called. Read operations bypass the mutable pending state and read from the last good committed state.
func (*MutableForest) Delete ¶ added in v0.24.0
func (muf *MutableForest) Delete(prefix []byte) (*CommitID, error)
Delete a tree from forest. If the tree exists will return the CommitID of the latest saved version.
func (*MutableForest) GetImmutable ¶ added in v0.24.0
func (muf *MutableForest) GetImmutable(version int64) (*ImmutableForest, error)
Get an immutable snapshot of tree state at the given previously committed version.
func (*MutableForest) Hash ¶ added in v0.24.0
func (muf *MutableForest) Hash() []byte
Get the current global hash for all trees in this forest.
func (*MutableForest) IterateRWTree ¶ added in v0.27.0
func (muf *MutableForest) IterateRWTree(start, end []byte, ascending bool, fn func(prefix []byte, tree *RWTree) error) error
Iterate trees in forest
func (*MutableForest) Load ¶ added in v0.24.0
func (muf *MutableForest) Load(version int64) error
Load mutable forest from database.
func (*MutableForest) Save ¶ added in v0.24.0
func (muf *MutableForest) Save() (hash []byte, version int64, _ error)
Save accumulated writes into the latest version of the forest.
func (*MutableForest) Version ¶ added in v0.24.0
func (muf *MutableForest) Version() int64
Get the current global version for all versions of all trees in this forest.
type MutableTree ¶ added in v0.24.0
type MutableTree struct {
*iavl.MutableTree
}
We wrap IAVL's tree types in order to implement standard DB interface and iteration helpers
func NewMutableTree ¶ added in v0.24.0
func NewMutableTree(db dbm.DB, cacheSize int) (*MutableTree, error)
func (*MutableTree) GetImmutable ¶ added in v0.24.0
func (mut *MutableTree) GetImmutable(version int64) (*ImmutableTree, error)
func (*MutableTree) IterateWriteTree ¶ added in v0.24.0
type Prefix ¶
type Prefix []byte
func (Prefix) Above ¶
Get the lexicographical sibling above this prefix (i.e. the fixed length integer plus one)
func (Prefix) Below ¶
Get the lexicographical sibling below this prefix (i.e. the fixed length integer minus one)
func (Prefix) CallbackIterable ¶ added in v0.24.0
func (p Prefix) CallbackIterable(source KVCallbackIterable) *prefixCallbackIterable
func (Prefix) Iterable ¶
func (p Prefix) Iterable(source KVIterable) KVIterable
type PrefixDB ¶
type PrefixDB struct {
// contains filtered or unexported fields
}
func (*PrefixDB) DeleteSync ¶
func (*PrefixDB) ReverseIterator ¶
func (pdb *PrefixDB) ReverseIterator(low, high []byte) (KVIterator, error)
type RWTree ¶
type RWTree struct { // Synchronise 'write side access' - i.e. to the write tree and updated flag (which only read-locks this mutex) sync.RWMutex // contains filtered or unexported fields }
RWTree provides an abstraction over IAVL that maintains separate read and write paths. Reads are routed to the most recently saved version of the tree - which provides immutable access. Writes are routed to a working tree that is mutable. On save the working tree is saved to DB, frozen, and replaces the previous immutable read tree.
func NewRWTree ¶
Creates a concurrency safe version of an IAVL tree whereby writes go a latest working tree and reads are routed to the last saved tree. All methods are safe for multiple readers and writers.
func (*RWTree) GetImmutable ¶ added in v0.24.0
func (rwt *RWTree) GetImmutable(version int64) (*ImmutableTree, error)
func (*RWTree) IterateWriteTree ¶ added in v0.24.0
func (*RWTree) Load ¶
Tries to load the execution state from DB, returns nil with no error if no state found