From 588e0fffc8b9d8dec08bb74cc0b792afbc43c228 Mon Sep 17 00:00:00 2001 From: Wolfgang Welz <welzwo@gmail.com> Date: Tue, 6 Aug 2019 10:26:21 +0200 Subject: [PATCH] Fix: race condition in Database.Get --- packages/database/database.go | 37 +++++++++++++---------------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/packages/database/database.go b/packages/database/database.go index 573d0dd4..b69920b9 100644 --- a/packages/database/database.go +++ b/packages/database/database.go @@ -10,22 +10,19 @@ var dbMap = make(map[string]*prefixDb) var mu sync.Mutex type prefixDb struct { - db *badger.DB - name string - prefix []byte - openLock sync.Mutex + db *badger.DB + name string + prefix []byte } -func Get(name string) (Database, error) { - // avoid locking if it's a clean hit - if db, exists := dbMap[name]; exists { - return db, nil - } +func getPrefix(name string) []byte { + return []byte(name + "_") +} +func Get(name string) (Database, error) { mu.Lock() defer mu.Unlock() - // needs to be re-checked after locking if db, exists := dbMap[name]; exists { return db, nil } @@ -34,7 +31,7 @@ func Get(name string) (Database, error) { db := &prefixDb{ db: badger, name: name, - prefix: []byte(name + "_"), + prefix: getPrefix(name), } dbMap[name] = db @@ -43,21 +40,16 @@ func Get(name string) (Database, error) { } func (this *prefixDb) Set(key []byte, value []byte) error { - if err := this.db.Update(func(txn *badger.Txn) error { return txn.Set(append(this.prefix, key...), value) }); err != nil { - return err - } - - return nil + err := this.db.Update(func(txn *badger.Txn) error { + return txn.Set(append(this.prefix, key...), value) + }) + return err } func (this *prefixDb) Contains(key []byte) (bool, error) { err := this.db.View(func(txn *badger.Txn) error { _, err := txn.Get(append(this.prefix, key...)) - if err != nil { - return err - } - - return nil + return err }) if err == badger.ErrKeyNotFound { @@ -88,8 +80,7 @@ func (this *prefixDb) Get(key []byte) ([]byte, error) { func (this *prefixDb) Delete(key []byte) error { err := this.db.Update(func(txn *badger.Txn) error { - err := txn.Delete(append(this.prefix, key...)) - return err + return txn.Delete(append(this.prefix, key...)) }) return err } -- GitLab