Documentation
¶
Overview ¶
Package block defines a common pattern for interacting with block reference structures in Hydra and in memory.
Index ¶
- Constants
- Variables
- func ApplySubBlock[T SubBlock](r *T, next SubBlock) error
- func CloneBlock(blk any) (any, error)
- func CompareNamedSubBlocks[T ComparableNamedSubBlock](a, b []T) (added, removed, changed []T)
- func IsNamedSubBlocksSorted[T NamedSubBlock](namedSubBlocks []T) bool
- func MarshalBlockRefJSON(ref *BlockRef) ([]byte, error)
- func NewTransaction(store StoreOps, transformer Transformer, rootRef *BlockRef, putOpts *PutOpts) (*Transaction, *Cursor)
- func SortNamedSubBlocks[T NamedSubBlock](namedSubBlocks []T)
- func UnmarshalBlock[T Block](ctx context.Context, bcs *Cursor, ctor func() Block) (T, error)
- type Block
- type BlockRef
- func BuildBlockRef(data []byte, putOpts *PutOpts) (*BlockRef, error)
- func CloneBlockRefs(refs []*BlockRef) []*BlockRef
- func ExtractBlockRefs(blk any) ([]*BlockRef, error)
- func NewBlockRef(hash *hash.Hash) *BlockRef
- func PutBlock(ctx context.Context, bk StoreOps, b Block) (*BlockRef, bool, error)
- func UnmarshalBlockRefB58(ref string) (*BlockRef, error)
- func UnmarshalBlockRefBlock(ctx context.Context, bcs *Cursor) (*BlockRef, error)
- func UnmarshalBlockRefJSON(data []byte) (*BlockRef, error)
- func (b *BlockRef) ApplyBlockRef(id uint32, ptr *BlockRef) error
- func (b *BlockRef) Clone() *BlockRef
- func (m *BlockRef) CloneMessageVT() protobuf_go_lite.CloneMessage
- func (m *BlockRef) CloneVT() *BlockRef
- func (this *BlockRef) EqualMessageVT(thatMsg any) bool
- func (this *BlockRef) EqualVT(that *BlockRef) bool
- func (b *BlockRef) EqualsRef(oref *BlockRef) bool
- func (b *BlockRef) GetBlockRefCtor(id uint32) Ctor
- func (b *BlockRef) GetBlockRefs() (map[uint32]*BlockRef, error)
- func (b *BlockRef) GetEmpty() bool
- func (x *BlockRef) GetHash() *hash.Hash
- func (b *BlockRef) LessThan(other *BlockRef) bool
- func (b *BlockRef) MarshalBlock() ([]byte, error)
- func (b *BlockRef) MarshalJSON() ([]byte, error)
- func (b *BlockRef) MarshalKey() ([]byte, error)
- func (b *BlockRef) MarshalLog() string
- func (b *BlockRef) MarshalProtoJSON(s *json.MarshalState)
- func (x *BlockRef) MarshalProtoText() string
- func (b *BlockRef) MarshalString() string
- func (m *BlockRef) MarshalToSizedBufferVT(dAtA []byte) (int, error)
- func (m *BlockRef) MarshalToVT(dAtA []byte) (int, error)
- func (m *BlockRef) MarshalVT() (dAtA []byte, err error)
- func (b *BlockRef) ParseFromB58(ref string) error
- func (*BlockRef) ProtoMessage()
- func (x *BlockRef) Reset()
- func (m *BlockRef) SizeVT() (n int)
- func (x *BlockRef) String() string
- func (b *BlockRef) UnmarshalBlock(data []byte) error
- func (b *BlockRef) UnmarshalJSON(dat []byte) error
- func (b *BlockRef) UnmarshalProtoJSON(s *json.UnmarshalState)
- func (m *BlockRef) UnmarshalVT(dAtA []byte) error
- func (b *BlockRef) Validate(allowEmpty bool) error
- func (b *BlockRef) VerifyData(data []byte, errDetails bool) error
- type BlockStat
- type BlockWithAttributes
- type BlockWithClone
- type BlockWithCloneVT
- type BlockWithPreWriteHook
- type BlockWithRefs
- type BlockWithSubBlocks
- type BufferedStore
- func (s *BufferedStore) BeginDeferFlush()
- func (s *BufferedStore) EndDeferFlush(ctx context.Context) error
- func (s *BufferedStore) Flush(ctx context.Context) error
- func (s *BufferedStore) GetBlock(ctx context.Context, ref *BlockRef) ([]byte, bool, error)
- func (s *BufferedStore) GetBlockExists(ctx context.Context, ref *BlockRef) (bool, error)
- func (s *BufferedStore) GetBlockExistsBatch(ctx context.Context, refs []*BlockRef) ([]bool, error)
- func (s *BufferedStore) GetHashType() hash.HashType
- func (s *BufferedStore) GetSupportedFeatures() StoreFeature
- func (s *BufferedStore) PutBlock(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
- func (s *BufferedStore) PutBlockBackground(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
- func (s *BufferedStore) PutBlockBatch(ctx context.Context, entries []*PutBatchEntry) error
- func (s *BufferedStore) RmBlock(ctx context.Context, ref *BlockRef) error
- func (s *BufferedStore) StatBlock(ctx context.Context, ref *BlockRef) (*BlockStat, error)
- type BufferedStoreSettings
- type ComparableNamedSubBlock
- type ComparableSubBlock
- type Ctor
- type Cursor
- func (c *Cursor) ClearAllRefs()
- func (c *Cursor) ClearRef(refID uint32)
- func (c *Cursor) CloneBlock() (any, error)
- func (c *Cursor) CopyToRecursive(targetPos *Cursor, cloneBlocks, markDirty bool)
- func (c *Cursor) Detach(keepRefs bool) *Cursor
- func (c *Cursor) DetachRecursive(detachTx, cloneBlocks, markDirty bool) *Cursor
- func (c *Cursor) DetachTransaction() *Cursor
- func (c *Cursor) Fetch(ctx context.Context) ([]byte, bool, error)
- func (c *Cursor) FollowRef(refID uint32, blkRef *BlockRef) *Cursor
- func (c *Cursor) FollowSubBlock(refID uint32) *Cursor
- func (c *Cursor) GetAllRefs(existingOnly bool) (map[uint32]*Cursor, error)
- func (c *Cursor) GetBlock() (any, bool)
- func (c *Cursor) GetBlockStore() (StoreOps, bool)
- func (c *Cursor) GetExistingRef(refID uint32) *Cursor
- func (c *Cursor) GetRef() *BlockRef
- func (c *Cursor) GetTransaction() *Transaction
- func (c *Cursor) IsDirty() bool
- func (c *Cursor) IsSubBlock() bool
- func (c *Cursor) MarkDirty()
- func (c *Cursor) Parents() []*Cursor
- func (c *Cursor) SetAsSubBlock(refID uint32, parent *Cursor) error
- func (c *Cursor) SetBlock(b any, dirty bool)
- func (c *Cursor) SetBlockStore(store StoreOps)
- func (c *Cursor) SetPreWriteHook(h func(b any) error)
- func (c *Cursor) SetRef(refID uint32, cursor *Cursor)
- func (c *Cursor) SetRefAtCursor(ref *BlockRef, clearBlock bool)
- func (c *Cursor) Unmarshal(ctx context.Context, ctor func() Block) (Block, error)
- type NamedSubBlock
- type NopStoreOps
- func (NopStoreOps) BeginDeferFlush()
- func (NopStoreOps) EndDeferFlush(context.Context) error
- func (NopStoreOps) Flush(context.Context) error
- func (NopStoreOps) GetBlock(context.Context, *BlockRef) ([]byte, bool, error)
- func (NopStoreOps) GetBlockExists(context.Context, *BlockRef) (bool, error)
- func (n NopStoreOps) GetBlockExistsBatch(ctx context.Context, refs []*BlockRef) ([]bool, error)
- func (NopStoreOps) GetHashType() hash.HashType
- func (NopStoreOps) GetSupportedFeatures() StoreFeature
- func (NopStoreOps) PutBlock(context.Context, []byte, *PutOpts) (*BlockRef, bool, error)
- func (n NopStoreOps) PutBlockBackground(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
- func (n NopStoreOps) PutBlockBatch(ctx context.Context, entries []*PutBatchEntry) error
- func (NopStoreOps) RmBlock(context.Context, *BlockRef) error
- func (NopStoreOps) StatBlock(context.Context, *BlockRef) (*BlockStat, error)
- type OverlayMode
- func (x OverlayMode) Enum() *OverlayMode
- func (x OverlayMode) MarshalJSON() ([]byte, error)
- func (x OverlayMode) MarshalProtoJSON(s *json.MarshalState)
- func (x OverlayMode) MarshalProtoText() string
- func (x OverlayMode) MarshalText() ([]byte, error)
- func (x OverlayMode) String() string
- func (x *OverlayMode) UnmarshalJSON(b []byte) error
- func (x *OverlayMode) UnmarshalProtoJSON(s *json.UnmarshalState)
- func (x *OverlayMode) UnmarshalText(b []byte) error
- type PutBatchEntry
- type PutOpts
- func (m *PutOpts) CloneMessageVT() protobuf_go_lite.CloneMessage
- func (m *PutOpts) CloneVT() *PutOpts
- func (this *PutOpts) EqualMessageVT(thatMsg any) bool
- func (this *PutOpts) EqualVT(that *PutOpts) bool
- func (x *PutOpts) GetForceBlockRef() *BlockRef
- func (x *PutOpts) GetHashType() hash.HashType
- func (x *PutOpts) GetRefs() []*BlockRef
- func (o *PutOpts) MarshalB58() string
- func (o *PutOpts) MarshalBlock() ([]byte, error)
- func (x *PutOpts) MarshalJSON() ([]byte, error)
- func (x *PutOpts) MarshalProtoJSON(s *json.MarshalState)
- func (x *PutOpts) MarshalProtoText() string
- func (o *PutOpts) MarshalString() string
- func (m *PutOpts) MarshalToSizedBufferVT(dAtA []byte) (int, error)
- func (m *PutOpts) MarshalToVT(dAtA []byte) (int, error)
- func (m *PutOpts) MarshalVT() (dAtA []byte, err error)
- func (*PutOpts) ProtoMessage()
- func (x *PutOpts) Reset()
- func (o *PutOpts) SelectHashType(defHashType hash.HashType) hash.HashType
- func (m *PutOpts) SizeVT() (n int)
- func (x *PutOpts) String() string
- func (o *PutOpts) UnmarshalB58(ref string) error
- func (o *PutOpts) UnmarshalBlock(data []byte) error
- func (x *PutOpts) UnmarshalJSON(b []byte) error
- func (x *PutOpts) UnmarshalProtoJSON(s *json.UnmarshalState)
- func (m *PutOpts) UnmarshalVT(dAtA []byte) error
- func (o *PutOpts) Validate() error
- type StoreFeature
- func (x StoreFeature) Enum() *StoreFeature
- func (s StoreFeature) Has(feat StoreFeature) bool
- func (x StoreFeature) MarshalJSON() ([]byte, error)
- func (x StoreFeature) MarshalProtoJSON(s *json.MarshalState)
- func (x StoreFeature) MarshalProtoText() string
- func (x StoreFeature) MarshalText() ([]byte, error)
- func (x StoreFeature) String() string
- func (x *StoreFeature) UnmarshalJSON(b []byte) error
- func (x *StoreFeature) UnmarshalProtoJSON(s *json.UnmarshalState)
- func (x *StoreFeature) UnmarshalText(b []byte) error
- type StoreOps
- type StoreOverlay
- func (o *StoreOverlay) BeginDeferFlush()
- func (o *StoreOverlay) EndDeferFlush(ctx context.Context) error
- func (o *StoreOverlay) Flush(ctx context.Context) error
- func (o *StoreOverlay) GetBlock(ctx context.Context, ref *BlockRef) ([]byte, bool, error)
- func (o *StoreOverlay) GetBlockExists(ctx context.Context, ref *BlockRef) (bool, error)
- func (o *StoreOverlay) GetBlockExistsBatch(ctx context.Context, refs []*BlockRef) ([]bool, error)
- func (o *StoreOverlay) GetHashType() hash.HashType
- func (o *StoreOverlay) GetSupportedFeatures() StoreFeature
- func (o *StoreOverlay) PutBlock(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
- func (o *StoreOverlay) PutBlockBackground(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
- func (o *StoreOverlay) PutBlockBatch(ctx context.Context, entries []*PutBatchEntry) error
- func (o *StoreOverlay) RmBlock(ctx context.Context, ref *BlockRef) error
- func (o *StoreOverlay) StatBlock(ctx context.Context, ref *BlockRef) (*BlockStat, error)
- type StoreRW
- func (b *StoreRW) BeginDeferFlush()
- func (b *StoreRW) EndDeferFlush(ctx context.Context) error
- func (b *StoreRW) Flush(ctx context.Context) error
- func (b *StoreRW) GetBlock(ctx context.Context, ref *BlockRef) ([]byte, bool, error)
- func (b *StoreRW) GetBlockExists(ctx context.Context, ref *BlockRef) (bool, error)
- func (b *StoreRW) GetBlockExistsBatch(ctx context.Context, refs []*BlockRef) ([]bool, error)
- func (b *StoreRW) GetHashType() hash.HashType
- func (b *StoreRW) GetSupportedFeatures() StoreFeature
- func (b *StoreRW) PutBlock(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
- func (b *StoreRW) PutBlockBackground(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
- func (b *StoreRW) PutBlockBatch(ctx context.Context, entries []*PutBatchEntry) error
- func (b *StoreRW) RmBlock(ctx context.Context, ref *BlockRef) error
- func (b *StoreRW) StatBlock(ctx context.Context, ref *BlockRef) (*BlockStat, error)
- type SubBlock
- type SubBlockCtor
- type Transaction
- func (t *Transaction) GetBlockGraph() graph.Graph
- func (t *Transaction) GetPutOpts() *PutOpts
- func (t *Transaction) GetStoreOps() StoreOps
- func (t *Transaction) GetTransformer() Transformer
- func (t *Transaction) SetBufferedStoreSettings(s *BufferedStoreSettings)
- func (t *Transaction) SetRoot(cursor *Cursor) error
- func (t *Transaction) SetStoreOps(store StoreOps)
- func (t *Transaction) Write(ctx context.Context, clearTree bool) (res *BlockRef, rcursor *Cursor, rerr error)
- func (t *Transaction) WriteAtRoot(ctx context.Context, clearTree bool, subRoot *Cursor) (res *BlockRef, rcursor *Cursor, rerr error)
- type Transformer
Constants ¶
const ( // StoreFeatureNativeBatchPut means PutBlockBatch is implemented natively. StoreFeatureNativeBatchPut = StoreFeature_STORE_FEATURE_NATIVE_BATCH_PUT // StoreFeatureNativeBatchExists means GetBlockExistsBatch is implemented natively. StoreFeatureNativeBatchExists = StoreFeature_STORE_FEATURE_NATIVE_BATCH_EXISTS // StoreFeatureNativeBackgroundPut means PutBlockBackground actually deprioritizes writes. StoreFeatureNativeBackgroundPut = StoreFeature_STORE_FEATURE_NATIVE_BACKGROUND_PUT // StoreFeatureNativeFlush means Flush has buffered work to publish. StoreFeatureNativeFlush = StoreFeature_STORE_FEATURE_NATIVE_FLUSH // StoreFeatureNativeDeferFlush means BeginDeferFlush and EndDeferFlush batch flush work. StoreFeatureNativeDeferFlush = StoreFeature_STORE_FEATURE_NATIVE_DEFER_FLUSH )
const DefaultHashType = hash.HashType_HashType_BLAKE3
DefaultHashType is the default hash type for refs.
const MaxBlockSize = 10485760
MaxBlockSize is the default maximum size in bytes (10MB) for a single serialized block accepted on the wire by transports such as DEX.
This is a sanity / DoS ceiling, not a structural limit on any one block type. Individual block types are naturally bounded well below this value:
- blob.Blob (root): inline RawData is capped by blob.DefRawHighWaterMark = blob.DefChunkingMaxSize = 786432 (768 KiB). Above that the Blob auto-converts to CHUNKED, where the root only stores a ChunkIndex of references and individual chunk data lives in separate byteslice blocks.
- blob chunk data (byteslice.ByteSlice): one chunk per block, capped by blob.DefChunkingMaxSize = 786432 (768 KiB).
- blob.ChunkIndex / IAVL node / other index blocks: hold only references and small metadata, well under 1 MiB in practice.
10 MiB therefore leaves roughly an order of magnitude of headroom over the largest block any current producer will emit, while still bounding the per-message buffer a peer must allocate when receiving a single block.
Variables ¶
var ( StoreFeature_name = map[int32]string{ 0: "STORE_FEATURE_UNKNOWN", 1: "STORE_FEATURE_NATIVE_BATCH_PUT", 2: "STORE_FEATURE_NATIVE_BATCH_EXISTS", 4: "STORE_FEATURE_NATIVE_BACKGROUND_PUT", 8: "STORE_FEATURE_NATIVE_FLUSH", 16: "STORE_FEATURE_NATIVE_DEFER_FLUSH", } StoreFeature_value = map[string]int32{ "STORE_FEATURE_UNKNOWN": 0, "STORE_FEATURE_NATIVE_BATCH_PUT": 1, "STORE_FEATURE_NATIVE_BATCH_EXISTS": 2, "STORE_FEATURE_NATIVE_BACKGROUND_PUT": 4, "STORE_FEATURE_NATIVE_FLUSH": 8, "STORE_FEATURE_NATIVE_DEFER_FLUSH": 16, } )
Enum value maps for StoreFeature.
var ( OverlayMode_name = map[int32]string{ 0: "UPPER_ONLY", 1: "LOWER_ONLY", 2: "UPPER_CACHE", 3: "LOWER_CACHE", 4: "UPPER_READ_CACHE", 5: "LOWER_READ_CACHE", 6: "UPPER_WRITE_CACHE", 7: "LOWER_WRITE_CACHE", 8: "UPPER_READBACK_CACHE", } OverlayMode_value = map[string]int32{ "UPPER_ONLY": 0, "LOWER_ONLY": 1, "UPPER_CACHE": 2, "LOWER_CACHE": 3, "UPPER_READ_CACHE": 4, "LOWER_READ_CACHE": 5, "UPPER_WRITE_CACHE": 6, "LOWER_WRITE_CACHE": 7, "UPPER_READBACK_CACHE": 8, } )
Enum value maps for OverlayMode.
var ( ErrBlockStoreUnavailable = errors.New("block store is unavailable") // ErrUnexpectedType is returned if a type assertion failed. ErrUnexpectedType = errors.New("block: unexpected object type") // ErrNilCursor is returned when a non-nil block cursor is required. ErrNilCursor = errors.New("block cursor cannot be nil") // ErrNilBlock is returned when a non-nil block is required. ErrNilBlock = errors.New("block cannot be nil") // ErrEmptyBlock is returned when a non-empty block is required. ErrEmptyBlock = errors.New("block data cannot be nil") // ErrEmptyBlockRef is returned a ref was required but was empty. ErrEmptyBlockRef = errors.New("empty block reference") // ErrNotBlock is returned if the object did not implement Block. ErrNotBlock = errors.New("object must be a block") // ErrNotSubBlock is returned if the block did not implement SubBlock. ErrNotSubBlock = errors.New("block must be a sub-block") // ErrNotBlockWithSubBlocks is returned if the block did not implement BlockWithSubBlocks. ErrNotBlockWithSubBlocks = errors.New("block must implement block with sub-blocks") // ErrEmptyChanges is returned if a slice of changes was unexpectedly empty. ErrEmptyChanges = errors.New("changes set cannot be empty") // ErrNotFound is returned when a block was not found but was required. ErrNotFound = errors.New("block not found") // ErrNotClonable is returned if a block could not be cloned. ErrNotClonable = errors.New("block: unable to clone") // ErrBlockRefMismatch is returned if the data does not match the expected ref. ErrBlockRefMismatch = errors.New("block: block ref hash mismatch") // ErrBufferedStoreFull is returned when a buffered store reaches its memory limits. ErrBufferedStoreFull = errors.New("block: buffered store is full") )
Functions ¶
func ApplySubBlock ¶
ApplySubBlock applies a sub-block to a field.
func CloneBlock ¶
CloneBlock tries to clone an input block.
The block should implement proto.Message or BlockWithClone.
returns ErrUnexpectedType or ErrNotClonable if the block was not clonable.
func CompareNamedSubBlocks ¶
func CompareNamedSubBlocks[T ComparableNamedSubBlock](a, b []T) (added, removed, changed []T)
CompareNamedSubBlocks compares two sets of ComparableNamedSubBlock. Returns the added, removed, and changed values.
func IsNamedSubBlocksSorted ¶
func IsNamedSubBlocksSorted[T NamedSubBlock](namedSubBlocks []T) bool
IsNamedSubBlocksSorted checks if the set of NamedSubBlock is sorted.
func MarshalBlockRefJSON ¶
MarshalBlockRefJSON marshals an BlockRef to JSON.
Returns "null" if the ref is nil.
func NewTransaction ¶
func NewTransaction( store StoreOps, transformer Transformer, rootRef *BlockRef, putOpts *PutOpts, ) (*Transaction, *Cursor)
NewTransaction builds a new transaction with a root cursor.
func SortNamedSubBlocks ¶
func SortNamedSubBlocks[T NamedSubBlock](namedSubBlocks []T)
SortNamedSubBlocks sorts a set of NamedSubBlock.
func UnmarshalBlock ¶
UnmarshalBlock unmarshals the block from the cursor & type-asserts it. Returns ErrUnexpectedType if the type returned was not T. Incorrect type happens if the cursor already contains a block w/ different type. If bcs == nil, returns empty, nil. If unmarshal() returns nil, returns empty, nil.
Types ¶
type Block ¶
type Block interface {
// MarshalBlock marshals the block to binary.
// This is the initial step of marshaling, before transformations.
MarshalBlock() ([]byte, error)
// UnmarshalBlock unmarshals the block to the object.
// This is the final step of decoding, after transformations.
UnmarshalBlock(data []byte) error
}
Block defines an in-memory decoded block structure. A block should contain a minimal amount of data with some pointers to other blocks.
func CastToBlock ¶
CastToBlock casts a object to a block or returns an error.
func NewBlockRefBlock ¶
func NewBlockRefBlock() Block
NewBlockRefBlock constructs a new block reference block.
type BlockRef ¶
type BlockRef struct {
// Hash is the hash of the object.
Hash *hash.Hash `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"`
// contains filtered or unexported fields
}
BlockRef is a block content ID reference.
protobuf-go-lite:disable-json
func BuildBlockRef ¶
BuildBlockRef builds a block ref from put opts by hashing the data. If putOpts are nil, uses default hash type.
func CloneBlockRefs ¶
CloneBlockRefs returns a deep copy of refs, preserving nil entries. Returns nil for empty input.
func ExtractBlockRefs ¶
ExtractBlockRefs extracts all outgoing BlockRefs from a block by walking BlockWithRefs and recursing into BlockWithSubBlocks.
This captures refs at all nesting levels: direct refs on the block, refs inside sub-blocks (e.g., BlockRefSlice), and refs inside nested sub-blocks.
func NewBlockRef ¶
NewBlockRef constructs a new block reference.
func UnmarshalBlockRefB58 ¶
UnmarshalBlockRefB58 unmarshals a b58 string block ref.
func UnmarshalBlockRefBlock ¶
UnmarshalBlockRefBlock unmarshals a BlockRef from a block cursor.
func UnmarshalBlockRefJSON ¶
UnmarshalBlockRefJSON attempts to unmarshal an BlockRef from JSON.
func (*BlockRef) ApplyBlockRef ¶
ApplyBlockRef applies a ref change with a field id. The reference may be nil if the child block is nil.
func (*BlockRef) CloneMessageVT ¶
func (m *BlockRef) CloneMessageVT() protobuf_go_lite.CloneMessage
func (*BlockRef) EqualMessageVT ¶
func (*BlockRef) GetBlockRefCtor ¶
GetBlockRefCtor returns the constructor for the block at the ref id. Return nil to indicate invalid ref ID or unknown.
func (*BlockRef) GetBlockRefs ¶
GetBlockRefs returns all block references by ID. May return nil, and values may also be nil. Note: this does not include pending references (in a cursor)
func (*BlockRef) LessThan ¶
LessThan checks if the ref is less than another. 1. Empty is sorted to the end. 2. Hash type is sorted. 3. Hash itself is sorted in bytes ordering
func (*BlockRef) MarshalBlock ¶
MarshalBlock marshals the block to binary. This is the initial step of marshaling, before transformations.
func (*BlockRef) MarshalJSON ¶
MarshalJSON marshals the BlockRef to JSON.
func (*BlockRef) MarshalKey ¶
MarshalKey marshals the block ref for use as a key. The format should be reproducible and identical between versions.
func (*BlockRef) MarshalLog ¶
MarshalLog marshals the reference for logging. If nil or empty returns <nil>
func (*BlockRef) MarshalProtoJSON ¶
func (b *BlockRef) MarshalProtoJSON(s *json.MarshalState)
MarshalProtoJSON marshals the BlockRef message to JSON.
func (*BlockRef) MarshalProtoText ¶
func (*BlockRef) MarshalString ¶
MarshalString marshals the reference to a string form.
func (*BlockRef) MarshalToSizedBufferVT ¶
func (*BlockRef) ParseFromB58 ¶
ParseFromB58 parses the object ref from a base58 string.
func (*BlockRef) ProtoMessage ¶
func (*BlockRef) ProtoMessage()
func (*BlockRef) UnmarshalBlock ¶
UnmarshalBlock unmarshals the block to the object. This is the final step of decoding, after transformations.
func (*BlockRef) UnmarshalJSON ¶
UnmarshalJSON unmarshals the BlockRef from JSON.
func (*BlockRef) UnmarshalProtoJSON ¶
func (b *BlockRef) UnmarshalProtoJSON(s *json.UnmarshalState)
UnmarshalProtoJSON unmarshals the BlockRef message from JSON.
func (*BlockRef) UnmarshalVT ¶
type BlockStat ¶
type BlockStat struct {
// Ref is the block reference.
Ref *BlockRef
// Size is the block data size in bytes.
// May be -1 if the size is unknown.
Size int64
}
BlockStat contains metadata about a stored block.
type BlockWithAttributes ¶
type BlockWithAttributes interface {
// GetBlockGraphAttributes returns the block graph attributes.
GetBlockGraphAttributes() []encoding.Attribute
}
BlockWithAttributes returns a block with graph attributes.
type BlockWithClone ¶
BlockWithClone defines a block with a clone function. The clone should share nothing with the original.
type BlockWithCloneVT ¶
type BlockWithCloneVT[T Block] interface { // CloneVT clones the block object with VTprotobuf. CloneVT() T }
BlockWithCloneVT defines a block with a VTProtobuf clone function.
type BlockWithPreWriteHook ¶
type BlockWithPreWriteHook interface {
// BlockPreWriteHook is called when writing the block.
BlockPreWriteHook() error
}
BlockWithPreWriteHook is a block with a function called when writing. This can also be applied to a sub-block.
type BlockWithRefs ¶
type BlockWithRefs interface {
// ApplyBlockRef applies a ref change with a field id.
// The reference may be nil if the child block is nil.
ApplyBlockRef(id uint32, ptr *BlockRef) error
// GetBlockRefs returns all block references by ID.
// May return nil, and values may also be nil.
// Note: this does not include pending references (in a cursor)
GetBlockRefs() (map[uint32]*BlockRef, error)
// GetBlockRefCtor returns the constructor for the block at the ref id.
// Return nil to indicate invalid ref ID or unknown.
GetBlockRefCtor(id uint32) Ctor
}
BlockWithRefs has references keyed by ID. Each field can contain a reference.
type BlockWithSubBlocks ¶
type BlockWithSubBlocks interface {
// ApplySubBlock applies a sub-block change with a field id.
ApplySubBlock(id uint32, next SubBlock) error
// GetSubBlocks returns all constructed sub-blocks by ID.
// May return nil, and values may also be nil.
GetSubBlocks() map[uint32]SubBlock
// GetSubBlockCtor returns a function which creates or returns the existing
// sub-block at reference id. Can return nil to indicate invalid reference id.
GetSubBlockCtor(id uint32) SubBlockCtor
}
BlockWithSubBlocks is a block containing sub-blocks as fields.
type BufferedStore ¶
type BufferedStore struct {
// contains filtered or unexported fields
}
BufferedStore buffers PutBlock calls in memory, drains them in the background, and exposes Flush as a durability fence.
func NewBufferedStore ¶
func NewBufferedStore(ctx context.Context, inner StoreOps) *BufferedStore
NewBufferedStore constructs a buffered store around an inner store and uses ctx for background draining.
func NewBufferedStoreWithSettings ¶
func NewBufferedStoreWithSettings( ctx context.Context, inner StoreOps, settings *BufferedStoreSettings, ) *BufferedStore
NewBufferedStoreWithSettings constructs a buffered store with explicit settings.
func (*BufferedStore) BeginDeferFlush ¶
func (s *BufferedStore) BeginDeferFlush()
BeginDeferFlush opens a nested deferred flush scope.
func (*BufferedStore) EndDeferFlush ¶
func (s *BufferedStore) EndDeferFlush(ctx context.Context) error
EndDeferFlush closes a deferred flush scope and flushes at the outermost end.
func (*BufferedStore) Flush ¶
func (s *BufferedStore) Flush(ctx context.Context) error
Flush waits for background block draining through the current fence.
func (*BufferedStore) GetBlockExists ¶
GetBlockExists checks if a block exists.
func (*BufferedStore) GetBlockExistsBatch ¶
GetBlockExistsBatch checks if blocks exist.
func (*BufferedStore) GetHashType ¶
func (s *BufferedStore) GetHashType() hash.HashType
GetHashType returns the preferred hash type.
func (*BufferedStore) GetSupportedFeatures ¶
func (s *BufferedStore) GetSupportedFeatures() StoreFeature
GetSupportedFeatures returns the native feature bitmask for the store.
func (*BufferedStore) PutBlock ¶
func (s *BufferedStore) PutBlock(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
PutBlock buffers a block in memory and starts background draining if needed.
func (*BufferedStore) PutBlockBackground ¶
func (s *BufferedStore) PutBlockBackground(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
PutBlockBackground forwards to PutBlock because buffered writes already drain asynchronously.
func (*BufferedStore) PutBlockBatch ¶
func (s *BufferedStore) PutBlockBatch(ctx context.Context, entries []*PutBatchEntry) error
PutBlockBatch loops through PutBlock and RmBlock using the buffered store.
type BufferedStoreSettings ¶
type BufferedStoreSettings struct {
MaxPendingEntries int
MaxPendingBytes int
DrainBatchEntries int
}
BufferedStoreSettings configures buffered block writeback behavior.
func DefaultBufferedStoreSettings ¶
func DefaultBufferedStoreSettings() *BufferedStoreSettings
DefaultBufferedStoreSettings returns the default buffered store settings.
type ComparableNamedSubBlock ¶
type ComparableNamedSubBlock interface {
NamedSubBlock
// Equals compares the block to the other block for equality.
Equals(ot ComparableNamedSubBlock) bool
}
ComparableNamedSubBlock is a NamedSubBlock that has an Equals function.
type ComparableSubBlock ¶
type ComparableSubBlock interface {
comparable
SubBlock
}
ComparableSubBlock is the type constraint for SubBlock.
type Cursor ¶
type Cursor struct {
// contains filtered or unexported fields
}
Cursor tracks traversal of a block reference DAG structure with an associated Transaction. Manages interacting with block handles, the transaction cache, the decoder and marshaller, and the transformers.
func (*Cursor) ClearAllRefs ¶
func (c *Cursor) ClearAllRefs()
ClearAllRefs clears all references. Cursors that were generated by Follow() will be detached.
Note: does not clear sub-blocks from the parent object. Note; does not clear the BlockRef from the parent object.
func (*Cursor) ClearRef ¶
ClearRef removes the reference handle to the given ref ID. Noop if FollowRef has not been previously called with refID. Cursors that were generated by Follow() will be detached.
Note: does not clear sub-blocks from the parent object. Note; does not clear the BlockRef from the parent object.
func (*Cursor) CloneBlock ¶
CloneBlock tries to clone the contained block.
returns ErrUnexpectedType or ErrNotClonable if the block was not clonable.
func (*Cursor) CopyToRecursive ¶
CopyToRecursive copies the cursor and referenced positions to another cursor. The cursor can use a different block transaction. Note: the same block refs will be reused (underlying data is not copied). If target tx == nil: is equivalent to DetachRecursive(false, cloneBlocks) If markDirty is set, marks all target positions as dirty.
func (*Cursor) Detach ¶
Detach clones the cursor position.
If keepRefs is set, adds the new location as a parent of all previously referenced blocks.
Note: does not copy/clone the Block object.
func (*Cursor) DetachRecursive ¶
DetachRecursive clones the cursor position and all referenced positions.
Note: if !cloneBlocks, does not copy/clone the Block objects.
func (*Cursor) DetachTransaction ¶
DetachTransaction creates a new ephemeral transaction rooted at the cursor.
func (*Cursor) Fetch ¶
Fetch fetches the block data into memory. Fetching is performed using a block lookup. Returns the transformed decoded version of the data. Returns data, dataIsSet, err. Returns nil, false, ErrBlockStoreUnavailable if the block store is unset. Returns nil, false, nil if the reference is empty. Returns nil, false, ErrNotFound if not found (block unavailable).
func (*Cursor) FollowRef ¶
FollowRef follows a block reference, returning a cursor pointing to the next block and enqueuing the block for fetching. Does not wait for the block to be fetched to return. If the reference is empty, will create a new block.
func (*Cursor) FollowSubBlock ¶
FollowSubBlock follows a sub-block reference, returning a cursor pointing to the same block but at a sub-block inside a field. The block is constructed or retrieved using the BlockWithSubBlocks interface.
Once FollowSubBlock has been called, the field will be overwritten if dirty. If ClearRef is called on the parent then this relation is removed.
Note: there may already be a reference with the same ID, which would be returned. The cursor must have the block decoded or set with SetBlock. The cursor block blk must be a BlockWithSubBlocks. If these conditions are not met, returns nil
func (*Cursor) GetAllRefs ¶
GetBlockRefs returns cursors to all references.
If existingOnly, only returns references that have already been traversed. If !existingOnly uses GetSubBlocks and/or GetBlockRefs to list all references. If the position blk is empty, returns an empty map.
func (*Cursor) GetBlock ¶
GetBlock returns the current loaded block at the position. May be nil if Fetch or Unmarshal or SetBlock have not been called. Returns isSubBlock.
func (*Cursor) GetBlockStore ¶
GetBlockStore returns the block store used for the transaction.
func (*Cursor) GetExistingRef ¶
GetExistingRef checks if the reference has been traversed already. Returns nil if no handle exists for that ref.
func (*Cursor) GetTransaction ¶
func (c *Cursor) GetTransaction() *Transaction
GetTransaction returns the cursor's associated transaction, may be nil.
func (*Cursor) IsSubBlock ¶
IsSubBlock indicates if the cursor is currently at a sub-block position.
func (*Cursor) MarkDirty ¶
func (c *Cursor) MarkDirty()
MarkDirty marks the cursor location dirty, so that it will be re-written.
Note: if cursor is ephemeral (no transaction) this is no-op.
func (*Cursor) Parents ¶
Parents returns new cursors pointing to the parent blocks. Note: the parent list is completely dependent on the order the graph was traversed. Note: returns nil if the cursor is ephemeral (with Detach call).
func (*Cursor) SetAsSubBlock ¶
SetAsSubBlock sets the cursor position as a sub-block of another block.
Clears any existing parent references. Immediately calls ApplySubBlock on the parent block.
May return ErrNotSubBlock or ErrUnexpectedType if the parent is not a block with sub-blocks.
func (*Cursor) SetBlock ¶
SetBlock sets a block at the location, and marks the block as dirty. If the location is a Block, b should implement Block interface. If it is a SubBlock, b should implement the SubBlock interface. If dirty is set, sets the block as dirty.
Clears BlockPreWrite.
func (*Cursor) SetBlockStore ¶
SetBlockStore sets the store to read from for this cursor and all sub-cursors. If nil, will use the default bucket attached to the block transaction.
func (*Cursor) SetPreWriteHook ¶
SetPreWriteHook sets a hook for final transforms to the block.
Note: this should not call any cursor functions that will be locked during the Write process.
Also valid for sub-blocks.
func (*Cursor) SetRef ¶
SetRef sets a block reference to the handle at the cursor. Adds c to the list of parents for cursor. The cursors must be from the same transaction. Note: this should only be used if refID and cursor are not sub-blocks.
func (*Cursor) SetRefAtCursor ¶
SetRefAtCursor sets the reference at the cursor location. If ref is not equal to the existing ref, and clearBlock is set, blk is set to nil.
func (*Cursor) Unmarshal ¶
Unmarshal fetches and unmarshals the data to a block. If already unmarshaled, returns existing data. If a sub-block, the sub-block must implement Block. If a sub-block, will return the sub-block value or nil. ctor is ignored if the cursor is a sub-block. Returns nil, nil if ctor is nil and the block is nil. Returns nil, nil if the cursor is nil. Returns value from ctor() without calling Unmarshal if empty. Returns nil, block.ErrNotFound if not found.
type NamedSubBlock ¶
type NamedSubBlock interface {
// SubBlock indicates this is a sub-block.
SubBlock
// GetName returns the name of the block.
GetName() string
}
NamedSubBlock is a sub-block with a name attached.
type NopStoreOps ¶
type NopStoreOps struct{}
NopStoreOps implements StoreOps defaults for tests.
Production wrappers must not embed this type. Test mocks may embed it and override only the methods exercised by the test.
func (NopStoreOps) BeginDeferFlush ¶
func (NopStoreOps) BeginDeferFlush()
BeginDeferFlush opens a no-op defer-flush scope.
func (NopStoreOps) EndDeferFlush ¶
func (NopStoreOps) EndDeferFlush(context.Context) error
EndDeferFlush closes a no-op defer-flush scope.
func (NopStoreOps) GetBlockExists ¶
GetBlockExists returns false.
func (NopStoreOps) GetBlockExistsBatch ¶
GetBlockExistsBatch loops calling GetBlockExists per ref.
func (NopStoreOps) GetHashType ¶
func (NopStoreOps) GetHashType() hash.HashType
GetHashType returns the preferred hash type for the store.
func (NopStoreOps) GetSupportedFeatures ¶
func (NopStoreOps) GetSupportedFeatures() StoreFeature
GetSupportedFeatures returns the native feature bitmask for the store.
func (NopStoreOps) PutBlockBackground ¶
func (n NopStoreOps) PutBlockBackground(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
PutBlockBackground forwards to PutBlock.
func (NopStoreOps) PutBlockBatch ¶
func (n NopStoreOps) PutBlockBatch(ctx context.Context, entries []*PutBatchEntry) error
PutBlockBatch loops calling PutBlock or RmBlock per entry.
type OverlayMode ¶
type OverlayMode int32
OverlayMode controls the mode for the block store overlay.
const ( // UPPER_ONLY uses the upper store only for reads and writes. // reads go to the upper store only. // writes go to the upper store only. // removes go to the upper store only. // the lower store is not used. OverlayMode_UPPER_ONLY OverlayMode = 0 // LOWER_ONLY uses the lower store only for reads and writes. // reads go to the lower store only. // writes go to the lower store only. // removes go to the lower store only. // the upper store is not used. OverlayMode_LOWER_ONLY OverlayMode = 1 // UPPER_CACHE uses the upper store as a cache for the lower store. // reads go to the upper store first, then the lower store. // writes go to both stores. // removes go to both stores. // reads from lower are written back to upper. OverlayMode_UPPER_CACHE OverlayMode = 2 // LOWER_CACHE uses the lower store as a cache for the upper store. // reads go to the lower store first, then the upper store. // writes go to both stores. // removes go to both stores. // reads from upper are written back to lower. OverlayMode_LOWER_CACHE OverlayMode = 3 // UPPER_READ_CACHE uses the upper store as a cache for the lower store. // reads go to the upper store first, then the lower store. // writes go to the lower store only. // removes go to the lower store only. // reads from lower are not written back to upper. OverlayMode_UPPER_READ_CACHE OverlayMode = 4 // LOWER_READ_CACHE uses the lower store as a cache for the upper store. // reads go to the lower store first, then the upper store. // writes go to the upper store only. // removes go to both stores. // reads from upper are not written back to lower. OverlayMode_LOWER_READ_CACHE OverlayMode = 5 // UPPER_WRITE_CACHE uses the upper store as a write cache for the lower store. // reads go to the upper store first, then the lower store. // writes go to the upper store only. // removes go to both stores. // reads from lower are not written back to upper. OverlayMode_UPPER_WRITE_CACHE OverlayMode = 6 // LOWER_WRITE_CACHE uses the lower store as a write cache for the upper store. // reads go to the lower store first, then the upper store. // writes go to the lower store only. // removes go to both stores. // reads from upper are not written back to lower. OverlayMode_LOWER_WRITE_CACHE OverlayMode = 7 // UPPER_READBACK_CACHE treats the lower store as read-only and immutable // (e.g. remote packfiles) while caching reads back into the upper store. // reads go to the upper store first, then the lower store. // reads from lower are written back to upper. // writes go to the upper store only. // removes go to the upper store only (lower lifecycle is external, e.g. // packfile garbage collection / repack). OverlayMode_UPPER_READBACK_CACHE OverlayMode = 8 )
func (OverlayMode) Enum ¶
func (x OverlayMode) Enum() *OverlayMode
func (OverlayMode) MarshalJSON ¶
func (x OverlayMode) MarshalJSON() ([]byte, error)
MarshalJSON marshals the OverlayMode to JSON.
func (OverlayMode) MarshalProtoJSON ¶
func (x OverlayMode) MarshalProtoJSON(s *json.MarshalState)
MarshalProtoJSON marshals the OverlayMode to JSON.
func (OverlayMode) MarshalProtoText ¶
func (x OverlayMode) MarshalProtoText() string
func (OverlayMode) MarshalText ¶
func (x OverlayMode) MarshalText() ([]byte, error)
MarshalText marshals the OverlayMode to text.
func (OverlayMode) String ¶
func (x OverlayMode) String() string
func (*OverlayMode) UnmarshalJSON ¶
func (x *OverlayMode) UnmarshalJSON(b []byte) error
UnmarshalJSON unmarshals the OverlayMode from JSON.
func (*OverlayMode) UnmarshalProtoJSON ¶
func (x *OverlayMode) UnmarshalProtoJSON(s *json.UnmarshalState)
UnmarshalProtoJSON unmarshals the OverlayMode from JSON.
func (*OverlayMode) UnmarshalText ¶
func (x *OverlayMode) UnmarshalText(b []byte) error
UnmarshalText unmarshals the OverlayMode from text.
type PutBatchEntry ¶
type PutBatchEntry struct {
// Ref is the expected content-addressed block reference.
Ref *BlockRef
// Data is the encoded block payload.
Data []byte
// Refs are outgoing block references recorded with this write.
Refs []*BlockRef
// Tombstone marks the block ref as deleted.
Tombstone bool
}
PutBatchEntry describes one durable block write in a lower-layer batch.
type PutOpts ¶
type PutOpts struct {
// HashType is the hash type to use.
// If unset (0 value) will use default for the store.
HashType hash.HashType `protobuf:"varint,1,opt,name=hash_type,json=hashType,proto3" json:"hashType,omitempty"`
// ForceBlockRef forces the block ref to equal the given ref.
// Can be unset to indicate none (allow any).
//
// If the generated BlockRef does not match, the storage operation is aborted
// and returns block.ErrBlockRefMismatch.
ForceBlockRef *BlockRef `protobuf:"bytes,2,opt,name=force_block_ref,json=forceBlockRef,proto3" json:"forceBlockRef,omitempty"`
// Refs are outgoing block references recorded with this write.
// GC-aware stores consume these refs as part of the put. Stores that do not
// participate in GC ignore this field.
Refs []*BlockRef `protobuf:"bytes,3,rep,name=refs,proto3" json:"refs,omitempty"`
// contains filtered or unexported fields
}
PutOpts are options that can be passed to PutBlock.
func (*PutOpts) CloneMessageVT ¶
func (m *PutOpts) CloneMessageVT() protobuf_go_lite.CloneMessage
func (*PutOpts) EqualMessageVT ¶
func (*PutOpts) GetForceBlockRef ¶
func (*PutOpts) GetHashType ¶
func (*PutOpts) MarshalB58 ¶
MarshalB58 marshals the put opts to a base58 string form.
func (*PutOpts) MarshalBlock ¶
MarshalBlock marshals the block to binary. This is the initial step of marshaling, before transformations.
func (*PutOpts) MarshalJSON ¶
MarshalJSON marshals the PutOpts to JSON.
func (*PutOpts) MarshalProtoJSON ¶
func (x *PutOpts) MarshalProtoJSON(s *json.MarshalState)
MarshalProtoJSON marshals the PutOpts message to JSON.
func (*PutOpts) MarshalProtoText ¶
func (*PutOpts) MarshalString ¶
MarshalString marshals the put opts to b58 string.
func (*PutOpts) MarshalToSizedBufferVT ¶
func (*PutOpts) ProtoMessage ¶
func (*PutOpts) ProtoMessage()
func (*PutOpts) SelectHashType ¶
SelectHashType selects the hash type to use for the operation. The given hash type should be the default value to use.
func (*PutOpts) UnmarshalB58 ¶
UnmarshalB58 unmarshals the put opts from base58 string form.
func (*PutOpts) UnmarshalBlock ¶
UnmarshalBlock unmarshals the block to the object. This is the final step of decoding, after transformations.
func (*PutOpts) UnmarshalJSON ¶
UnmarshalJSON unmarshals the PutOpts from JSON.
func (*PutOpts) UnmarshalProtoJSON ¶
func (x *PutOpts) UnmarshalProtoJSON(s *json.UnmarshalState)
UnmarshalProtoJSON unmarshals the PutOpts message from JSON.
func (*PutOpts) UnmarshalVT ¶
type StoreFeature ¶
type StoreFeature int32
StoreFeature is a bitmask of native block store capabilities. Each non-zero enum value is a single bit and values are combined with bitwise OR. The values are intentionally not sequential.
const ( // STORE_FEATURE_UNKNOWN indicates no native capabilities are reported. StoreFeature_STORE_FEATURE_UNKNOWN StoreFeature = 0 // STORE_FEATURE_NATIVE_BATCH_PUT means PutBlockBatch is implemented natively. StoreFeature_STORE_FEATURE_NATIVE_BATCH_PUT StoreFeature = 1 // STORE_FEATURE_NATIVE_BATCH_EXISTS means GetBlockExistsBatch is implemented natively. StoreFeature_STORE_FEATURE_NATIVE_BATCH_EXISTS StoreFeature = 2 // STORE_FEATURE_NATIVE_BACKGROUND_PUT means PutBlockBackground actually deprioritizes writes. StoreFeature_STORE_FEATURE_NATIVE_BACKGROUND_PUT StoreFeature = 4 // STORE_FEATURE_NATIVE_FLUSH means Flush has buffered work to publish. StoreFeature_STORE_FEATURE_NATIVE_FLUSH StoreFeature = 8 // STORE_FEATURE_NATIVE_DEFER_FLUSH means BeginDeferFlush and EndDeferFlush batch flush work. StoreFeature_STORE_FEATURE_NATIVE_DEFER_FLUSH StoreFeature = 16 )
func (StoreFeature) Enum ¶
func (x StoreFeature) Enum() *StoreFeature
func (StoreFeature) Has ¶
func (s StoreFeature) Has(feat StoreFeature) bool
Has reports whether this feature bitset contains every requested feature.
func (StoreFeature) MarshalJSON ¶
func (x StoreFeature) MarshalJSON() ([]byte, error)
MarshalJSON marshals the StoreFeature to JSON.
func (StoreFeature) MarshalProtoJSON ¶
func (x StoreFeature) MarshalProtoJSON(s *json.MarshalState)
MarshalProtoJSON marshals the StoreFeature to JSON.
func (StoreFeature) MarshalProtoText ¶
func (x StoreFeature) MarshalProtoText() string
func (StoreFeature) MarshalText ¶
func (x StoreFeature) MarshalText() ([]byte, error)
MarshalText marshals the StoreFeature to text.
func (StoreFeature) String ¶
func (x StoreFeature) String() string
func (*StoreFeature) UnmarshalJSON ¶
func (x *StoreFeature) UnmarshalJSON(b []byte) error
UnmarshalJSON unmarshals the StoreFeature from JSON.
func (*StoreFeature) UnmarshalProtoJSON ¶
func (x *StoreFeature) UnmarshalProtoJSON(s *json.UnmarshalState)
UnmarshalProtoJSON unmarshals the StoreFeature from JSON.
func (*StoreFeature) UnmarshalText ¶
func (x *StoreFeature) UnmarshalText(b []byte) error
UnmarshalText unmarshals the StoreFeature from text.
type StoreOps ¶
type StoreOps interface {
// GetHashType returns the preferred hash type for the store.
// This should return as fast as possible (called frequently).
// If 0 is returned, uses a default defined by Hydra.
GetHashType() hash.HashType
// GetSupportedFeatures returns the native feature bitmask for the store.
// This should return as fast as possible (called frequently) and remain
// static for the lifetime of the store.
GetSupportedFeatures() StoreFeature
// PutBlock puts a block into the store.
// The ref should not be modified after return.
// The second return value can optionally indicate if the block already existed.
// If the hash type is unset, use the type from GetHashType().
PutBlock(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
// PutBlockBatch writes a batch of block operations.
// Implementations without native batching fall back internally.
PutBlockBatch(ctx context.Context, entries []*PutBatchEntry) error
// PutBlockBackground writes a block at background priority.
// Implementations without native background priority fall back to PutBlock.
PutBlockBackground(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
// GetBlock gets a block with the given reference.
// The ref should not be modified or retained by GetBlock.
// Returns data, found, error.
// Returns nil, false, nil if not found.
// Note: the block may not be in the specified bucket.
GetBlock(ctx context.Context, ref *BlockRef) ([]byte, bool, error)
// GetBlockExists checks if a block exists with a cid reference.
// The ref should not be modified or retained by GetBlock.
// Note: the block may not be in the specified bucket.
GetBlockExists(ctx context.Context, ref *BlockRef) (bool, error)
// GetBlockExistsBatch checks whether each block reference exists.
// Implementations without native batching fall back internally.
GetBlockExistsBatch(ctx context.Context, refs []*BlockRef) ([]bool, error)
// RmBlock deletes a block from the bucket.
// Does not return an error if the block was not present.
// In some cases, will return before confirming delete.
RmBlock(ctx context.Context, ref *BlockRef) error
// StatBlock returns metadata about a block without reading its data.
// Returns nil, nil if the block does not exist.
StatBlock(ctx context.Context, ref *BlockRef) (*BlockStat, error)
// Flush publishes buffered writes when the store has a durability boundary.
// Implementations without buffering return nil.
Flush(ctx context.Context) error
// BeginDeferFlush opens a defer-flush scope.
BeginDeferFlush()
// EndDeferFlush closes a defer-flush scope.
EndDeferFlush(ctx context.Context) error
}
StoreOps can read/write blocks.
func NewStoreRW ¶
NewStoreRW constructs a new Store handle using a read handle and an optional write handle. If the write handle is not nil, the write (put and delete) calls will go to it. Otherwise, all calls are sent to the read handle.
type StoreOverlay ¶
type StoreOverlay struct {
// contains filtered or unexported fields
}
StoreOverlay layers an upper block store over a lower store.
ctx is used for writeback requests
func NewOverlay ¶
func NewOverlay( ctx context.Context, lower, upper StoreOps, mode OverlayMode, writebackTimeout time.Duration, writebackPutOpts *PutOpts, ) *StoreOverlay
NewOverlay constructs a new overlay store.
ctx is used for writeback requests
func (*StoreOverlay) BeginDeferFlush ¶
func (o *StoreOverlay) BeginDeferFlush()
BeginDeferFlush forwards to upper and lower stores that support deferred flushing.
func (*StoreOverlay) EndDeferFlush ¶
func (o *StoreOverlay) EndDeferFlush(ctx context.Context) error
EndDeferFlush forwards to upper and lower stores that support deferred flushing.
func (*StoreOverlay) Flush ¶
func (o *StoreOverlay) Flush(ctx context.Context) error
Flush forwards the durability boundary to stores used by the overlay.
func (*StoreOverlay) GetBlock ¶
GetBlock gets a block with the given reference. The ref should not be modified or retained by GetBlock. Returns data, found, error. Returns nil, false, nil if not found. Note: the block may not be in the specified bucket.
func (*StoreOverlay) GetBlockExists ¶
GetBlockExists checks if a block exists with a cid reference. The ref should not be modified or retained by GetBlock. Note: the block may not be in the specified bucket.
func (*StoreOverlay) GetBlockExistsBatch ¶
GetBlockExistsBatch checks block existence using the same read policy as GetBlockExists.
func (*StoreOverlay) GetHashType ¶
func (o *StoreOverlay) GetHashType() hash.HashType
GetHashType returns the preferred hash type for the store. This should return as fast as possible (called frequently). If 0 is returned, uses a default defined by Hydra.
func (*StoreOverlay) GetSupportedFeatures ¶
func (o *StoreOverlay) GetSupportedFeatures() StoreFeature
GetSupportedFeatures returns the native feature bitmask for the overlay.
func (*StoreOverlay) PutBlock ¶
func (o *StoreOverlay) PutBlock(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
PutBlock puts a block into the store. The ref should not be modified after return. The second return value can optionally indicate if the block already existed. If the hash type is unset, use the type from GetHashType().
func (*StoreOverlay) PutBlockBackground ¶
func (o *StoreOverlay) PutBlockBackground(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
PutBlockBackground writes a block in the background using the same target-store policy as PutBlock.
func (*StoreOverlay) PutBlockBatch ¶
func (o *StoreOverlay) PutBlockBatch(ctx context.Context, entries []*PutBatchEntry) error
PutBlockBatch writes a batch of blocks using the same target-store policy as PutBlock.
type StoreRW ¶
type StoreRW struct {
// contains filtered or unexported fields
}
StoreRW combines a read and write store together.
func (*StoreRW) BeginDeferFlush ¶
func (b *StoreRW) BeginDeferFlush()
BeginDeferFlush forwards to the write handle if it supports deferred flushing.
func (*StoreRW) EndDeferFlush ¶
EndDeferFlush forwards to the write handle if it supports deferred flushing.
func (*StoreRW) GetBlock ¶
GetBlock gets a block with a cid reference. The ref should not be modified or retained by GetBlock. Note: the block may not be in the specified bucket.
func (*StoreRW) GetBlockExists ¶
GetBlockExists checks if a block exists with a cid reference. The ref should not be modified or retained by GetBlock. Note: the block may not be in the specified bucket.
func (*StoreRW) GetBlockExistsBatch ¶
GetBlockExistsBatch forwards batched existence probes to the read handle when supported.
func (*StoreRW) GetHashType ¶
GetHashType returns the preferred hash type for the store. This should return as fast as possible (called frequently). If 0 is returned, uses a default defined by Hydra.
func (*StoreRW) GetSupportedFeatures ¶
func (b *StoreRW) GetSupportedFeatures() StoreFeature
GetSupportedFeatures returns the native feature bitmask for the store.
func (*StoreRW) PutBlock ¶
func (b *StoreRW) PutBlock(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
PutBlock puts a block into the store. The ref should not be modified after return.
func (*StoreRW) PutBlockBackground ¶
func (b *StoreRW) PutBlockBackground(ctx context.Context, data []byte, opts *PutOpts) (*BlockRef, bool, error)
PutBlockBackground forwards to the write handle if it supports background writes.
func (*StoreRW) PutBlockBatch ¶
func (b *StoreRW) PutBlockBatch(ctx context.Context, entries []*PutBatchEntry) error
PutBlockBatch forwards to the write handle if it supports batched writes.
type SubBlock ¶
type SubBlock interface {
// IsNil checks if the object is nil.
IsNil() bool
}
SubBlock is a object contained inside a Block. May optionally implement Block or other Block interfaces.
type SubBlockCtor ¶
SubBlockCtor constructs a sub-block. If create == false, returns nil if the field is not set.
func NewSubBlockCtor ¶
func NewSubBlockCtor[T ComparableSubBlock](r *T, ctor func() T) SubBlockCtor
NewSubBlockCtor constructs a new SubBlock constructor. returns nil if r is nil usage: block.NewSubBlockCtor(r, func() *ChangeLogLL { return &ChangeLogLL{} })
type Transaction ¶
type Transaction struct {
// contains filtered or unexported fields
}
Transaction tracks refs traversed between blocks, batching writes and propagating changes through the merkle graph.
The decoded object form of the block can be stored / attached to a block handle. Changes are written to storage with a topological reference sort.
Empty blocks are not written to storage: they are instead represented with a nil BlockRef. SetBlockRef should handle nil BlockRef objects correctly.
func (*Transaction) GetBlockGraph ¶
func (t *Transaction) GetBlockGraph() graph.Graph
GetBlockGraph returns a handle to the internal block graph state. Do not modify this, used for analysis.
func (*Transaction) GetPutOpts ¶
func (t *Transaction) GetPutOpts() *PutOpts
GetPutOpts returns the transaction's put options.
func (*Transaction) GetStoreOps ¶
func (t *Transaction) GetStoreOps() StoreOps
GetStoreOps returns the transaction's store operations.
func (*Transaction) GetTransformer ¶
func (t *Transaction) GetTransformer() Transformer
GetTransformer returns the transaction's block transformer.
func (*Transaction) SetBufferedStoreSettings ¶
func (t *Transaction) SetBufferedStoreSettings(s *BufferedStoreSettings)
SetBufferedStoreSettings overrides the BufferedStore settings used to wrap the write store inside WriteAtRoot. Pass nil to reset to defaults. This must be called before Write/WriteAtRoot begins committing for the override to take effect on that commit.
func (*Transaction) SetRoot ¶
func (t *Transaction) SetRoot(cursor *Cursor) error
SetRoot sets the root of the transaction to a different position. Clears all parent blocks from the new root.
func (*Transaction) SetStoreOps ¶
func (t *Transaction) SetStoreOps(store StoreOps)
SetStoreOps replaces the transaction's store implementation. Used to swap in GCStoreOps after the RefGraph is available.
func (*Transaction) Write ¶
func (t *Transaction) Write(ctx context.Context, clearTree bool) ( res *BlockRef, rcursor *Cursor, rerr error, )
Write writes the dirty blocks to the store, propagating reference changes up the tree. Clears the blocks cache if clearTree is set, otherwise the updated references are written to the cursor tree. The final block in the event list will be the new root. The new root cursor is returned. Blocks that are not referenced by the root directly or indirectly are "cut" and removed.
Note: after Write with clearTree, use the new returned rcursor only.
func (*Transaction) WriteAtRoot ¶
func (t *Transaction) WriteAtRoot(ctx context.Context, clearTree bool, subRoot *Cursor) ( res *BlockRef, rcursor *Cursor, rerr error, )
WriteAtRoot writes dirty blocks to the store starting from a sub-tree root. If subRoot is nil, writes from the transaction root (same as Write). If subRoot is non-nil, writes only the sub-tree rooted at that cursor. Blocks outside the sub-tree are not touched. After writing, the sub-tree nodes are non-dirty with refs set, and their block data is freed if clearTree is set. The parent transaction's Write() will skip these nodes.
type Transformer ¶
type Transformer interface {
// EncodeBlock encodes the block according to the config.
// May reuse the same byte slice if possible.
EncodeBlock([]byte) ([]byte, error)
// DecodeBlock decodes the block according to the config.
// May reuse the same byte slice if possible.
DecodeBlock([]byte) ([]byte, error)
}
Transformer encodes and decodes blocks for storage.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
Package block_copy provides functions for copying block DAGs between stores.
|
Package block_copy provides functions for copying block DAGs between stores. |
|
Package block_gc implements garbage collection for Hydra block stores.
|
Package block_gc implements garbage collection for Hydra block stores. |
|
gcgraph
Package gcgraph implements the GC reference graph on OPFS.
|
Package gcgraph implements the GC reference graph on OPFS. |
|
viz
|
|
|
dot/demo
command
|