cold object reification context option
This commit is contained in:
parent
4cddfd1074
commit
268366e446
21
blockstore/context.go
Normal file
21
blockstore/context.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package blockstore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
)
|
||||||
|
|
||||||
|
type hotViewKey struct{}
|
||||||
|
|
||||||
|
var hotView = hotViewKey{}
|
||||||
|
|
||||||
|
// WithHotView constructs a new context with an option that provides a hint to the blockstore
|
||||||
|
// (e.g. the splitstore) that the object (and its ipld references) should be kept hot.
|
||||||
|
func WithHotView(ctx context.Context) context.Context {
|
||||||
|
return context.WithValue(ctx, hotView, struct{}{})
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetHotView returns true if the hot view option is set in the context
|
||||||
|
func GetHotView(ctx context.Context) bool {
|
||||||
|
v := ctx.Value(hotView)
|
||||||
|
return v != nil
|
||||||
|
}
|
@ -274,7 +274,13 @@ func (s *SplitStore) Has(ctx context.Context, cid cid.Cid) (bool, error) {
|
|||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.cold.Has(ctx, cid)
|
has, err = s.cold.Has(ctx, cid)
|
||||||
|
if has && bstore.GetHotView(ctx) {
|
||||||
|
s.reifyColdObject(cid)
|
||||||
|
}
|
||||||
|
|
||||||
|
return has, err
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *SplitStore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) {
|
func (s *SplitStore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error) {
|
||||||
@ -318,8 +324,11 @@ func (s *SplitStore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, error)
|
|||||||
|
|
||||||
blk, err = s.cold.Get(ctx, cid)
|
blk, err = s.cold.Get(ctx, cid)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
stats.Record(s.ctx, metrics.SplitstoreMiss.M(1))
|
if bstore.GetHotView(ctx) {
|
||||||
|
s.reifyColdObject(cid)
|
||||||
|
}
|
||||||
|
|
||||||
|
stats.Record(s.ctx, metrics.SplitstoreMiss.M(1))
|
||||||
}
|
}
|
||||||
return blk, err
|
return blk, err
|
||||||
|
|
||||||
@ -369,6 +378,10 @@ func (s *SplitStore) GetSize(ctx context.Context, cid cid.Cid) (int, error) {
|
|||||||
|
|
||||||
size, err = s.cold.GetSize(ctx, cid)
|
size, err = s.cold.GetSize(ctx, cid)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
if bstore.GetHotView(ctx) {
|
||||||
|
s.reifyColdObject(cid)
|
||||||
|
}
|
||||||
|
|
||||||
stats.Record(s.ctx, metrics.SplitstoreMiss.M(1))
|
stats.Record(s.ctx, metrics.SplitstoreMiss.M(1))
|
||||||
}
|
}
|
||||||
return size, err
|
return size, err
|
||||||
@ -546,6 +559,10 @@ func (s *SplitStore) View(ctx context.Context, cid cid.Cid, cb func([]byte) erro
|
|||||||
|
|
||||||
err = s.cold.View(ctx, cid, cb)
|
err = s.cold.View(ctx, cid, cb)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
if bstore.GetHotView(ctx) {
|
||||||
|
s.reifyColdObject(cid)
|
||||||
|
}
|
||||||
|
|
||||||
stats.Record(s.ctx, metrics.SplitstoreMiss.M(1))
|
stats.Record(s.ctx, metrics.SplitstoreMiss.M(1))
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
Loading…
Reference in New Issue
Block a user