Skip to content

Commit 88f1f3e

Browse files
chore(config): enable the RESP3 potocol by default (#2746)
Co-authored-by: Twice <[email protected]>
1 parent 06fa457 commit 88f1f3e

File tree

7 files changed

+43
-47
lines changed

7 files changed

+43
-47
lines changed

kvrocks.conf

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,9 @@ max-bitmap-to-string-mb 16
342342
redis-cursor-compatible yes
343343

344344
# Whether to enable the RESP3 protocol.
345-
# NOTICE: RESP3 is still under development, don't enable it in production environment.
346345
#
347-
# Default: no
348-
# resp3-enabled no
346+
# Default: yes
347+
# resp3-enabled yes
349348

350349
# Maximum nesting depth allowed when parsing and serializing
351350
# JSON documents while using JSON commands like JSON.SET.

src/config/config.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ Config::Config() {
230230
{"log-retention-days", false, new IntField(&log_retention_days, -1, -1, INT_MAX)},
231231
{"persist-cluster-nodes-enabled", false, new YesNoField(&persist_cluster_nodes_enabled, true)},
232232
{"redis-cursor-compatible", false, new YesNoField(&redis_cursor_compatible, true)},
233-
{"resp3-enabled", false, new YesNoField(&resp3_enabled, false)},
233+
{"resp3-enabled", false, new YesNoField(&resp3_enabled, true)},
234234
{"repl-namespace-enabled", false, new YesNoField(&repl_namespace_enabled, false)},
235235
{"proto-max-bulk-len", false,
236236
new IntWithUnitField<uint64_t>(&proto_max_bulk_len, std::to_string(512 * MiB), 1 * MiB, UINT64_MAX)},

tests/gocase/unit/config/config_test.go

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import (
3737

3838
func TestRenameCommand(t *testing.T) {
3939
srv := util.StartServer(t, map[string]string{
40+
"resp3-enabled": "no",
4041
"rename-command KEYS": "KEYSNEW",
4142
"rename-command GET": "GETNEW",
4243
"rename-command SET": "SETNEW",
@@ -71,10 +72,8 @@ func TestSetConfigBackupDir(t *testing.T) {
7172

7273
originBackupDir := filepath.Join(configs["dir"], "backup")
7374

74-
r := rdb.Do(ctx, "CONFIG", "GET", "backup-dir")
75-
rList := r.Val().([]interface{})
76-
require.EqualValues(t, rList[0], "backup-dir")
77-
require.EqualValues(t, rList[1], originBackupDir)
75+
r := rdb.ConfigGet(ctx, "backup-dir").Val()
76+
require.EqualValues(t, r["backup-dir"], originBackupDir)
7877

7978
hasCompactionFiles := func(dir string) bool {
8079
if _, err := os.Stat(dir); os.IsNotExist(err) {
@@ -98,14 +97,11 @@ func TestSetConfigBackupDir(t *testing.T) {
9897

9998
require.False(t, hasCompactionFiles(newBackupDir))
10099

101-
require.NoError(t, rdb.Do(ctx, "CONFIG", "SET", "backup-dir", newBackupDir).Err())
100+
require.NoError(t, rdb.ConfigSet(ctx, "backup-dir", newBackupDir).Err())
101+
r = rdb.ConfigGet(ctx, "backup-dir").Val()
102+
require.EqualValues(t, r["backup-dir"], newBackupDir)
102103

103-
r = rdb.Do(ctx, "CONFIG", "GET", "backup-dir")
104-
rList = r.Val().([]interface{})
105-
require.EqualValues(t, rList[0], "backup-dir")
106-
require.EqualValues(t, rList[1], newBackupDir)
107-
108-
require.NoError(t, rdb.Do(ctx, "bgsave").Err())
104+
require.NoError(t, rdb.BgSave(ctx).Err())
109105
time.Sleep(2000 * time.Millisecond)
110106

111107
require.True(t, hasCompactionFiles(newBackupDir))

tests/gocase/unit/hello/hello_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
)
3030

3131
func TestHello(t *testing.T) {
32-
srv := util.StartServer(t, map[string]string{})
32+
srv := util.StartServer(t, map[string]string{"resp3-enabled": "no"})
3333
defer srv.Close()
3434

3535
ctx := context.Background()

tests/gocase/unit/scripting/scripting_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import (
3333
)
3434

3535
func TestScripting(t *testing.T) {
36-
srv := util.StartServer(t, map[string]string{})
36+
srv := util.StartServer(t, map[string]string{"resp3-enabled": "no"})
3737
defer srv.Close()
3838

3939
ctx := context.Background()

tests/gocase/unit/search/search_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ func TestSearch(t *testing.T) {
6464
require.Equal(t, "index_definition", idxInfo[2])
6565
require.Equal(t, []interface{}{"key_type", "ReJSON-RL", "prefixes", []interface{}{"test1:"}}, idxInfo[3])
6666
require.Equal(t, "fields", idxInfo[4])
67-
require.Equal(t, []interface{}{"identifier", "a", "type", "tag", "properties", []interface{}{"separator", ",", "case_sensitive", int64(0)}}, idxInfo[5].([]interface{})[0])
67+
require.Equal(t, []interface{}{"identifier", "a", "type", "tag", "properties", []interface{}{"separator", ",", "case_sensitive", false}}, idxInfo[5].([]interface{})[0])
6868
require.Equal(t, []interface{}{"identifier", "b", "type", "numeric", "properties", []interface{}{}}, idxInfo[5].([]interface{})[1])
69-
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])
69+
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])
7070
}
7171
verify(t)
7272

tests/gocase/unit/server/poll_updates_test.go

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -72,21 +72,21 @@ func parseRESPCommands(t *testing.T, values []any) []any {
7272
return updates
7373
}
7474

75-
func parsePollUpdatesResult(t *testing.T, slice []any, isRESP bool) *PollUpdatesResult {
76-
itemCount := 6
77-
require.Len(t, slice, itemCount)
75+
func parsePollUpdatesResult(t *testing.T, m map[any]any, isRESP bool) *PollUpdatesResult {
76+
itemCount := 3
77+
require.Len(t, m, itemCount)
7878
var latestSeq, nextSeq int64
7979

8080
updates := make([]any, 0)
81-
for i := 0; i < itemCount; i += 2 {
82-
key := slice[i].(string)
81+
for k, v := range m {
82+
key := k.(string)
8383
switch key {
8484
case "latest_sequence":
85-
latestSeq = slice[i+1].(int64)
85+
latestSeq = v.(int64)
8686
case "next_sequence":
87-
nextSeq = slice[i+1].(int64)
87+
nextSeq = v.(int64)
8888
case "updates":
89-
fields := slice[i+1].([]interface{})
89+
fields := v.([]interface{})
9090
if isRESP {
9191
updates = parseRESPCommands(t, fields)
9292
} else {
@@ -127,17 +127,18 @@ func TestPollUpdates_Basic(t *testing.T) {
127127
}
128128

129129
updates := make([]any, 0)
130-
slice, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 6).Slice()
130+
result, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 6).Result()
131131
require.NoError(t, err)
132-
pollUpdates := parsePollUpdatesResult(t, slice, false)
132+
pollUpdates := parsePollUpdatesResult(t, result.(map[interface{}]interface{}), false)
133133
require.EqualValues(t, 10, pollUpdates.LatestSeq)
134134
require.EqualValues(t, 6, pollUpdates.NextSeq)
135135
require.Len(t, pollUpdates.Updates, 6)
136136
updates = append(updates, pollUpdates.Updates...)
137137

138-
slice, err = rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 6).Slice()
138+
result, err = rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 6).Result()
139139
require.NoError(t, err)
140-
pollUpdates = parsePollUpdatesResult(t, slice, false)
140+
141+
pollUpdates = parsePollUpdatesResult(t, result.(map[interface{}]interface{}), false)
141142
require.EqualValues(t, 10, pollUpdates.LatestSeq)
142143
require.EqualValues(t, 10, pollUpdates.NextSeq)
143144
require.Len(t, pollUpdates.Updates, 4)
@@ -179,10 +180,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
179180
require.NoError(t, rdb0.Set(ctx, "k0", "v0", 0).Err())
180181
require.NoError(t, rdb0.Set(ctx, "k1", "v1", 0).Err())
181182
require.NoError(t, rdb0.Del(ctx, "k1").Err())
182-
slice, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 10, "FORMAT", "RESP").Slice()
183+
result, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 10, "FORMAT", "RESP").Result()
183184
require.NoError(t, err)
184185

185-
pollUpdates = parsePollUpdatesResult(t, slice, true)
186+
pollUpdates = parsePollUpdatesResult(t, result.(map[any]any), true)
186187
require.EqualValues(t, 3, pollUpdates.LatestSeq)
187188
require.EqualValues(t, 3, pollUpdates.NextSeq)
188189
require.Len(t, pollUpdates.Updates, 1)
@@ -199,10 +200,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
199200
t.Run("Hash type", func(t *testing.T) {
200201
require.NoError(t, rdb0.HSet(ctx, "h0", "f0", "v0", "f1", "v1").Err())
201202
require.NoError(t, rdb0.HDel(ctx, "h0", "f1").Err())
202-
slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Slice()
203+
result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Result()
203204
require.NoError(t, err)
204205

205-
pollUpdates = parsePollUpdatesResult(t, slice, true)
206+
pollUpdates = parsePollUpdatesResult(t, result.(map[any]any), true)
206207
require.Len(t, pollUpdates.Updates, 1)
207208
require.EqualValues(t, []any{RESPFormat{
208209
Namespace: "default",
@@ -217,10 +218,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
217218
t.Run("List type", func(t *testing.T) {
218219
require.NoError(t, rdb0.LPush(ctx, "l0", "v0", "v1").Err())
219220
require.NoError(t, rdb0.LSet(ctx, "l0", 1, "v2").Err())
220-
slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Slice()
221+
result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Result()
221222
require.NoError(t, err)
222223

223-
pollUpdates = parsePollUpdatesResult(t, slice, true)
224+
pollUpdates = parsePollUpdatesResult(t, result.(map[any]any), true)
224225
require.Len(t, pollUpdates.Updates, 1)
225226
require.EqualValues(t, []any{RESPFormat{
226227
Namespace: "default",
@@ -235,10 +236,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
235236
t.Run("Set type", func(t *testing.T) {
236237
require.NoError(t, rdb0.SAdd(ctx, "s0", "v0", "v1").Err())
237238
require.NoError(t, rdb0.SRem(ctx, "s0", "v1").Err())
238-
slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Slice()
239+
result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Result()
239240
require.NoError(t, err)
240241

241-
pollUpdates = parsePollUpdatesResult(t, slice, true)
242+
pollUpdates = parsePollUpdatesResult(t, result.(map[any]any), true)
242243
require.Len(t, pollUpdates.Updates, 1)
243244
require.EqualValues(t, []any{RESPFormat{
244245
Namespace: "default",
@@ -254,10 +255,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
254255
require.NoError(t, rdb0.ZAdd(ctx, "z0", redis.Z{Member: "v0", Score: 1.2}).Err())
255256
require.NoError(t, rdb0.ZAdd(ctx, "z0", redis.Z{Member: "v1", Score: 1.2}).Err())
256257
require.NoError(t, rdb0.ZRem(ctx, "z0", "v1").Err())
257-
slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Slice()
258+
result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Result()
258259
require.NoError(t, err)
259260

260-
pollUpdates = parsePollUpdatesResult(t, slice, true)
261+
pollUpdates = parsePollUpdatesResult(t, result.(map[any]any), true)
261262
require.Len(t, pollUpdates.Updates, 1)
262263
require.EqualValues(t, []any{RESPFormat{
263264
Namespace: "default",
@@ -276,10 +277,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
276277
}).Result()
277278
require.NoError(t, err)
278279
require.NoError(t, rdb0.XDel(ctx, "stream", id).Err())
279-
slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Slice()
280+
result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Result()
280281
require.NoError(t, err)
281282

282-
pollUpdates = parsePollUpdatesResult(t, slice, true)
283+
pollUpdates = parsePollUpdatesResult(t, result.(map[any]any), true)
283284
require.Len(t, pollUpdates.Updates, 1)
284285
require.EqualValues(t, []any{RESPFormat{
285286
Commands: [][]string{
@@ -292,10 +293,10 @@ func TestPollUpdates_WithRESPFormat(t *testing.T) {
292293
t.Run("JSON type", func(t *testing.T) {
293294
require.NoError(t, rdb0.JSONSet(ctx, "json", "$", `{"field": "value"}`).Err())
294295
require.NoError(t, rdb0.JSONDel(ctx, "json", "$.field").Err())
295-
slice, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Slice()
296+
result, err := rdb0.Do(ctx, "POLLUPDATES", pollUpdates.NextSeq, "MAX", 10, "FORMAT", "RESP").Result()
296297
require.NoError(t, err)
297298

298-
pollUpdates = parsePollUpdatesResult(t, slice, true)
299+
pollUpdates = parsePollUpdatesResult(t, result.(map[any]any), true)
299300
require.Len(t, pollUpdates.Updates, 1)
300301
require.EqualValues(t, []any{RESPFormat{
301302
Namespace: "default",
@@ -332,9 +333,9 @@ func TestPollUpdates_WithStrict(t *testing.T) {
332333
// Works well if the sequence number is mismatched but not in strict mode
333334
require.NoError(t, rdb0.Do(ctx, "POLLUPDATES", 1, "MAX", 1).Err())
334335

335-
slice, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 10, "STRICT").Slice()
336+
result, err := rdb0.Do(ctx, "POLLUPDATES", 0, "MAX", 10, "STRICT").Result()
336337
require.NoError(t, err)
337-
pollUpdates := parsePollUpdatesResult(t, slice, false)
338+
pollUpdates := parsePollUpdatesResult(t, result.(map[any]any), false)
338339
require.EqualValues(t, 3, pollUpdates.LatestSeq)
339340
require.EqualValues(t, 3, pollUpdates.NextSeq)
340341
require.Len(t, pollUpdates.Updates, 2)

0 commit comments

Comments
 (0)