From 6cb3313793bf45e197b3048f0abd2f600bf97bb5 Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 12 Jul 2026 15:00:16 +0200 Subject: multi exec and discard --- pkg/commands/exec.go | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 pkg/commands/exec.go (limited to 'pkg/commands/exec.go') diff --git a/pkg/commands/exec.go b/pkg/commands/exec.go new file mode 100644 index 0000000..a260f69 --- /dev/null +++ b/pkg/commands/exec.go @@ -0,0 +1,68 @@ +package commands + +import ( + "errors" + "net" + "redisClone/pkg/core" + "sort" +) + +func Exec(db core.RedisDB, session *ClientSession, conn net.Conn, execArgs []string) interface{} { + if session.Queue == nil { + return errors.New("EXEC without MULTI") + } + + shardMap := make(map[int]*core.Shard) + lockedAll := false + var sortedIDs []int + + for _, cmdArgs := range session.Queue { + cmdName := cmdArgs[0] + if cmd, ok := BaseRegistry[cmdName]; ok { + if cmd.LocksAll { + db.LockAll() + lockedAll = true + break + } + for _, key := range cmd.ExtractKeys(cmdArgs) { + shard := db.GetShard(key) + shardMap[shard.Id] = shard + } + } + } + + if !lockedAll { + for id := range shardMap { + sortedIDs = append(sortedIDs, id) + } + sort.Ints(sortedIDs) + for _, id := range sortedIDs { + shardMap[id].Mu.Lock() + } + + defer func() { + for i := len(sortedIDs) - 1; i >= 0; i-- { + shardMap[sortedIDs[i]].Mu.Unlock() + } + }() + } else { + defer db.UnlockAll() + } + + var results []interface{} + + for _, cmdArgs := range session.Queue { + cmdName := cmdArgs[0] + if cmd, ok := BaseRegistry[cmdName]; ok { + // Capture the result of the command + res := cmd.Execute(cmdArgs, db.GetShard) + results = append(results, res) + } else { + results = append(results, "ERR unknown command") + } + } + + session.Queue = nil + + return results +} \ No newline at end of file -- cgit v1.2.3