From 81e1ae52a3cde6a2c21056ec53f91e790e7ac24b Mon Sep 17 00:00:00 2001 From: Pawan Rawal Date: Mon, 26 Jun 2017 13:21:03 +1000 Subject: [PATCH] Write deletions to value log even if SyncWrite is set to false. Fix #72 --- badger/kv_test.go | 33 +++++++++++++++++++++++++++++++++ badger/value.go | 2 +- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/badger/kv_test.go b/badger/kv_test.go index 0af03605448..0fc56cfd007 100644 --- a/badger/kv_test.go +++ b/badger/kv_test.go @@ -667,6 +667,39 @@ func TestDirNotExists(t *testing.T) { require.Error(t, err) } +func TestDeleteWithoutSyncWrite(t *testing.T) { + dir, err := ioutil.TempDir("/tmp", "badger") + require.NoError(t, err) + defer os.RemoveAll(dir) + opt := new(Options) + *opt = DefaultOptions + opt.Dir = dir + opt.ValueDir = dir + kv, err := NewKV(opt) + if err != nil { + t.Error(err) + t.Fail() + } + + key := []byte("k1") + // Set a value with size > value threshold so that its written to value log. + require.NoError(t, kv.Set(key, []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789FOOBARZOGZOG"))) + require.NoError(t, kv.Delete(key)) + kv.Close() + + // Reopen KV + kv, err = NewKV(opt) + if err != nil { + t.Error(err) + t.Fail() + } + defer kv.Close() + + item := KVItem{} + require.NoError(t, kv.Get(key, &item)) + require.Equal(t, 0, len(item.Value())) +} + func BenchmarkExists(b *testing.B) { dir, err := ioutil.TempDir("/tmp", "badger") require.NoError(b, err) diff --git a/badger/value.go b/badger/value.go index 590d5a4cdf7..c80994826ac 100644 --- a/badger/value.go +++ b/badger/value.go @@ -659,7 +659,7 @@ func (l *valueLog) write(reqs []*request) error { y.AssertTruef(e.Meta&BitCompressed == 0, "Cannot set BitCompressed outside valueLog") var p valuePointer - if !l.opt.SyncWrites && len(e.Value) < l.opt.ValueThreshold { + if !l.opt.SyncWrites && (e.Meta != BitDelete) && len(e.Value) < l.opt.ValueThreshold { // No need to write to value log. b.Ptrs = append(b.Ptrs, p) continue