cosmos-sdk/iavl/internal/node_pointer.go

36 lines
940 B
Go

package internal
import (
"fmt"
"sync/atomic"
)
// NodePointer is a pointer to a Node, which may be either in-memory, on-disk or both.
type NodePointer struct {
mem atomic.Pointer[MemNode]
changeset *Changeset
fileIdx uint32 // absolute index in file, 1-based, zero means we don't have an offset
id NodeID
}
// NewNodePointer creates a new NodePointer pointing to the given in-memory node.
func NewNodePointer(memNode *MemNode) *NodePointer {
n := &NodePointer{}
n.mem.Store(memNode)
return n
}
// Resolve resolves the NodePointer to a Node, loading from memory or disk as necessary.
func (p *NodePointer) Resolve() (Node, error) {
mem := p.mem.Load()
if mem != nil {
return mem, nil
}
return p.changeset.Resolve(p.id, p.fileIdx)
}
// String implements the fmt.Stringer interface.
func (p *NodePointer) String() string {
return fmt.Sprintf("NodePointer{id: %s, fileIdx: %d}", p.id.String(), p.fileIdx)
}