From d7f03d5db000022e33927f2157426a0350dfc2ec Mon Sep 17 00:00:00 2001 From: Virgil Date: Fri, 3 Apr 2026 05:00:56 +0000 Subject: [PATCH] fix(store): make Close idempotent Co-Authored-By: Virgil --- store.go | 10 ++++++++++ store_test.go | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/store.go b/store.go index 7751912..3dbf59d 100644 --- a/store.go +++ b/store.go @@ -48,6 +48,8 @@ type Store struct { purgeWaitGroup sync.WaitGroup purgeInterval time.Duration // interval between background purge cycles journal journalConfig + closeLock sync.Mutex + closed bool // Event dispatch state. watchers map[string][]chan Event @@ -109,6 +111,14 @@ func New(databasePath string, options ...StoreOption) (*Store, error) { // Usage example: `storeInstance, err := store.New(":memory:"); if err != nil { return }; defer storeInstance.Close()` func (storeInstance *Store) Close() error { + storeInstance.closeLock.Lock() + if storeInstance.closed { + storeInstance.closeLock.Unlock() + return nil + } + storeInstance.closed = true + storeInstance.closeLock.Unlock() + storeInstance.cancelPurge() storeInstance.purgeWaitGroup.Wait() if err := storeInstance.database.Close(); err != nil { diff --git a/store_test.go b/store_test.go index 5d2a42b..88c48c7 100644 --- a/store_test.go +++ b/store_test.go @@ -655,6 +655,13 @@ func TestStore_Close_Good(t *testing.T) { require.NoError(t, err) } +func TestStore_Close_Good_Idempotent(t *testing.T) { + storeInstance, _ := New(":memory:") + + require.NoError(t, storeInstance.Close()) + require.NoError(t, storeInstance.Close()) +} + func TestStore_Close_Good_OperationsFailAfterClose(t *testing.T) { storeInstance, _ := New(":memory:") require.NoError(t, storeInstance.Close()) -- 2.45.3