Skip to content

Commit 57c67dd

Browse files
committed
add zset gc
1 parent 8f382b6 commit 57c67dd

File tree

3 files changed

+45
-3
lines changed

3 files changed

+45
-3
lines changed

index.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,9 @@ func (db *RoseDB) buildSetsIndex(ent *logfile.LogEntry, pos *valuePos) {
135135
func (db *RoseDB) buildZSetIndex(ent *logfile.LogEntry, pos *valuePos) {
136136
if ent.Type == logfile.TypeDelete {
137137
db.zsetIndex.indexes.ZRem(string(ent.Key), string(ent.Value))
138-
db.zsetIndex.idxTree.Delete(ent.Value)
138+
if db.zsetIndex.idxTree != nil {
139+
db.zsetIndex.idxTree.Delete(ent.Value)
140+
}
139141
return
140142
}
141143

zset.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package rosedb
33
import (
44
"github.com/flower-corp/rosedb/ds/art"
55
"github.com/flower-corp/rosedb/logfile"
6+
"github.com/flower-corp/rosedb/logger"
67
"github.com/flower-corp/rosedb/util"
78
)
89

@@ -73,11 +74,23 @@ func (db *RoseDB) ZRem(key, member []byte) error {
7374
db.zsetIndex.trees[string(key)] = art.NewART()
7475
}
7576
db.zsetIndex.idxTree = db.zsetIndex.trees[string(key)]
76-
db.zsetIndex.idxTree.Delete(sum)
77+
78+
oldVal, deleted := db.zsetIndex.idxTree.Delete(sum)
79+
db.sendDiscard(oldVal, deleted, ZSet)
7780
entry := &logfile.LogEntry{Key: key, Value: sum, Type: logfile.TypeDelete}
78-
if _, err := db.writeLogEntry(entry, ZSet); err != nil {
81+
pos, err := db.writeLogEntry(entry, ZSet)
82+
if err != nil {
7983
return err
8084
}
85+
86+
// The deleted entry itself is also invalid.
87+
_, size := logfile.EncodeEntry(entry)
88+
node := &indexNode{fid: pos.fid, entrySize: size}
89+
select {
90+
case db.discards[ZSet].valChan <- node:
91+
default:
92+
logger.Warn("send to discard chan fail")
93+
}
8194
return nil
8295
}
8396

zset_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,30 @@ func testRoseDBZRange(t *testing.T, ioType IOType, mode DataIndexMode) {
184184
assert.Nil(t, err)
185185
assert.Equal(t, 4, len(values))
186186
}
187+
188+
func TestRoseDB_ZSetGC(t *testing.T) {
189+
path := filepath.Join("/tmp", "rosedb")
190+
opts := DefaultOptions(path)
191+
opts.LogFileSizeThreshold = 32 << 20
192+
db, err := Open(opts)
193+
assert.Nil(t, err)
194+
defer destroyDB(db)
195+
196+
zsetKey := []byte("my_zset")
197+
writeCount := 500000
198+
for i := 0; i < writeCount; i++ {
199+
err := db.ZAdd(zsetKey, float64(i+100), GetKey(i))
200+
assert.Nil(t, err)
201+
}
202+
203+
for i := 0; i < writeCount/2; i++ {
204+
err := db.ZRem(zsetKey, GetKey(i))
205+
assert.Nil(t, err)
206+
}
207+
208+
err = db.RunLogFileGC(ZSet, 0, 0.1)
209+
assert.Nil(t, err)
210+
211+
card := db.ZCard(zsetKey)
212+
assert.Equal(t, writeCount/2, card)
213+
}

0 commit comments

Comments
 (0)