This is an automated email from the ASF dual-hosted git repository.
hulk pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git
The following commit(s) were added to refs/heads/unstable by this push:
new 88f1f3ea chore(config): enable the RESP3 potocol by default (#2746)
88f1f3ea is described below
commit 88f1f3ea1d7658ea4d6168f4f627ce40afe1aec7
Author: hulk <[email protected]>
AuthorDate: Wed Jan 29 15:11:27 2025 +0800
chore(config): enable the RESP3 potocol by default (#2746)
Co-authored-by: Twice <[email protected]>
---
kvrocks.conf | 5 +--
src/config/config.cc | 2 +-
tests/gocase/unit/config/config_test.go | 18 ++++-----
tests/gocase/unit/hello/hello_test.go | 2 +-
tests/gocase/unit/scripting/scripting_test.go | 2 +-
tests/gocase/unit/search/search_test.go | 4 +-
tests/gocase/unit/server/poll_updates_test.go | 57 ++++++++++++++-------------
7 files changed, 43 insertions(+), 47 deletions(-)
diff --git a/kvrocks.conf b/kvrocks.conf
index 461d077e..0d78d794 100644
--- a/kvrocks.conf
+++ b/kvrocks.conf
@@ -342,10 +342,9 @@ max-bitmap-to-string-mb 16
redis-cursor-compatible yes
# Whether to enable the RESP3 protocol.
-# NOTICE: RESP3 is still under development, don't enable it in production
environment.
#
-# Default: no
-# resp3-enabled no
+# Default: yes
+# resp3-enabled yes
# Maximum nesting depth allowed when parsing and serializing
# JSON documents while using JSON commands like JSON.SET.
diff --git a/src/config/config.cc b/src/config/config.cc
index 284f47e9..bc1518b3 100644
--- a/src/config/config.cc
+++ b/src/config/config.cc
@@ -230,7 +230,7 @@ Config::Config() {
{"log-retention-days", false, new IntField(&log_retention_days, -1, -1,
INT_MAX)},
{"persist-cluster-nodes-enabled", false, new
YesNoField(&persist_cluster_nodes_enabled, true)},
{"redis-cursor-compatible", false, new
YesNoField(&redis_cursor_compatible, true)},
- {"resp3-enabled", false, new YesNoField(&resp3_enabled, false)},
+ {"resp3-enabled", false, new YesNoField(&resp3_enabled, true)},
{"repl-namespace-enabled", false, new
YesNoField(&repl_namespace_enabled, false)},
{"proto-max-bulk-len", false,
new IntWithUnitField<uint64_t>(&proto_max_bulk_len, std::to_string(512
* MiB), 1 * MiB, UINT64_MAX)},
diff --git a/tests/gocase/unit/config/config_test.go
b/tests/gocase/unit/config/config_test.go
index 34f67c89..f599d905 100644
--- a/tests/gocase/unit/config/config_test.go
+++ b/tests/gocase/unit/config/config_test.go
@@ -37,6 +37,7 @@ import (
func TestRenameCommand(t *testing.T) {
srv := util.StartServer(t, map[string]string{
+ "resp3-enabled": "no",
"rename-command KEYS": "KEYSNEW",
"rename-command GET": "GETNEW",
"rename-command SET": "SETNEW",
@@ -71,10 +72,8 @@ func TestSetConfigBackupDir(t *testing.T) {
originBackupDir := filepath.Join(configs["dir"], "backup")
- r := rdb.Do(ctx, "CONFIG", "GET", "backup-dir")
- rList := r.Val().([]interface{})
- require.EqualValues(t, rList[0], "backup-dir")
- require.EqualValues(t, rList[1], originBackupDir)
+ r := rdb.ConfigGet(ctx, "backup-dir").Val()
+ require.EqualValues(t, r["backup-dir"], originBackupDir)
hasCompactionFiles := func(dir string) bool {
if _, err := os.Stat(dir); os.IsNotExist(err) {
@@ -98,14 +97,11 @@ func TestSetConfigBackupDir(t *testing.T) {
require.False(t, hasCompactionFiles(newBackupDir))
- require.NoError(t, rdb.Do(ctx, "CONFIG", "SET", "backup-dir",
newBackupDir).Err())
+ require.NoError(t, rdb.ConfigSet(ctx, "backup-dir", newBackupDir).Err())
+ r = rdb.ConfigGet(ctx, "backup-dir").Val()
+ require.EqualValues(t, r["backup-dir"], newBackupDir)
- r = rdb.Do(ctx, "CONFIG", "GET", "backup-dir")
- rList = r.Val().([]interface{})
- require.EqualValues(t, rList[0], "backup-dir")
- require.EqualValues(t, rList[1], newBackupDir)
-
- require.NoError(t, rdb.Do(ctx, "bgsave").Err())
+ require.NoError(t, rdb.BgSave(ctx).Err())
time.Sleep(2000 * time.Millisecond)
require.True(t, hasCompactionFiles(newBackupDir))
diff --git a/tests/gocase/unit/hello/hello_test.go
b/tests/gocase/unit/hello/hello_test.go
index 5b6eea35..c3ab9134 100644
--- a/tests/gocase/unit/hello/hello_test.go
+++ b/tests/gocase/unit/hello/hello_test.go
@@ -29,7 +29,7 @@ import (
)
func TestHello(t *testing.T) {
- srv := util.StartServer(t, map[string]string{})
+ srv := util.StartServer(t, map[string]string{"resp3-enabled": "no"})
defer srv.Close()
ctx := context.Background()
diff --git a/tests/gocase/unit/scripting/scripting_test.go
b/tests/gocase/unit/scripting/scripting_test.go
index c3753ecc..0c886dfd 100644
--- a/tests/gocase/unit/scripting/scripting_test.go
+++ b/tests/gocase/unit/scripting/scripting_test.go
@@ -33,7 +33,7 @@ import (
)
func TestScripting(t *testing.T) {
- srv := util.StartServer(t, map[string]string{})
+ srv := util.StartServer(t, map[string]string{"resp3-enabled": "no"})
defer srv.Close()
ctx := context.Background()
diff --git a/tests/gocase/unit/search/search_test.go
b/tests/gocase/unit/search/search_test.go
index e93b1dee..615aba51 100644
--- a/tests/gocase/unit/search/search_test.go
+++ b/tests/gocase/unit/search/search_test.go
@@ -64,9 +64,9 @@ func TestSearch(t *testing.T) {
require.Equal(t, "index_definition", idxInfo[2])
require.Equal(t, []interface{}{"key_type", "ReJSON-RL",
"prefixes", []interface{}{"test1:"}}, idxInfo[3])
require.Equal(t, "fields", idxInfo[4])
- require.Equal(t, []interface{}{"identifier", "a",
"type", "tag", "properties", []interface{}{"separator", ",", "case_sensitive",
int64(0)}}, idxInfo[5].([]interface{})[0])
+ require.Equal(t, []interface{}{"identifier", "a",
"type", "tag", "properties", []interface{}{"separator", ",", "case_sensitive",
false}}, idxInfo[5].([]interface{})[0])
require.Equal(t, []interface{}{"identifier", "b",
"type", "numeric", "properties", []interface{}{}},
idxInfo[5].([]interface{})[1])
- require.Equal(t, []interface{}{"identifier", "c",
"type", "vector", "properties", []interface{}{"algorithm", "HNSW",
"vector_type", "FLOAT64", "dim", int64(3), "distance_metric", "L2", "m",
int64(16), "ef_construction", int64(200), "ef_runtime", int64(10), "epsilon",
"0.01"}}, idxInfo[5].([]interface{})[2])
+ require.Equal(t, []interface{}{"identifier", "c",
"type", "vector", "properties", []interface{}{"algorithm", "HNSW",
"vector_type", "FLOAT64", "dim", int64(3), "distance_metric", "L2", "m",
int64(16), "ef_construction", int64(200), "ef_runtime", int64(10), "epsilon",
0.01}}, idxInfo[5].([]interface{})[2])
}
verify(t)
diff --git a/tests/gocase/unit/server/poll_updates_test.go
b/tests/gocase/unit/server/poll_updates_test.go
index 30ea01f6..e155bf00 100644
--- a/tests/gocase/unit/server/poll_updates_test.go
+++ b/tests/gocase/unit/server/poll_updates_test.go
@@ -72,21 +72,21 @@ func parseRESPCommands(t *testing.T, values []any) []any {
return updates
}
-func parsePollUpdatesResult(t *testing.T, slice []any, isRESP bool)
*PollUpdatesResult {
- itemCount := 6
- require.Len(t, slice, itemCount)
+func parsePollUpdatesResult(t *testing.T, m map[any]any, isRESP bool)
*PollUpdatesResult {
+ itemCount := 3
+ require.Len(t, m, itemCount)
var latestSeq, nextSeq int64
updates := make([]any, 0)
- for i := 0; i < itemCount; i += 2 {
- key := slice[i].(string)
+ for k, v := range m {
+ key := k.(string)
switch key {
case "latest_sequence":
- latestSeq = slice[i+1].(int64)
+ latestSeq = v.(int64)
case "next_sequence":
- nextSeq = slice[i+1].(int64)
+ nextSeq = v.(int64)
case "updates":
- fields := slice[i+1].([]interface{})
+ fields := v.([]interface{})
if isRESP {
updates = parseRESPCommands(t, fields)
} else {
@@ -127,17 +127,18 @@ func TestPollUpdates_Basic(t *testing.T) {
}
updates := make([]any, 0)
- slice, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 6).Slice()
+ result, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 6).Result()
require.NoError(t, err)
- pollUpdates := parsePollUpdatesResult(t, slice, false)
+ pollUpdates := parsePollUpdatesResult(t,
result.(map[interface{}]interface{}), false)
require.EqualValues(t, 10, pollUpdates.LatestSeq)
require.EqualValues(t, 6, pollUpdates.NextSeq)
require.Len(t, pollUpdates.Updates, 6)
updates = append(updates, pollUpdates.Updates...)
- slice, err = rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 6).Slice()
+ result, err = rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 6).Result()
require.NoError(t, err)
- pollUpdates = parsePollUpdatesResult(t, slice, false)
+
+ pollUpdates = parsePollUpdatesResult(t,
result.(map[interface{}]interface{}), false)
require.EqualValues(t, 10, pollUpdates.LatestSeq)
require.EqualValues(t, 10, pollUpdates.NextSeq)
require.Len(t, pollUpdates.Updates, 4)
@@ -179,10 +180,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
require.NoError(t, rdb0.Set(ctx, "k0", "v0", 0).Err())
require.NoError(t, rdb0.Set(ctx, "k1", "v1", 0).Err())
require.NoError(t, rdb0.Del(ctx, "k1").Err())
- slice, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 10,
"FORMAT", "RESP").Slice()
+ result, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 10,
"FORMAT", "RESP").Result()
require.NoError(t, err)
- pollUpdates = parsePollUpdatesResult(t, slice, true)
+ pollUpdates = parsePollUpdatesResult(t, result.(map[any]any),
true)
require.EqualValues(t, 3, pollUpdates.LatestSeq)
require.EqualValues(t, 3, pollUpdates.NextSeq)
require.Len(t, pollUpdates.Updates, 1)
@@ -199,10 +200,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
t.Run("Hash type", func(t *testing.T) {
require.NoError(t, rdb0.HSet(ctx, "h0", "f0", "v0", "f1",
"v1").Err())
require.NoError(t, rdb0.HDel(ctx, "h0", "f1").Err())
- slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Slice()
+ result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Result()
require.NoError(t, err)
- pollUpdates = parsePollUpdatesResult(t, slice, true)
+ pollUpdates = parsePollUpdatesResult(t, result.(map[any]any),
true)
require.Len(t, pollUpdates.Updates, 1)
require.EqualValues(t, []any{RESPFormat{
Namespace: "default",
@@ -217,10 +218,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
t.Run("List type", func(t *testing.T) {
require.NoError(t, rdb0.LPush(ctx, "l0", "v0", "v1").Err())
require.NoError(t, rdb0.LSet(ctx, "l0", 1, "v2").Err())
- slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Slice()
+ result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Result()
require.NoError(t, err)
- pollUpdates = parsePollUpdatesResult(t, slice, true)
+ pollUpdates = parsePollUpdatesResult(t, result.(map[any]any),
true)
require.Len(t, pollUpdates.Updates, 1)
require.EqualValues(t, []any{RESPFormat{
Namespace: "default",
@@ -235,10 +236,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
t.Run("Set type", func(t *testing.T) {
require.NoError(t, rdb0.SAdd(ctx, "s0", "v0", "v1").Err())
require.NoError(t, rdb0.SRem(ctx, "s0", "v1").Err())
- slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Slice()
+ result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Result()
require.NoError(t, err)
- pollUpdates = parsePollUpdatesResult(t, slice, true)
+ pollUpdates = parsePollUpdatesResult(t, result.(map[any]any),
true)
require.Len(t, pollUpdates.Updates, 1)
require.EqualValues(t, []any{RESPFormat{
Namespace: "default",
@@ -254,10 +255,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
require.NoError(t, rdb0.ZAdd(ctx, "z0", redis.Z{Member: "v0",
Score: 1.2}).Err())
require.NoError(t, rdb0.ZAdd(ctx, "z0", redis.Z{Member: "v1",
Score: 1.2}).Err())
require.NoError(t, rdb0.ZRem(ctx, "z0", "v1").Err())
- slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Slice()
+ result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Result()
require.NoError(t, err)
- pollUpdates = parsePollUpdatesResult(t, slice, true)
+ pollUpdates = parsePollUpdatesResult(t, result.(map[any]any),
true)
require.Len(t, pollUpdates.Updates, 1)
require.EqualValues(t, []any{RESPFormat{
Namespace: "default",
@@ -276,10 +277,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
}).Result()
require.NoError(t, err)
require.NoError(t, rdb0.XDel(ctx, "stream", id).Err())
- slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Slice()
+ result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Result()
require.NoError(t, err)
- pollUpdates = parsePollUpdatesResult(t, slice, true)
+ pollUpdates = parsePollUpdatesResult(t, result.(map[any]any),
true)
require.Len(t, pollUpdates.Updates, 1)
require.EqualValues(t, []any{RESPFormat{
Commands: [][]string{
@@ -292,10 +293,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
t.Run("JSON type", func(t *testing.T) {
require.NoError(t, rdb0.JSONSet(ctx, "json", "$", `{"field":
"value"}`).Err())
require.NoError(t, rdb0.JSONDel(ctx, "json", "$.field").Err())
- slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Slice()
+ result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq,
"MAX", 10, "FORMAT", "RESP").Result()
require.NoError(t, err)
- pollUpdates = parsePollUpdatesResult(t, slice, true)
+ pollUpdates = parsePollUpdatesResult(t, result.(map[any]any),
true)
require.Len(t, pollUpdates.Updates, 1)
require.EqualValues(t, []any{RESPFormat{
Namespace: "default",
@@ -332,9 +333,9 @@ func TestPollUpdates_WithStrict(t *testing.T) {
// Works well if the sequence number is mismatched but not in strict
mode
require.NoError(t, rdb0.Do(ctx, "POLLUPDATES", 1, "MAX", 1).Err())
- slice, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 10,
"STRICT").Slice()
+ result, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 10,
"STRICT").Result()
require.NoError(t, err)
- pollUpdates := parsePollUpdatesResult(t, slice, false)
+ pollUpdates := parsePollUpdatesResult(t, result.(map[any]any), false)
require.EqualValues(t, 3, pollUpdates.LatestSeq)
require.EqualValues(t, 3, pollUpdates.NextSeq)
require.Len(t, pollUpdates.Updates, 2)