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())