diff --git a/libnetwork/internal/kvstore/boltdb/boltdb.go b/libnetwork/internal/kvstore/boltdb/boltdb.go index 417deced6e..457ac5b6f7 100644 --- a/libnetwork/internal/kvstore/boltdb/boltdb.go +++ b/libnetwork/internal/kvstore/boltdb/boltdb.go @@ -6,6 +6,7 @@ import ( "errors" "os" "path/filepath" + "sync" "sync/atomic" "time" @@ -41,6 +42,7 @@ type BoltDB struct { // PersistConnection flag provides an option to override ths behavior. // ie: open the connection in New and use it till Close is called. PersistConnection bool + sync.Mutex } const ( @@ -128,6 +130,8 @@ func (b *BoltDB) Get(key string) (*store.KVPair, error) { db *bolt.DB err error ) + b.Lock() + defer b.Unlock() if db, err = b.getDBhandle(); err != nil { return nil, err @@ -167,6 +171,9 @@ func (b *BoltDB) Put(key string, value []byte, opts *store.WriteOptions) error { db *bolt.DB err error ) + b.Lock() + defer b.Unlock() + dbval := make([]byte, libkvmetadatalen) if db, err = b.getDBhandle(); err != nil { @@ -199,6 +206,9 @@ func (b *BoltDB) Delete(key string) error { db *bolt.DB err error ) + b.Lock() + defer b.Unlock() + if db, err = b.getDBhandle(); err != nil { return err } @@ -222,6 +232,8 @@ func (b *BoltDB) Exists(key string) (bool, error) { db *bolt.DB err error ) + b.Lock() + defer b.Unlock() if db, err = b.getDBhandle(); err != nil { return false, err @@ -251,6 +263,9 @@ func (b *BoltDB) List(keyPrefix string) ([]*store.KVPair, error) { db *bolt.DB err error ) + b.Lock() + defer b.Unlock() + kv := []*store.KVPair{} if db, err = b.getDBhandle(); err != nil { @@ -297,6 +312,8 @@ func (b *BoltDB) AtomicDelete(key string, previous *store.KVPair) (bool, error) db *bolt.DB err error ) + b.Lock() + defer b.Unlock() if previous == nil { return false, store.ErrPreviousNotSpecified @@ -335,6 +352,9 @@ func (b *BoltDB) AtomicPut(key string, value []byte, previous *store.KVPair, opt db *bolt.DB err error ) + b.Lock() + defer b.Unlock() + dbval := make([]byte, libkvmetadatalen) if db, err = b.getDBhandle(); err != nil { @@ -389,6 +409,9 @@ func (b *BoltDB) AtomicPut(key string, value []byte, previous *store.KVPair, opt // Close the db connection to the BoltDB func (b *BoltDB) Close() { + b.Lock() + defer b.Unlock() + if !b.PersistConnection { b.reset() } else { @@ -403,6 +426,9 @@ func (b *BoltDB) DeleteTree(keyPrefix string) error { db *bolt.DB err error ) + b.Lock() + defer b.Unlock() + if db, err = b.getDBhandle(); err != nil { return err }