Documentation
¶
Index ¶
- Constants
- Variables
- func EncodeBytes(w io.Writer, bz []byte) error
- func GetLatestVersion(dir string) (int64, error)
- func HashNode(node Node) []byte
- func Mmap(f *os.File) ([]byte, *[mmap.MaxMapSize]byte, error)
- func NewCache(cacheSize int) cache.Cache
- func VerifyHash(node Node) bool
- func WriteFileSync(name string, data []byte) error
- type DB
- func (db *DB) ApplyChangeSet(name string, changeSet iavl.ChangeSet) error
- func (db *DB) ApplyChangeSets(changeSets []*proto.NamedChangeSet) error
- func (db *DB) ApplyUpgrades(upgrades []*proto.TreeNameUpgrade) error
- func (db *DB) Close() error
- func (db *DB) Commit() (int64, error)
- func (db *DB) CommittedVersion() (int64, error)
- func (db *DB) Copy() *DB
- func (db *DB) LastCommitInfo() *proto.CommitInfo
- func (db *DB) ReadOnly() bool
- func (db *DB) Reload() error
- func (db *DB) RewriteSnapshot() error
- func (db *DB) RewriteSnapshotBackground() error
- func (db *DB) SaveVersion(updateCommitInfo bool) (int64, error)
- func (db *DB) SetInitialVersion(initialVersion int64) error
- func (db *DB) TreeByName(name string) *Tree
- func (db *DB) UpdateCommitInfo()
- func (db *DB) Version() int64
- func (db *DB) WorkingCommitInfo() *proto.CommitInfo
- func (db *DB) WriteSnapshot(dir string) error
- type ExportNode
- type Exporter
- type FileLock
- type Iterator
- type LeafLayout
- type Leaves
- type MemNode
- func (node *MemNode) Get(key []byte) ([]byte, uint32)
- func (node *MemNode) GetByIndex(index uint32) ([]byte, []byte)
- func (node *MemNode) Hash() []byte
- func (node *MemNode) Height() uint8
- func (node *MemNode) IsLeaf() bool
- func (node *MemNode) Key() []byte
- func (node *MemNode) Left() Node
- func (node *MemNode) Mutate(version, cowVersion uint32) *MemNode
- func (node *MemNode) Right() Node
- func (node *MemNode) SafeHash() []byte
- func (node *MemNode) Size() int64
- func (node *MemNode) Value() []byte
- func (node *MemNode) Version() uint32
- type MmapFile
- type MultiTree
- func (t *MultiTree) ApplyChangeSet(name string, changeSet iavl.ChangeSet) error
- func (t *MultiTree) ApplyChangeSets(changeSets []*proto.NamedChangeSet) error
- func (t *MultiTree) ApplyUpgrades(upgrades []*proto.TreeNameUpgrade) error
- func (t *MultiTree) Catchup(rlogManager *rlog.Manager, endVersion int64) error
- func (t *MultiTree) Close() error
- func (t *MultiTree) Copy(cacheSize int) *MultiTree
- func (t *MultiTree) LastCommitInfo() *proto.CommitInfo
- func (t *MultiTree) SaveVersion(updateCommitInfo bool) (int64, error)
- func (t *MultiTree) SetInitialVersion(initialVersion int64) error
- func (t *MultiTree) SetZeroCopy(zeroCopy bool)
- func (t *MultiTree) SnapshotVersion() int64
- func (t *MultiTree) TreeByName(name string) *Tree
- func (t *MultiTree) Trees() []NamedTree
- func (t *MultiTree) UpdateCommitInfo()
- func (t *MultiTree) Version() int64
- func (t *MultiTree) WorkingCommitInfo() *proto.CommitInfo
- func (t *MultiTree) WriteSnapshot(dir string, wp *pond.WorkerPool) error
- type MultiTreeExporter
- type MultiTreeImporter
- type NamedTree
- type Node
- type NodeLayout
- type Nodes
- type Options
- type PersistedNode
- func (node PersistedNode) Get(key []byte) ([]byte, uint32)
- func (node PersistedNode) GetByIndex(leafIndex uint32) ([]byte, []byte)
- func (node PersistedNode) Hash() []byte
- func (node PersistedNode) Height() uint8
- func (node PersistedNode) IsLeaf() bool
- func (node PersistedNode) Key() []byte
- func (node PersistedNode) Left() Node
- func (node PersistedNode) Mutate(version, _ uint32) *MemNode
- func (node PersistedNode) Right() Node
- func (node PersistedNode) SafeHash() []byte
- func (node PersistedNode) Size() int64
- func (node PersistedNode) Value() []byte
- func (node PersistedNode) Version() uint32
- type Snapshot
- func (snapshot *Snapshot) Close() error
- func (snapshot *Snapshot) Export() *Exporter
- func (snapshot *Snapshot) IsEmpty() bool
- func (snapshot *Snapshot) Key(offset uint64) []byte
- func (snapshot *Snapshot) KeyValue(offset uint64) ([]byte, []byte)
- func (snapshot *Snapshot) Leaf(index uint32) PersistedNode
- func (snapshot *Snapshot) LeafKey(index uint32) []byte
- func (snapshot *Snapshot) LeafKeyValue(index uint32) ([]byte, []byte)
- func (snapshot *Snapshot) Node(index uint32) PersistedNode
- func (snapshot *Snapshot) RootHash() []byte
- func (snapshot *Snapshot) RootNode() PersistedNode
- func (snapshot *Snapshot) ScanNodes(callback func(node PersistedNode) error) error
- func (snapshot *Snapshot) Version() uint32
- type Tree
- func (t *Tree) ApplyChangeSet(changeSet iavl.ChangeSet)
- func (t *Tree) Close() error
- func (t *Tree) Copy(cacheSize int) *Tree
- func (t *Tree) Export() *Exporter
- func (t *Tree) Get(key []byte) []byte
- func (t *Tree) GetByIndex(index int64) ([]byte, []byte)
- func (t *Tree) GetMembershipProof(key []byte) (*ics23.CommitmentProof, error)
- func (t *Tree) GetNonMembershipProof(key []byte) (*ics23.CommitmentProof, error)
- func (t *Tree) GetWithIndex(key []byte) (int64, []byte)
- func (t *Tree) Has(key []byte) bool
- func (t *Tree) IsEmpty() bool
- func (t *Tree) Iterator(start, end []byte, ascending bool) *Iterator
- func (t *Tree) RootHash() []byte
- func (t *Tree) SaveVersion(updateHash bool) ([]byte, int64, error)
- func (t *Tree) ScanPostOrder(callback func(node Node) bool)
- func (t *Tree) SetInitialVersion(initialVersion int64) error
- func (t *Tree) SetZeroCopy(zeroCopy bool)
- func (t *Tree) VerifyMembership(proof *ics23.CommitmentProof, key []byte) bool
- func (t *Tree) VerifyNonMembership(proof *ics23.CommitmentProof, key []byte) bool
- func (t *Tree) Version() int64
- func (t *Tree) WriteSnapshot(snapshotDir string) error
- type TreeImporter
Constants ¶
const ( DefaultSnapshotInterval = 10000 LockFileName = "LOCK" DefaultSnapshotWriterLimit = 4 )
const ( SnapshotPrefix = "snapshot-" SnapshotDirLen = len(SnapshotPrefix) + 20 )
const ( OffsetHeight = 0 OffsetPreTrees = OffsetHeight + 1 OffsetVersion = OffsetHeight + 4 OffsetSize = OffsetVersion + 4 OffsetKeyLeaf = OffsetSize + 4 OffsetHash = OffsetKeyLeaf + 4 SizeHash = sha256.Size SizeNodeWithoutHash = OffsetHash SizeNode = SizeNodeWithoutHash + SizeHash OffsetLeafVersion = 0 OffsetLeafKeyLen = OffsetLeafVersion + 4 OffsetLeafKeyOffset = OffsetLeafKeyLen + 4 OffsetLeafHash = OffsetLeafKeyOffset + 8 SizeLeafWithoutHash = OffsetLeafHash SizeLeaf = SizeLeafWithoutHash + SizeHash )
const ( // SnapshotFileMagic is little endian encoded b"IAVL" SnapshotFileMagic = 1280721225 // the initial snapshot format SnapshotFormat = 0 // magic: uint32, format: uint32, version: uint32 SizeMetadata = 12 FileNameNodes = "nodes" FileNameLeaves = "leaves" FileNameKVs = "kvs" FileNameMetadata = "metadata" )
const MetadataFileName = "__metadata"
Variables ¶
var ErrorExportDone = errors.New("export is complete")
ErrorExportDone is returned by Exporter.Next() when all items have been exported.
Functions ¶
func EncodeBytes ¶
EncodeBytes writes a varint length-prefixed byte slice to the writer, it's used for hash computation, must be compactible with the official IAVL implementation.
func GetLatestVersion ¶
GetLatestVersion finds the latest version number without loading the whole db, it's needed for upgrade module to check store upgrades, it returns 0 if db doesn't exist or is empty.
func VerifyHash ¶
VerifyHash compare node's cached hash with computed one
func WriteFileSync ¶
WriteFileSync calls `f.Sync` after before closing the file
Types ¶
type DB ¶
type DB struct {
MultiTree
// contains filtered or unexported fields
}
DB implements DB-like functionalities on top of MultiTree: - async snapshot rewriting - Write-ahead-log
The memiavl.db directory looks like this: ``` > current -> snapshot-N > snapshot-N > bank > kvs > nodes > metadata > acc > ... other stores > rlog ```
func (*DB) ApplyChangeSet ¶
ApplyChangeSet wraps MultiTree.ApplyChangeSet, it also appends the changesets in the pending log, which will be persisted to the rlog in next Commit call.
func (*DB) ApplyChangeSets ¶
func (db *DB) ApplyChangeSets(changeSets []*proto.NamedChangeSet) error
ApplyChangeSets wraps MultiTree.ApplyChangeSets, it also appends the changesets in the pending log, which will be persisted to the rlog in next Commit call.
func (*DB) ApplyUpgrades ¶
func (db *DB) ApplyUpgrades(upgrades []*proto.TreeNameUpgrade) error
ApplyUpgrades wraps MultiTree.ApplyUpgrades, it also appends the upgrades in a pending log, which will be persisted to the rlog in next Commit call.
func (*DB) Commit ¶
Commit wraps SaveVersion to bump the version and writes the pending changes into log files to persist on disk
func (*DB) CommittedVersion ¶
CommittedVersion returns the latest version written in rlog file, or snapshot version if rlog is empty.
func (*DB) LastCommitInfo ¶
func (db *DB) LastCommitInfo() *proto.CommitInfo
LastCommitInfo returns the last commit info.
func (*DB) RewriteSnapshot ¶
RewriteSnapshot writes the current version of memiavl into a snapshot, and update the `current` symlink.
func (*DB) RewriteSnapshotBackground ¶
RewriteSnapshotBackground rewrite snapshot in a background goroutine, `Commit` will check the complete status, and switch to the new snapshot.
func (*DB) SetInitialVersion ¶
SetInitialVersion wraps `MultiTree.SetInitialVersion`. it will do a snapshot rewrite, because we can't use rlog to record this change, we need it to convert versions to rlog index in the first place.
func (*DB) TreeByName ¶
TreeByName wraps MultiTree.TreeByName to add a lock.
func (*DB) UpdateCommitInfo ¶
func (db *DB) UpdateCommitInfo()
UpdateCommitInfo wraps MultiTree.UpdateCommitInfo to add a lock.
func (*DB) WorkingCommitInfo ¶
func (db *DB) WorkingCommitInfo() *proto.CommitInfo
func (*DB) WriteSnapshot ¶
WriteSnapshot wraps MultiTree.WriteSnapshot to add a lock.
type ExportNode ¶
ExportNode contains exported node data.
type Exporter ¶
type Exporter struct {
// contains filtered or unexported fields
}
func (*Exporter) Close ¶
func (e *Exporter) Close()
Close closes the exporter. It is safe to call multiple times.
func (*Exporter) Next ¶
func (e *Exporter) Next() (*ExportNode, error)
type Iterator ¶
type Iterator struct {
// contains filtered or unexported fields
}
func NewIterator ¶
type LeafLayout ¶
type LeafLayout struct {
// contains filtered or unexported fields
}
func (LeafLayout) Hash ¶
func (leaf LeafLayout) Hash() []byte
func (LeafLayout) KeyLength ¶
func (leaf LeafLayout) KeyLength() uint32
func (LeafLayout) KeyOffset ¶
func (leaf LeafLayout) KeyOffset() uint64
func (LeafLayout) Version ¶
func (leaf LeafLayout) Version() uint32
type Leaves ¶
type Leaves struct {
// contains filtered or unexported fields
}
Leaves is a continuously stored IAVL nodes
func (Leaves) Leaf ¶
func (leaves Leaves) Leaf(i uint32) LeafLayout
type MemNode ¶
type MemNode struct {
// contains filtered or unexported fields
}
func (*MemNode) Hash ¶
Computes the hash of the node without computing its descendants. Must be called on nodes which have descendant node hashes already computed.
type MmapFile ¶
type MmapFile struct {
// contains filtered or unexported fields
}
MmapFile manage the resources of a mmap-ed file
type MultiTree ¶
type MultiTree struct {
// contains filtered or unexported fields
}
MultiTree manages multiple memiavl tree together, all the trees share the same latest version, the snapshots are always created at the same version.
The snapshot structure is like this: ``` > snapshot-V > metadata > bank > kvs > nodes > metadata > acc > other stores... ```
func LoadMultiTree ¶
func NewEmptyMultiTree ¶
func (*MultiTree) ApplyChangeSet ¶
ApplyChangeSet applies change set for a single tree.
func (*MultiTree) ApplyChangeSets ¶
func (t *MultiTree) ApplyChangeSets(changeSets []*proto.NamedChangeSet) error
ApplyChangeSets applies change sets for multiple trees.
func (*MultiTree) ApplyUpgrades ¶
func (t *MultiTree) ApplyUpgrades(upgrades []*proto.TreeNameUpgrade) error
ApplyUpgrades store name upgrades
func (*MultiTree) Catchup ¶ added in v0.0.4
Catchup replay the new entries in the Rlog file on the tree to catch up to the target or latest version.
func (*MultiTree) Copy ¶
Copy returns a snapshot of the tree which won't be corrupted by further modifications on the main tree.
func (*MultiTree) LastCommitInfo ¶
func (t *MultiTree) LastCommitInfo() *proto.CommitInfo
func (*MultiTree) SaveVersion ¶
SaveVersion bumps the versions of all the stores and optionally returns the new app hash
func (*MultiTree) SetInitialVersion ¶
func (*MultiTree) SetZeroCopy ¶
func (*MultiTree) SnapshotVersion ¶
func (*MultiTree) TreeByName ¶
TreeByName returns the tree by name, returns nil if not found
func (*MultiTree) UpdateCommitInfo ¶
func (t *MultiTree) UpdateCommitInfo()
UpdateCommitInfo update lastCommitInfo based on current status of trees. it's needed if `updateCommitInfo` is set to `false` in `ApplyChangeSet`.
func (*MultiTree) WorkingCommitInfo ¶
func (t *MultiTree) WorkingCommitInfo() *proto.CommitInfo
WorkingCommitInfo returns the commit info for the working tree
func (*MultiTree) WriteSnapshot ¶
func (t *MultiTree) WriteSnapshot(dir string, wp *pond.WorkerPool) error
type MultiTreeExporter ¶
type MultiTreeExporter struct {
// contains filtered or unexported fields
}
func NewMultiTreeExporter ¶
func NewMultiTreeExporter(dir string, version uint32, supportExportNonSnapshotVersion bool) (exporter *MultiTreeExporter, err error)
func (*MultiTreeExporter) Close ¶
func (mte *MultiTreeExporter) Close() error
func (*MultiTreeExporter) Next ¶
func (mte *MultiTreeExporter) Next() (interface{}, error)
type MultiTreeImporter ¶
type MultiTreeImporter struct {
// contains filtered or unexported fields
}
func NewMultiTreeImporter ¶
func NewMultiTreeImporter(dir string, height uint64) (*MultiTreeImporter, error)
func (*MultiTreeImporter) Add ¶
func (mti *MultiTreeImporter) Add(item interface{}) error
func (*MultiTreeImporter) AddNode ¶
func (mti *MultiTreeImporter) AddNode(node *ExportNode)
func (*MultiTreeImporter) AddTree ¶
func (mti *MultiTreeImporter) AddTree(name string) error
func (*MultiTreeImporter) Close ¶
func (mti *MultiTreeImporter) Close() error
func (*MultiTreeImporter) Finalize ¶
func (mti *MultiTreeImporter) Finalize() error
type Node ¶
type Node interface {
Height() uint8
IsLeaf() bool
Size() int64
Version() uint32
Key() []byte
Value() []byte
Left() Node
Right() Node
Hash() []byte
// SafeHash returns byte slice that's safe to retain
SafeHash() []byte
// PersistedNode clone a new node, MemNode modify in place
Mutate(version, cowVersion uint32) *MemNode
// Get query the value for a key, it's put into interface because a specialized implementation is more efficient.
Get(key []byte) ([]byte, uint32)
GetByIndex(uint32) ([]byte, []byte)
}
Node interface encapsulate the interface of both PersistedNode and MemNode.
type NodeLayout ¶
type NodeLayout struct {
// contains filtered or unexported fields
}
see comment of `PersistedNode`
func (NodeLayout) Hash ¶
func (node NodeLayout) Hash() []byte
func (NodeLayout) Height ¶
func (node NodeLayout) Height() uint8
func (NodeLayout) KeyLeaf ¶
func (node NodeLayout) KeyLeaf() uint32
func (NodeLayout) PreTrees ¶
func (node NodeLayout) PreTrees() uint8
func (NodeLayout) Size ¶
func (node NodeLayout) Size() uint32
func (NodeLayout) Version ¶
func (node NodeLayout) Version() uint32
type Nodes ¶
type Nodes struct {
// contains filtered or unexported fields
}
Nodes is a continuously stored IAVL nodes
func (Nodes) Node ¶
func (nodes Nodes) Node(i uint32) NodeLayout
type Options ¶
type Options struct {
Logger logger.Logger
CreateIfMissing bool
InitialVersion uint32
ReadOnly bool
// the initial stores when initialize the empty instance
InitialStores []string
SnapshotKeepRecent uint32
SnapshotInterval uint32
TriggerStateSyncExport func(height int64)
// load the target version instead of latest version
TargetVersion uint32
// Buffer size for the asynchronous commit queue, -1 means synchronous commit,
// default to 0.
AsyncCommitBuffer int
// ZeroCopy if true, the get and iterator methods could return a slice pointing to mmaped blob files.
ZeroCopy bool
// CacheSize defines the cache's max entry size for each memiavl store.
CacheSize int
// LoadForOverwriting if true rollbacks the state, specifically the Load method will
// truncate the versions after the `TargetVersion`, the `TargetVersion` becomes the latest version.
// it do nothing if the target version is `0`.
LoadForOverwriting bool
// Limit the number of concurrent snapshot writers
SnapshotWriterLimit int
// SDK46Compatible defines if the root hash is compatible with cosmos-sdk 0.46 and before.
SdkBackwardCompatible bool
// ExportNonSnapshotVersion if true, the state snapshot can be exported at any version
ExportNonSnapshotVersion bool
}
func (*Options) FillDefaults ¶
func (opts *Options) FillDefaults()
type PersistedNode ¶
type PersistedNode struct {
// contains filtered or unexported fields
}
PersistedNode is backed by serialized byte array, usually mmap-ed from disk file. Encoding format (all integers are encoded in little endian):
Branch node: - height : 1 - preTrees : 1 - _padding : 2 - version : 4 - size : 4 - key node : 4 // node index of the smallest leaf in right branch - hash : 32 Leaf node: - version : 4 - key len : 4 - key offset : 8 - hash : 32
func (PersistedNode) GetByIndex ¶
func (node PersistedNode) GetByIndex(leafIndex uint32) ([]byte, []byte)
func (PersistedNode) Hash ¶
func (node PersistedNode) Hash() []byte
func (PersistedNode) Height ¶
func (node PersistedNode) Height() uint8
func (PersistedNode) IsLeaf ¶
func (node PersistedNode) IsLeaf() bool
func (PersistedNode) Key ¶
func (node PersistedNode) Key() []byte
func (PersistedNode) Left ¶
func (node PersistedNode) Left() Node
Left result is not defined for leaf nodes.
func (PersistedNode) Mutate ¶
func (node PersistedNode) Mutate(version, _ uint32) *MemNode
func (PersistedNode) Right ¶
func (node PersistedNode) Right() Node
Right result is not defined for leaf nodes.
func (PersistedNode) SafeHash ¶
func (node PersistedNode) SafeHash() []byte
func (PersistedNode) Size ¶
func (node PersistedNode) Size() int64
func (PersistedNode) Value ¶
func (node PersistedNode) Value() []byte
Value returns nil for non-leaf node.
func (PersistedNode) Version ¶
func (node PersistedNode) Version() uint32
type Snapshot ¶
type Snapshot struct {
// contains filtered or unexported fields
}
Snapshot manage the lifecycle of mmap-ed files for the snapshot, it must out live the objects that derived from it.
func NewEmptySnapshot ¶
func OpenSnapshot ¶
OpenSnapshot parse the version number and the root node index from metadata file, and mmap the other files.
func (*Snapshot) Export ¶
Export exports the nodes from snapshot file sequentially, more efficient than a post-order traversal.
func (*Snapshot) Leaf ¶
func (snapshot *Snapshot) Leaf(index uint32) PersistedNode
Leaf returns the leaf node by index
func (*Snapshot) LeafKeyValue ¶
func (*Snapshot) Node ¶
func (snapshot *Snapshot) Node(index uint32) PersistedNode
Node returns the branch node by index
func (*Snapshot) RootNode ¶
func (snapshot *Snapshot) RootNode() PersistedNode
RootNode returns the root node
type Tree ¶
type Tree struct {
// contains filtered or unexported fields
}
verify change sets by replay them to rebuild iavl tree and verify the root hashes
func NewEmptyTree ¶
NewEmptyTree creates an empty tree at an arbitrary version.
func NewFromSnapshot ¶
NewFromSnapshot mmap the blob files and create the root node.
func NewWithInitialVersion ¶
New creates a empty tree with initial-version, it happens when a new store created at the middle of the chain.
func (*Tree) ApplyChangeSet ¶
ApplyChangeSet apply the change set of a whole version, and update hashes.
func (*Tree) Copy ¶
Copy returns a snapshot of the tree which won't be modified by further modifications on the main tree, the returned new tree can be accessed concurrently with the main tree.
func (*Tree) Export ¶
Export returns a snapshot of the tree which won't be corrupted by further modifications on the main tree.
func (*Tree) GetMembershipProof ¶
func (t *Tree) GetMembershipProof(key []byte) (*ics23.CommitmentProof, error)
GetMembershipProof will produce a CommitmentProof that the given key (and queries value) exists in the iavl tree. If the key doesn't exist in the tree, this will return an error.
func (*Tree) GetNonMembershipProof ¶
func (t *Tree) GetNonMembershipProof(key []byte) (*ics23.CommitmentProof, error)
GetNonMembershipProof will produce a CommitmentProof that the given key doesn't exist in the iavl tree. If the key exists in the tree, this will return an error.
func (*Tree) RootHash ¶
RootHash updates the hashes and return the current root hash, it clones the persisted node's bytes, so the returned bytes is safe to retain.
func (*Tree) SaveVersion ¶
SaveVersion increases the version number and optionally updates the hashes
func (*Tree) ScanPostOrder ¶
ScanPostOrder scans the tree in post-order, and call the callback function on each node. If the callback function returns false, the scan will be stopped.
func (*Tree) SetInitialVersion ¶
func (*Tree) SetZeroCopy ¶
func (*Tree) VerifyMembership ¶
func (t *Tree) VerifyMembership(proof *ics23.CommitmentProof, key []byte) bool
VerifyMembership returns true iff proof is an ExistenceProof for the given key.
func (*Tree) VerifyNonMembership ¶
func (t *Tree) VerifyNonMembership(proof *ics23.CommitmentProof, key []byte) bool
VerifyNonMembership returns true iff proof is a NonExistenceProof for the given key.
func (*Tree) WriteSnapshot ¶
WriteSnapshot save the IAVL tree to a new snapshot directory.
type TreeImporter ¶
type TreeImporter struct {
// contains filtered or unexported fields
}
TreeImporter import a single memiavl tree from state-sync snapshot
func NewTreeImporter ¶
func NewTreeImporter(dir string, version int64) *TreeImporter
func (*TreeImporter) Add ¶
func (ai *TreeImporter) Add(node *ExportNode)
func (*TreeImporter) Close ¶
func (ai *TreeImporter) Close() error