From e626cee8f7de0dd3ffca4c7297e59a87f790cc02 Mon Sep 17 00:00:00 2001 From: sangtran Date: Sat, 5 Sep 2026 17:06:30 +0700 Subject: feat: add on pebble state backend and using sync Pool to reuse buffer []byte --- state/pebble_state.go | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 state/pebble_state.go (limited to 'state/pebble_state.go') diff --git a/state/pebble_state.go b/state/pebble_state.go new file mode 100644 index 0000000..3eeaa05 --- /dev/null +++ b/state/pebble_state.go @@ -0,0 +1,54 @@ +package state + +import ( + "context" + "encoding/json" + "errors" + "flux/core" + + "github.com/cockroachdb/pebble/v2" +) + +type pebbleStateValue struct { + backend *PebbleStateBackend + stateID uint8 +} + +func (p *pebbleStateValue) Update(ctx context.Context, newVal any) (any, error) { + key := p.backend.deserialize(p.stateID) + // convert newVal to []byte raw + v, err := json.Marshal(newVal) + if err != nil { + return nil, err + } + + err = p.backend.db.Set(key, v, pebble.NoSync) + if err != nil { + return nil, err + } + + return newVal, nil +} + +func (p *pebbleStateValue) Value(ctx context.Context) (any, error) { + key := p.backend.deserialize(p.stateID) + v, closer, err := p.backend.db.Get(key) + if err != nil { + if errors.Is(err, pebble.ErrNotFound) { + return nil, nil + } + return nil, err + } + + defer closer.Close() + + res := core.GetBuffer(len(v)) + copy(res, v) + return v, nil +} + +func (p *pebbleStateValue) Clear(ctx context.Context) error { + key := p.backend.deserialize(p.stateID) + + return p.backend.db.Delete(key, pebble.NoSync) +} -- cgit v1.3.1