aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.go15
-rw-r--r--shards.go37
2 files changed, 38 insertions, 14 deletions
diff --git a/main.go b/main.go
index a7f6d47..84580bf 100644
--- a/main.go
+++ b/main.go
@@ -2,7 +2,6 @@ package main
import (
"bufio"
- "errors"
"fmt"
"net"
"os"
@@ -118,19 +117,7 @@ func handleConnection(conn net.Conn) {
command := strings.ToUpper(args[0])
- switch {
- case baseCommandRegistry[command] != nil:
- handler := baseCommandRegistry[command]
- conn.Write(serializeRESP(handler(args)))
-
- case connectionCommandRegistry[command] != nil:
- handler := connectionCommandRegistry[command]
- handler(conn, args)
-
- default:
- errMsg := fmt.Sprintf("ERR unknown command '%s'", command)
- conn.Write(serializeRESP(errors.New(errMsg)))
- }
+ conn.Write(serializeRESP(DispatchBaseCommand(command,args)))
}
} \ No newline at end of file
diff --git a/shards.go b/shards.go
index ef9f9ef..591e121 100644
--- a/shards.go
+++ b/shards.go
@@ -92,4 +92,41 @@ func ( db *RedisDB) ExecuteReadAll(fn func([]*Shard) interface{})interface{}{
}()
return fn(db.shards)
+}
+
+func ( db *RedisDB) Lock(keys []string){
+ if len(keys) == 1{
+ shard := db.getShard(keys[0])
+ shard.mu.Lock()
+ }else{
+ shardMap := make(map[int]*Shard)
+ for _, k := range keys {
+ shard := db.getShard(k)
+ shardMap[shard.id] = shard
+ }
+ var sortedIDs []int
+ for id := range shardMap {
+ sortedIDs = append(sortedIDs, id)
+ }
+ sort.Ints(sortedIDs)
+ for _, id := range sortedIDs{
+ shardMap[id].mu.Lock()
+ }
+ }
+}
+func ( db *RedisDB) Unlock(keys []string){
+ shardMap := make(map[int]*Shard)
+ for _, k := range keys {
+ shard := db.getShard(k)
+ shardMap[shard.id] = shard
+ }
+ var sortedIDs []int
+ for id := range shardMap {
+ sortedIDs = append(sortedIDs, id)
+ }
+ sort.Ints(sortedIDs)
+
+ for i := len(sortedIDs)-1; i >= 0; i --{
+ shardMap[sortedIDs[i]].mu.Unlock()
+ }
} \ No newline at end of file