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