diff options
Diffstat (limited to 'shards.go')
| -rw-r--r-- | shards.go | 37 |
1 files changed, 37 insertions, 0 deletions
@@ -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 |
