fix: when rewrite complex type, use overlay rather than append or merge (#932)

This commit is contained in:
lvxiaorun 2025-03-12 11:30:02 +08:00 committed by GitHub
parent 0a7aad7459
commit a340c31510
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 11 additions and 0 deletions

View File

@ -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()

View File

@ -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()

View File

@ -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)

View File

@ -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()

View File

@ -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) {

View File

@ -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()

View File

@ -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)

View File

@ -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++ {

View File

@ -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()