From 36d70e64340033f1e5b928524436c0b2f44c831e Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 10 Jul 2026 20:24:59 +0200 Subject: moved commands and database and main into separate packages --- shards.go | 132 -------------------------------------------------------------- 1 file changed, 132 deletions(-) delete mode 100644 shards.go (limited to 'shards.go') diff --git a/shards.go b/shards.go deleted file mode 100644 index 591e121..0000000 --- a/shards.go +++ /dev/null @@ -1,132 +0,0 @@ -package main - -import ( - "hash/fnv" - "sort" - "sync" -) -type Shard struct{ - mu sync.RWMutex - id int - data map[string]Item -} - -func (db *RedisDB) getShard(key string)*Shard{ - hash := fnv.New64a() - hash.Write([]byte(key)) - val := hash.Sum64() - - return db.shards[val%NumShards] -} - -func (db *RedisDB) Execute(key string, fn func(*Shard) interface{}) interface{} { - shard := db.getShard(key) - shard.mu.Lock() - defer shard.mu.Unlock() - return fn(shard) -} -func (db *RedisDB) ExecuteRead(key string, fn func(*Shard) interface{}) interface{} { - shard := db.getShard(key) - shard.mu.RLock() - defer shard.mu.RUnlock() - return fn(shard) -} -func ( db *RedisDB) ExecuteMulti(keys []string, fn func([]*Shard) interface{})interface{}{ - if len(keys) == 1{ - shard := db.getShard(keys[0]) - shard.mu.Lock() - defer shard.mu.Unlock() - shards := []*Shard{shard} - return fn(shards) - }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() - } - defer func(){ - for i := len(sortedIDs)-1; i >= 0; i --{ - shardMap[sortedIDs[i]].mu.Unlock() - } - }() - - shards := make([]*Shard, 0, len(shardMap)) - for _, id := range sortedIDs { - shards = append(shards, shardMap[id]) - } - return fn(shards) - } -} - -func ( db *RedisDB) ExecuteAll(fn func([]*Shard) interface{})interface{}{ - for _, shard := range db.shards { - shard.mu.Lock() - } - - defer func(){ - for i := len(db.shards)-1;i >= 0; i --{ - db.shards[i].mu.Unlock() - } - }() - - return fn(db.shards) -} - -func ( db *RedisDB) ExecuteReadAll(fn func([]*Shard) interface{})interface{}{ - for _, shard := range db.shards { - shard.mu.RLock() - } - - defer func(){ - for i := len(db.shards)-1;i >= 0; i --{ - db.shards[i].mu.RUnlock() - } - }() - - 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 -- cgit v1.2.3