From 4df84993f7fb286fda817b0582878e8ac668ba1f Mon Sep 17 00:00:00 2001 From: suxb201 Date: Wed, 6 Jul 2022 12:59:20 +0800 Subject: [PATCH] add more log and test about KeySlot --- internal/commands/keys.go | 32 ++++++++++++----------- internal/commands/keys_test.go | 46 ++++++++++++++++++++++++++++++++++ internal/utils/crc16.go | 4 --- internal/utils/crc_test.go | 6 ++--- internal/writer/redis.go | 2 +- 5 files changed, 68 insertions(+), 22 deletions(-) diff --git a/internal/commands/keys.go b/internal/commands/keys.go index ea22edd..0899e05 100644 --- a/internal/commands/keys.go +++ b/internal/commands/keys.go @@ -91,22 +91,26 @@ func CalcKeys(argv []string) (cmaName string, group string, keys []string) { func CalcSlots(keys []string) []int { slots := make([]int, len(keys)) for inx, key := range keys { - hashtag := "" - findHashTag: - for i, s := range key { - if s == '{' { - for k := i; k < len(key); k++ { - if key[k] == '}' { - hashtag = key[i+1 : k] - break findHashTag - } + slots[inx] = int(keyHash(key)) + } + return slots +} + +func keyHash(key string) uint16 { + hashtag := "" +findHashTag: + for i, s := range key { + if s == '{' { + for k := i; k < len(key); k++ { + if key[k] == '}' { + hashtag = key[i+1 : k] + break findHashTag } } } - if len(hashtag) > 0 { - key = hashtag - } - slots[inx] = int(utils.KeyHash(key) & 0x3fff) } - return slots + if len(hashtag) > 0 { + key = hashtag + } + return utils.Crc16(key) & 0x3FFF } diff --git a/internal/commands/keys_test.go b/internal/commands/keys_test.go index 279f6c1..84ba505 100644 --- a/internal/commands/keys_test.go +++ b/internal/commands/keys_test.go @@ -40,5 +40,51 @@ func TestCalcKeys(t *testing.T) { if cmd != "ZUNIONSTORE" || group != "SORTED_SET" || !testEq(keys, []string{"key", "key1", "key2"}) { t.Errorf("CalcKeys(ZUNIONSTORE key 2 key1 key2) failed. cmd=%s, group=%s, keys=%v", cmd, group, keys) } +} +func TestKeyHash(t *testing.T) { + ret := keyHash("abcde") + if ret != 16097 { + t.Errorf("keyHash(abcde) = %x", ret) + } + ret = keyHash("abcde{") + if ret != 14689 { + t.Errorf("keyHash(abcde{) = %x", ret) + } + ret = keyHash("abcde}") + if ret != 6567 { + t.Errorf("keyHash(abcde}) = %x", ret) + } + ret = keyHash("{abcde}") + if ret != 16097 { + t.Errorf("keyHash({abcde}) = %x", ret) + } + ret = keyHash("same") + if ret != 13447 { + t.Errorf("keyHash(same) = %x", ret) + } + ret = keyHash("abcdefghi{same}abcdefghi") + if ret != 13447 { + t.Errorf("keyHash(abcdefghi{same}abcdefghi) = %x", ret) + } + ret = keyHash("123456789{same}123456789") + if ret != 13447 { + t.Errorf("keyHash(123456789{same}123456789) = %x", ret) + } + ret = keyHash("1234我是你89{same}12我就456789") + if ret != 13447 { + t.Errorf("keyHash(1234我是你89{same}12我就456789) = %x", ret) + } + ret = keyHash("你你你{你你你}你你你") + if ret != 15023 { + t.Errorf("keyHash(1234我是你89{same}12我就456789) = %x", ret) + } + b := make([]byte, 0) + for i := 0; i < 256; i++ { + b = append(b, byte(i)) + } + ret = keyHash(string(b)) + if ret != 16155 { + t.Errorf("keyHash(%s) = %x", string(b), ret) + } } diff --git a/internal/utils/crc16.go b/internal/utils/crc16.go index 243e6fb..0099b9c 100644 --- a/internal/utils/crc16.go +++ b/internal/utils/crc16.go @@ -87,7 +87,3 @@ func Crc16(buf string) uint16 { } return crc } - -func KeyHash(buf string) uint16 { - return Crc16(buf) & 0x3FFF -} diff --git a/internal/utils/crc_test.go b/internal/utils/crc_test.go index bc368ae..95107d3 100644 --- a/internal/utils/crc_test.go +++ b/internal/utils/crc_test.go @@ -3,8 +3,8 @@ package utils import "testing" func TestCrc16(t *testing.T) { - ret := KeyHash("你") - if ret != 8522 { - t.Errorf("KeyHash failed, expect: %d, actual: %d", 8522, ret) + ret := Crc16("123456789") + if ret != 0x31c3 { + t.Errorf("Crc16(123456789) = %x", ret) } } diff --git a/internal/writer/redis.go b/internal/writer/redis.go index 04de9ac..156dafe 100644 --- a/internal/writer/redis.go +++ b/internal/writer/redis.go @@ -68,7 +68,7 @@ func (w *redisWriter) flushInterval() { log.Panicf("redisWriter received BUSYKEY reply. argv=%v", e.Argv) } } else { - log.Panicf("redisWriter received error. error=[%v], argv=%v, reply=[%s]", err, e.Argv, reply) + log.Panicf("redisWriter received error. error=[%v], argv=%v, slots=%v, reply=[%v]", err, e.Argv, e.Slots, reply) } } atomic.AddUint64(&w.UpdateUnansweredBytesCount, ^(e.EncodedSize - 1))