github.com/grafana/pyroscope@v1.18.0/pkg/metastore/compaction/scheduler/store/job_plan_store.go (about) 1 package store 2 3 import ( 4 "errors" 5 "fmt" 6 7 "go.etcd.io/bbolt" 8 9 "github.com/grafana/pyroscope/api/gen/proto/go/metastore/v1/raft_log" 10 "github.com/grafana/pyroscope/pkg/metastore/store" 11 ) 12 13 var jobPlanBucketName = []byte("compaction_job_plan") 14 15 var ErrInvalidJobPlan = errors.New("invalid job plan entry") 16 17 type JobPlanStore struct{ bucketName []byte } 18 19 func NewJobPlanStore() *JobPlanStore { 20 return &JobPlanStore{bucketName: jobPlanBucketName} 21 } 22 23 func (s JobPlanStore) CreateBuckets(tx *bbolt.Tx) error { 24 _, err := tx.CreateBucketIfNotExists(s.bucketName) 25 return err 26 } 27 28 func (s JobPlanStore) StoreJobPlan(tx *bbolt.Tx, plan *raft_log.CompactionJobPlan) error { 29 v, _ := plan.MarshalVT() 30 return tx.Bucket(s.bucketName).Put([]byte(plan.Name), v) 31 } 32 33 func (s JobPlanStore) GetJobPlan(tx *bbolt.Tx, name string) (*raft_log.CompactionJobPlan, error) { 34 b := tx.Bucket(s.bucketName).Get([]byte(name)) 35 if b == nil { 36 return nil, fmt.Errorf("loading job plan %s: %w", name, store.ErrNotFound) 37 } 38 var v raft_log.CompactionJobPlan 39 if err := v.UnmarshalVT(b); err != nil { 40 return nil, fmt.Errorf("%w: %v", ErrInvalidJobPlan, err) 41 } 42 return &v, nil 43 } 44 45 func (s JobPlanStore) DeleteJobPlan(tx *bbolt.Tx, name string) error { 46 return tx.Bucket(s.bucketName).Delete([]byte(name)) 47 }