From 8be8127351396593af941395f59c42e136f3e698 Mon Sep 17 00:00:00 2001 From: Emmanuel Odeke Date: Sun, 24 Sep 2017 20:00:42 -0600 Subject: [PATCH] db: fix MemDB.Close Fixes https://github.com/tendermint/tmlibs/issues/55 MemDB previously mistakenly set the actual DB pointer to nil although that side effect is not visible to the outside world since p is an identifier within the scope of just that function call. However, @melekes and I had a discussion in which we came to the conclusion that Close for an in-memory DB should instead be a noop and not cause any data loss. See the discussion on https://github.com/tendermint/tmlibs/pull/56. --- db/mem_db.go | 8 +++++--- db/mem_db_test.go | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/db/mem_db.go b/db/mem_db.go index db40227e8..58e74895b 100644 --- a/db/mem_db.go +++ b/db/mem_db.go @@ -52,9 +52,11 @@ func (db *MemDB) DeleteSync(key []byte) { } func (db *MemDB) Close() { - db.mtx.Lock() - defer db.mtx.Unlock() - db = nil + // Close is a noop since for an in-memory + // database, we don't have a destination + // to flush contents to nor do we want + // any data loss on invoking Close() + // See the discussion in https://github.com/tendermint/tmlibs/pull/56 } func (db *MemDB) Print() { diff --git a/db/mem_db_test.go b/db/mem_db_test.go index a76e10dc8..503e361f1 100644 --- a/db/mem_db_test.go +++ b/db/mem_db_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestMemDbIterator(t *testing.T) { @@ -26,3 +27,22 @@ func TestMemDbIterator(t *testing.T) { } assert.Equal(t, i, len(db.db), "iterator didnt cover whole db") } + +func TestMemDBClose(t *testing.T) { + db := NewMemDB() + copyDB := func(orig map[string][]byte) map[string][]byte { + copy := make(map[string][]byte) + for k, v := range orig { + copy[k] = v + } + return copy + } + k, v := []byte("foo"), []byte("bar") + db.Set(k, v) + require.Equal(t, db.Get(k), v, "expecting a successful get") + copyBefore := copyDB(db.db) + db.Close() + require.Equal(t, db.Get(k), v, "Close is a noop, expecting a successful get") + copyAfter := copyDB(db.db) + require.Equal(t, copyBefore, copyAfter, "Close is a noop and shouldn't modify any internal data") +}