Skip to content

Commit cc2e2e7

Browse files
authored
fix(db): dvoid panic in parallel reads after closing DB (#1987)
Signed-off-by: fatelei <[email protected]>
1 parent c2e611a commit cc2e2e7

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

db.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,6 +546,7 @@ func (db *DB) close() (err error) {
546546
db.opt.Infof("Lifetime L0 stalled for: %s\n", time.Duration(db.lc.l0stallsMs.Load()))
547547

548548
db.blockWrites.Store(1)
549+
db.isClosed.Store(1)
549550

550551
if !db.opt.InMemory {
551552
// Stop value GC first.
@@ -631,7 +632,6 @@ func (db *DB) close() (err error) {
631632
db.blockCache.Close()
632633
db.indexCache.Close()
633634

634-
db.isClosed.Store(1)
635635
db.threshold.close()
636636

637637
if db.opt.InMemory {

db_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2635,3 +2635,37 @@ func TestCompactL0OnClose(t *testing.T) {
26352635
}
26362636
})
26372637
}
2638+
2639+
func TestCloseDBWhileReading(t *testing.T) {
2640+
dir := t.TempDir()
2641+
db, err := Open(DefaultOptions(dir))
2642+
require.NoError(t, err)
2643+
2644+
key := []byte("key")
2645+
err = db.Update(func(txn *Txn) error {
2646+
return txn.Set(key, []byte("value"))
2647+
})
2648+
require.NoError(t, err)
2649+
2650+
var wg sync.WaitGroup
2651+
for i := 0; i < 10; i++ {
2652+
wg.Add(1)
2653+
go func() {
2654+
defer wg.Done()
2655+
for {
2656+
err := db.View(func(txn *Txn) error {
2657+
_, err := txn.Get(key)
2658+
return err
2659+
})
2660+
if err != nil {
2661+
require.Contains(t, err.Error(), "DB Closed")
2662+
break
2663+
}
2664+
}
2665+
}()
2666+
}
2667+
2668+
time.Sleep(time.Second)
2669+
require.NoError(t, db.Close())
2670+
wg.Wait()
2671+
}

0 commit comments

Comments
 (0)