storage/sqlite/sqlite-storage.go | 25 ++++++++++++++++++------- diff --git a/storage/sqlite/sqlite-storage.go b/storage/sqlite/sqlite-storage.go index 83be6e8d566bd0bd98cc8942f528d92961f49a0e..cb2ab1b973533764a6f79a85b8f9d1915ef15e8a 100644 --- a/storage/sqlite/sqlite-storage.go +++ b/storage/sqlite/sqlite-storage.go @@ -347,7 +347,8 @@ type provider struct { pool ConnPool writes chan<- writeRequest opts ProviderOpts - closed sync.Once + closeMu sync.RWMutex + closed bool closeErr error } @@ -382,12 +383,16 @@ return } func (me *provider) Close() error { - me.closed.Do(func() { - if me.writes != nil { - close(me.writes) - } - me.closeErr = me.pool.Close() - }) + me.closeMu.Lock() + defer me.closeMu.Unlock() + if me.closed { + return me.closeErr + } + if me.writes != nil { + close(me.writes) + } + me.closeErr = me.pool.Close() + me.closed = true return me.closeErr } @@ -481,11 +486,17 @@ func (p *provider) withConn(with withConn, write bool, skip int) error { if write && p.opts.BatchWrites { done := make(chan error) + p.closeMu.RLock() + if p.closed { + p.closeMu.RUnlock() + return errors.New("closed") + } p.writes <- writeRequest{ query: with, done: done, labels: getLabels(skip + 1), } + p.closeMu.RUnlock() return <-done } else { conn := p.pool.Get(context.TODO())