瀏覽代碼

backend: update db.size after defrag

Xiang Li 9 年之前
父節點
當前提交
74d50884bb
共有 3 個文件被更改,包括 19 次插入0 次删除
  1. 2 0
      storage/backend/backend.go
  2. 16 0
      storage/backend/backend_test.go
  3. 1 0
      storage/backend/batch_tx.go

+ 2 - 0
storage/backend/backend.go

@@ -251,6 +251,8 @@ func (b *backend) Defrag() error {
 	if err != nil {
 		log.Fatalf("backend: cannot begin tx (%s)", err)
 	}
+	// commit to update metadata like db.size
+	b.batchTx.commit(false)
 
 	return nil
 }

+ 16 - 0
storage/backend/backend_test.go

@@ -129,6 +129,17 @@ func TestBackendDefrag(t *testing.T) {
 	tx.Unlock()
 	b.ForceCommit()
 
+	// remove some keys to ensure the disk space will be reclaimed after defrag
+	tx = b.BatchTx()
+	tx.Lock()
+	for i := 0; i < 50; i++ {
+		tx.UnsafeDelete([]byte("test"), []byte(fmt.Sprintf("foo_%d", i)))
+	}
+	tx.Unlock()
+	b.ForceCommit()
+
+	size := b.Size()
+
 	// shrink and check hash
 	oh, err := b.Hash()
 	if err != nil {
@@ -148,6 +159,11 @@ func TestBackendDefrag(t *testing.T) {
 		t.Errorf("hash = %v, want %v", nh, oh)
 	}
 
+	nsize := b.Size()
+	if nsize >= size {
+		t.Errorf("new size = %v, want < %d", nsize, size)
+	}
+
 	// try put more keys after shrink.
 	tx = b.BatchTx()
 	tx.Lock()

+ 1 - 0
storage/backend/batch_tx.go

@@ -160,6 +160,7 @@ func (t *batchTx) commit(stop bool) {
 	// commit the last tx
 	if t.tx != nil {
 		if t.pending == 0 && !stop {
+			atomic.StoreInt64(&t.backend.size, t.tx.Size())
 			return
 		}
 		err = t.tx.Commit()