diff --git a/server/mvcc/backend/backend.go b/server/mvcc/backend/backend.go index 529f83b0f..1e5f191c8 100644 --- a/server/mvcc/backend/backend.go +++ b/server/mvcc/backend/backend.go @@ -100,8 +100,9 @@ type backend struct { // mlock prevents backend database file to be swapped mlock bool - mu sync.RWMutex - db *bolt.DB + mu sync.RWMutex + bopts *bolt.Options + db *bolt.DB batchInterval time.Duration batchLimit int @@ -185,7 +186,8 @@ func newBackend(bcfg BackendConfig) *backend { // In future, may want to make buffering optional for low-concurrency systems // or dynamically swap between buffered/non-buffered depending on workload. b := &backend{ - db: db, + bopts: bopts, + db: db, batchInterval: bcfg.BatchInterval, batchLimit: bcfg.BatchLimit, @@ -511,13 +513,7 @@ func (b *backend) defrag() error { b.lg.Fatal("failed to rename tmp database", zap.Error(err)) } - defragmentedBoltOptions := bolt.Options{} - if boltOpenOptions != nil { - defragmentedBoltOptions = *boltOpenOptions - } - defragmentedBoltOptions.Mlock = b.mlock - - b.db, err = bolt.Open(dbp, 0600, &defragmentedBoltOptions) + b.db, err = bolt.Open(dbp, 0600, b.bopts) if err != nil { b.lg.Fatal("failed to open database", zap.String("path", dbp), zap.Error(err)) } diff --git a/server/mvcc/backend/backend_test.go b/server/mvcc/backend/backend_test.go index af93f1ab8..5bc6c1c75 100644 --- a/server/mvcc/backend/backend_test.go +++ b/server/mvcc/backend/backend_test.go @@ -122,7 +122,17 @@ func TestBackendBatchIntervalCommit(t *testing.T) { } func TestBackendDefrag(t *testing.T) { - b, _ := betesting.NewDefaultTmpBackend(t) + bcfg := backend.DefaultBackendConfig() + // Make sure we change BackendFreelistType + // The goal is to verify that we restore config option after defrag. + if bcfg.BackendFreelistType == bolt.FreelistMapType { + bcfg.BackendFreelistType = bolt.FreelistArrayType + } else { + bcfg.BackendFreelistType = bolt.FreelistMapType + } + + b, _ := betesting.NewTmpBackendFromCfg(t, bcfg) + defer betesting.Close(t, b) tx := b.BatchTx() @@ -168,6 +178,10 @@ func TestBackendDefrag(t *testing.T) { if nsize >= size { t.Errorf("new size = %v, want < %d", nsize, size) } + db := backend.DbFromBackendForTest(b) + if db.FreelistType != bcfg.BackendFreelistType { + t.Errorf("db FreelistType = [%v], want [%v]", db.FreelistType, bcfg.BackendFreelistType) + } // try put more keys after shrink. tx = b.BatchTx()