bug fix: loadRdb forget to load set data struct

This commit is contained in:
finley
2023-05-08 23:36:56 +08:00
parent a266cc5aba
commit bd418bd82b
5 changed files with 36 additions and 8 deletions

View File

@@ -248,6 +248,15 @@ func (persister *Persister) LoadAof(maxBytes int) {
} }
} }
// Fsync flushes aof file to disk
func (persister *Persister) Fsync() {
persister.pausingAof.Lock()
if err := persister.aofFile.Sync(); err != nil {
logger.Errorf("fsync failed: %v", err)
}
persister.pausingAof.Unlock()
}
// Close gracefully stops aof persistence procedure // Close gracefully stops aof persistence procedure
func (persister *Persister) Close() { func (persister *Persister) Close() {
if persister.aofFile != nil { if persister.aofFile != nil {
@@ -268,11 +277,7 @@ func (persister *Persister) fsyncEverySecond() {
for { for {
select { select {
case <-ticker.C: case <-ticker.C:
persister.pausingAof.Lock() persister.Fsync()
if err := persister.aofFile.Sync(); err != nil {
logger.Errorf("fsync failed: %v", err)
}
persister.pausingAof.Unlock()
case <-persister.ctx.Done(): case <-persister.ctx.Done():
return return
} }

View File

@@ -9,6 +9,7 @@ import (
"github.com/hdt3213/godis/config" "github.com/hdt3213/godis/config"
"github.com/hdt3213/godis/datastruct/dict" "github.com/hdt3213/godis/datastruct/dict"
List "github.com/hdt3213/godis/datastruct/list" List "github.com/hdt3213/godis/datastruct/list"
HashSet "github.com/hdt3213/godis/datastruct/set"
SortedSet "github.com/hdt3213/godis/datastruct/sortedset" SortedSet "github.com/hdt3213/godis/datastruct/sortedset"
"github.com/hdt3213/godis/interface/database" "github.com/hdt3213/godis/interface/database"
"github.com/hdt3213/rdb/core" "github.com/hdt3213/rdb/core"
@@ -61,6 +62,15 @@ func (server *Server) LoadRDB(dec *core.Decoder) error {
entity = &database.DataEntity{ entity = &database.DataEntity{
Data: hash, Data: hash,
} }
case rdb.SetType:
setObj := o.(*rdb.SetObject)
set := HashSet.Make()
for _, mem := range setObj.Members {
set.Add(string(mem))
}
entity = &database.DataEntity{
Data: set,
}
case rdb.ZSetType: case rdb.ZSetType:
zsetObj := o.(*rdb.ZSetObject) zsetObj := o.(*rdb.ZSetObject)
zSet := SortedSet.Make() zSet := SortedSet.Make()
@@ -81,7 +91,6 @@ func (server *Server) LoadRDB(dec *core.Decoder) error {
} }
return true return true
}) })
} }
func NewPersister(db database.DBEngine, filename string, load bool, fsync string) (*aof.Persister, error) { func NewPersister(db database.DBEngine, filename string, load bool, fsync string) (*aof.Persister, error) {

View File

@@ -32,6 +32,8 @@ func TestLoadRDB(t *testing.T) {
asserts.AssertMultiBulkReply(t, result, []string{"1", "1"}) asserts.AssertMultiBulkReply(t, result, []string{"1", "1"})
result = rdbDB.Exec(conn, utils.ToCmdLine("ZRange", "zset", "0", "1", "WITHSCORES")) result = rdbDB.Exec(conn, utils.ToCmdLine("ZRange", "zset", "0", "1", "WITHSCORES"))
asserts.AssertMultiBulkReply(t, result, []string{"1", "1"}) asserts.AssertMultiBulkReply(t, result, []string{"1", "1"})
result = rdbDB.Exec(conn, utils.ToCmdLine("SCard", "set"))
asserts.AssertIntReply(t, result, 1)
config.Properties = &config.ServerProperties{ config.Properties = &config.ServerProperties{
AppendOnly: false, AppendOnly: false,

View File

@@ -2,6 +2,7 @@ package database
import ( import (
"fmt" "fmt"
"os"
"runtime/debug" "runtime/debug"
"strconv" "strconv"
"strings" "strings"
@@ -35,12 +36,23 @@ type Server struct {
masterStatus *masterStatus masterStatus *masterStatus
} }
func fileExists(filename string) bool {
info, err := os.Stat(filename)
return err == nil && !info.IsDir()
}
// NewStandaloneServer creates a standalone redis server, with multi database and all other funtions // NewStandaloneServer creates a standalone redis server, with multi database and all other funtions
func NewStandaloneServer() *Server { func NewStandaloneServer() *Server {
server := &Server{} server := &Server{}
if config.Properties.Databases == 0 { if config.Properties.Databases == 0 {
config.Properties.Databases = 16 config.Properties.Databases = 16
} }
// creat tmp dir
err := os.MkdirAll(config.GetTmpDir(), os.ModePerm)
if err != nil {
panic(fmt.Errorf("create tmp dir failed: %v", err))
}
// make db set
server.dbSet = make([]*atomic.Value, config.Properties.Databases) server.dbSet = make([]*atomic.Value, config.Properties.Databases)
for i := range server.dbSet { for i := range server.dbSet {
singleDB := makeDB() singleDB := makeDB()
@@ -53,13 +65,13 @@ func NewStandaloneServer() *Server {
// record aof // record aof
validAof := false validAof := false
if config.Properties.AppendOnly { if config.Properties.AppendOnly {
validAof = fileExists(config.Properties.AppendFilename)
aofHandler, err := NewPersister(server, aofHandler, err := NewPersister(server,
config.Properties.AppendFilename, true, config.Properties.AppendFsync) config.Properties.AppendFilename, true, config.Properties.AppendFsync)
if err != nil { if err != nil {
panic(err) panic(err)
} }
server.bindPersister(aofHandler) server.bindPersister(aofHandler)
validAof = true
} }
if config.Properties.RDBFilename != "" && !validAof { if config.Properties.RDBFilename != "" && !validAof {
// load rdb // load rdb

View File

@@ -7,4 +7,4 @@ appendfilename appendonly.aof
appendfsync everysec appendfsync everysec
aof-use-rdb-preamble yes aof-use-rdb-preamble yes
#dbfilename test.rdb dbfilename test.rdb