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 --- core/state_backend.go | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'core/state_backend.go') diff --git a/core/state_backend.go b/core/state_backend.go index 5870739..ae9fe1d 100644 --- a/core/state_backend.go +++ b/core/state_backend.go @@ -2,6 +2,9 @@ package core import ( "context" + "encoding/json" + "fmt" + ) type StateBackend interface { @@ -22,6 +25,7 @@ type stateBackendKeyType struct{} var stateBackendKey stateBackendKeyType +// type adapter type typedValueState[T any] struct { inner ValueState[any] } @@ -32,14 +36,24 @@ func CastValueType[T any](inner ValueState[any]) ValueState[T] { func (s *typedValueState[T]) Value(ctx context.Context) (T, error) { val, err := s.inner.Value(ctx) + var zero T if err != nil { - var zero T return zero, err } if val == nil { - var zero T return zero, nil } + + if rawBytes, ok := val.([]byte); ok { + defer PutBuffer(rawBytes) + + var result T + if err := json.Unmarshal(rawBytes, &result); err != nil { + return zero, fmt.Errorf("failed to unmarshal state: %w", err) + } + return result, nil + } + return val.(T), nil } -- cgit v1.3.1