diff --git a/backend_test.go b/backend_test.go index 00a39fe..095a0bf 100644 --- a/backend_test.go +++ b/backend_test.go @@ -4,10 +4,12 @@ import ( "fmt" "os" "path/filepath" + "strings" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "time" ) // Register a test backend for PrefixDB as well, with some unrelated junk data @@ -135,11 +137,22 @@ func testBackendGetSetDelete(t *testing.T, backend BackendType) { require.NoError(t, err) require.Equal(t, []byte{}, value) + err = db.Compact(nil, nil) + if strings.Contains(string(backend), "pebbledb") { + // In pebble the strat and end will be the same so + // we expect an error + require.Error(t, err) + } + err = db.Set([]byte("y"), []byte{}) require.NoError(t, err) err = db.Compact(nil, nil) require.NoError(t, err) + + if strings.Contains(string(backend), "pebbledb") { + time.Sleep(time.Second * 5) + } } func TestBackendsGetSetDelete(t *testing.T) { @@ -425,6 +438,10 @@ func testDBBatch(t *testing.T, backend BackendType) { require.Error(t, batch.WriteSync()) require.NoError(t, batch.Compact(nil, nil)) + + if strings.Contains(string(backend), "pebbledb") { + time.Sleep(5 * time.Second) + } } func assertKeyValues(t *testing.T, db DB, expect map[string][]byte) { diff --git a/pebble.go b/pebble.go index 0ca3766..1dccf17 100644 --- a/pebble.go +++ b/pebble.go @@ -139,20 +139,24 @@ func (db *PebbleDB) DB() *pebble.DB { func (db *PebbleDB) Compact(start, end []byte) error { // Currently nil,nil is an invalid range in Pebble. // This was taken from https://github.com/cockroachdb/pebble/issues/1474 + // In case the start and end keys are the same + // pebbleDB will throw an error that it cannot compact. + if start != nil && end != nil { + return db.db.Compact(start, end, true) + } iter := db.db.NewIter(nil) - var first, last []byte - if iter.First() { - first = append(first, iter.Key()...) + if start == nil && iter.First() { + start = append(start, iter.Key()...) } - if iter.Last() { - last = append(last, iter.Key()...) + if end == nil && iter.Last() { + end = append(end, iter.Key()...) } if err := iter.Close(); err != nil { return err } - return db.db.Compact(first, last, true) + return db.db.Compact(start, end, true) } // Close implements DB.