From a340c3151031a6847b5d2d9ed971b974ec23f34b Mon Sep 17 00:00:00 2001 From: lvxiaorun <173360368@qq.com> Date: Wed, 12 Mar 2025 11:30:02 +0800 Subject: [PATCH] fix: when rewrite complex type, use overlay rather than append or merge (#932) --- internal/rdb/types/hash.go | 1 + internal/rdb/types/list.go | 1 + internal/rdb/types/mbbloom.go | 1 + internal/rdb/types/set.go | 1 + internal/rdb/types/set_test.go | 3 +++ internal/rdb/types/stream.go | 1 + internal/rdb/types/tairhash.go | 1 + internal/rdb/types/tairzset.go | 1 + internal/rdb/types/zset.go | 1 + 9 files changed, 11 insertions(+) diff --git a/internal/rdb/types/hash.go b/internal/rdb/types/hash.go index af005a8..2991760 100644 --- a/internal/rdb/types/hash.go +++ b/internal/rdb/types/hash.go @@ -24,6 +24,7 @@ func (o *HashObject) LoadFromBuffer(rd io.Reader, key string, typeByte byte) { func (o *HashObject) Rewrite() <-chan RedisCmd { go func() { defer close(o.cmdC) + o.cmdC <- RedisCmd{"del", o.key} switch o.typeByte { case rdbTypeHash: o.readHash() diff --git a/internal/rdb/types/list.go b/internal/rdb/types/list.go index a10c8a3..1ea4823 100644 --- a/internal/rdb/types/list.go +++ b/internal/rdb/types/list.go @@ -30,6 +30,7 @@ func (o *ListObject) LoadFromBuffer(rd io.Reader, key string, typeByte byte) { func (o *ListObject) Rewrite() <-chan RedisCmd { go func() { defer close(o.cmdC) + o.cmdC <- RedisCmd{"del", o.key} switch o.typeByte { case rdbTypeList: o.readList() diff --git a/internal/rdb/types/mbbloom.go b/internal/rdb/types/mbbloom.go index 3ae3ebb..8ec3947 100644 --- a/internal/rdb/types/mbbloom.go +++ b/internal/rdb/types/mbbloom.go @@ -140,6 +140,7 @@ func (o *BloomObject) Rewrite() <-chan RedisCmd { } else { h = getEncodedHeader(&o.sb, true, true) } + cmdC <- RedisCmd{"del", o.key} cmd := RedisCmd{"BF.LOADCHUNK", o.key, "1", h} cmdC <- cmd curIter := uint64(1) diff --git a/internal/rdb/types/set.go b/internal/rdb/types/set.go index 6cafdb0..7bd5372 100644 --- a/internal/rdb/types/set.go +++ b/internal/rdb/types/set.go @@ -24,6 +24,7 @@ func (o *SetObject) LoadFromBuffer(rd io.Reader, key string, typeByte byte) { func (o *SetObject) Rewrite() <-chan RedisCmd { go func() { defer close(o.cmdC) + o.cmdC <- RedisCmd{"del", o.key} switch o.typeByte { case rdbTypeSet: o.readSet() diff --git a/internal/rdb/types/set_test.go b/internal/rdb/types/set_test.go index 184244a..521ef0d 100644 --- a/internal/rdb/types/set_test.go +++ b/internal/rdb/types/set_test.go @@ -19,6 +19,9 @@ func testOne(t *testing.T, typeByte byte, setData string, values []string) { cmdC := o.Rewrite() var elements []string for cmd := range cmdC { + if cmd[0] == "del" { + continue + } elements = append(elements, cmd[2]) } if len(elements) != len(values) { diff --git a/internal/rdb/types/stream.go b/internal/rdb/types/stream.go index 87b0726..511723e 100644 --- a/internal/rdb/types/stream.go +++ b/internal/rdb/types/stream.go @@ -57,6 +57,7 @@ func (o *StreamObject) LoadFromBuffer(rd io.Reader, key string, typeByte byte) { func (o *StreamObject) Rewrite() <-chan RedisCmd { go func() { defer close(o.cmdC) + o.cmdC <- RedisCmd{"del", o.key} switch o.typeByte { case rdbTypeStreamListpacks: o.readStream() diff --git a/internal/rdb/types/tairhash.go b/internal/rdb/types/tairhash.go index 993cf54..5267a2d 100644 --- a/internal/rdb/types/tairhash.go +++ b/internal/rdb/types/tairhash.go @@ -26,6 +26,7 @@ func (o *TairHashObject) Rewrite() <-chan RedisCmd { dictSizeStr := structure.ReadModuleUnsigned(rd) key := structure.ReadModuleString(rd) size, _ := strconv.Atoi(dictSizeStr) + cmdC <- RedisCmd{"del", key} for i := 0; i < size; i++ { skey := structure.ReadModuleString(rd) version := structure.ReadModuleUnsigned(rd) diff --git a/internal/rdb/types/tairzset.go b/internal/rdb/types/tairzset.go index 5dcb912..c88559b 100644 --- a/internal/rdb/types/tairzset.go +++ b/internal/rdb/types/tairzset.go @@ -25,6 +25,7 @@ func (o *TairZsetObject) Rewrite() <-chan RedisCmd { cmdC := o.cmdC go func() { defer close(cmdC) + cmdC <- RedisCmd{"del", o.key} length, _ := strconv.Atoi(structure.ReadModuleUnsigned(rd)) scoreNum, _ := strconv.Atoi(structure.ReadModuleUnsigned(rd)) for i := 0; i < length; i++ { diff --git a/internal/rdb/types/zset.go b/internal/rdb/types/zset.go index cd1dee3..f3604f5 100644 --- a/internal/rdb/types/zset.go +++ b/internal/rdb/types/zset.go @@ -25,6 +25,7 @@ func (o *ZsetObject) LoadFromBuffer(rd io.Reader, key string, typeByte byte) { func (o *ZsetObject) Rewrite() <-chan RedisCmd { go func() { defer close(o.cmdC) + o.cmdC <- RedisCmd{"del", o.key} switch o.typeByte { case rdbTypeZSet: o.readZset()