ethdb/pebble: prevent shutdown-panic (#27238)
One difference between pebble and leveldb is that the latter returns error when performing Get on a closed database, the former does a panic. This may be triggered during shutdown (see #27237) This PR changes the pebble driver so we check that the db is not closed already, for several operations. It also adds tests to the db test-suite, so the previously implicit assumption of "not panic:ing at ops on closed database" is covered by tests.
This commit is contained in:
@@ -376,6 +376,32 @@ func TestDatabaseSuite(t *testing.T, New func() ethdb.KeyValueStore) {
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("OperatonsAfterClose", func(t *testing.T) {
|
||||
db := New()
|
||||
db.Put([]byte("key"), []byte("value"))
|
||||
db.Close()
|
||||
if _, err := db.Get([]byte("key")); err == nil {
|
||||
t.Fatalf("expected error on Get after Close")
|
||||
}
|
||||
if _, err := db.Has([]byte("key")); err == nil {
|
||||
t.Fatalf("expected error on Get after Close")
|
||||
}
|
||||
if err := db.Put([]byte("key2"), []byte("value2")); err == nil {
|
||||
t.Fatalf("expected error on Put after Close")
|
||||
}
|
||||
if err := db.Delete([]byte("key")); err == nil {
|
||||
t.Fatalf("expected error on Delete after Close")
|
||||
}
|
||||
|
||||
b := db.NewBatch()
|
||||
if err := b.Put([]byte("batchkey"), []byte("batchval")); err != nil {
|
||||
t.Fatalf("expected no error on batch.Put after Close, got %v", err)
|
||||
}
|
||||
if err := b.Write(); err == nil {
|
||||
t.Fatalf("expected error on batch.Write after Close")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// BenchDatabaseSuite runs a suite of benchmarks against a KeyValueStore database
|
||||
|
||||
Reference in New Issue
Block a user