This is an automated email from the ASF dual-hosted git repository. hulk pushed a commit to branch 2.12 in repository https://gitbox.apache.org/repos/asf/kvrocks.git
commit 44f702d2093327297f88bbc74578372521488b13 Author: git-hulk <[email protected]> AuthorDate: Thu Apr 17 20:41:30 2025 +0800 Comment out the tdigest and its test cases due to it's not production ready --- src/commands/cmd_tdigest.cc | 12 +- tests/gocase/unit/type/tdigest/tdigest_test.go | 313 ------------------------- 2 files changed, 6 insertions(+), 319 deletions(-) diff --git a/src/commands/cmd_tdigest.cc b/src/commands/cmd_tdigest.cc index 166a22afb..a0f6bab4a 100644 --- a/src/commands/cmd_tdigest.cc +++ b/src/commands/cmd_tdigest.cc @@ -243,10 +243,10 @@ class CommandTDigestMax : public CommandTDigestMinMax { CommandTDigestMax() : CommandTDigestMinMax(false) {} }; -REDIS_REGISTER_COMMANDS(TDigest, MakeCmdAttr<CommandTDigestCreate>("tdigest.create", -2, "write", 1, 1, 1), - MakeCmdAttr<CommandTDigestInfo>("tdigest.info", 2, "read-only", 1, 1, 1), - MakeCmdAttr<CommandTDigestAdd>("tdigest.add", -3, "write", 1, 1, 1), - MakeCmdAttr<CommandTDigestMax>("tdigest.max", 2, "read-only", 1, 1, 1), - MakeCmdAttr<CommandTDigestMin>("tdigest.min", 2, "read-only", 1, 1, 1), - MakeCmdAttr<CommandTDigestReset>("tdigest.reset", 2, "write", 1, 1, 1)); +// REDIS_REGISTER_COMMANDS(TDigest, MakeCmdAttr<CommandTDigestCreate>("tdigest.create", -2, "write", 1, 1, 1), +// MakeCmdAttr<CommandTDigestInfo>("tdigest.info", 2, "read-only", 1, 1, 1), +// MakeCmdAttr<CommandTDigestAdd>("tdigest.add", -3, "write", 1, 1, 1), +// MakeCmdAttr<CommandTDigestMax>("tdigest.max", 2, "read-only", 1, 1, 1), +// MakeCmdAttr<CommandTDigestMin>("tdigest.min", 2, "read-only", 1, 1, 1), +// MakeCmdAttr<CommandTDigestReset>("tdigest.reset", 2, "write", 1, 1, 1)); } // namespace redis diff --git a/tests/gocase/unit/type/tdigest/tdigest_test.go b/tests/gocase/unit/type/tdigest/tdigest_test.go deleted file mode 100644 index d3f118004..000000000 --- a/tests/gocase/unit/type/tdigest/tdigest_test.go +++ /dev/null @@ -1,313 +0,0 @@ -//go:build !ignore_when_tsan - -/* -* Licensed to the Apache Software Foundation (ASF) under one -* or more contributor license agreements. See the NOTICE file -* distributed with this work for additional information -* regarding copyright ownership. The ASF licenses this file -* to you under the Apache License, Version 2.0 (the -* "License"); you may not use this file except in compliance -* with the License. You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, -* software distributed under the License is distributed on an -* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -* KIND, either express or implied. See the License for the -* specific language governing permissions and limitations -* under the License. - */ - -package tdigest - -import ( - "context" - "testing" - - "github.com/apache/kvrocks/tests/gocase/util" - "github.com/stretchr/testify/require" -) - -const ( - errMsgWrongNumberArg = "wrong number of arguments" - errMsgParseCompression = "error parsing compression parameter" - errMsgNeedToBePositive = "compression parameter needs to be a positive integer" - errMsgMustInRange = "compression must be between 1 and 1000" - errMsgKeyAlreadyExists = "key already exists" - errMsgKeyNotExist = "key does not exist" -) - -type tdigestInfo struct { - Compression int64 - Capacity int64 - MergedNodes int64 - UnmergedNodes int64 - MergedWeight int64 - UnmergedWeight int64 - Observations int64 - TotalCompressions int64 - // memory usgae is not useful, we do not support it now -} - -func toTdigestInfo(t *testing.T, value interface{}) tdigestInfo { - require.IsType(t, map[interface{}]interface{}{}, value) - v := value.(map[interface{}]interface{}) - return tdigestInfo{ - Compression: v["Compression"].(int64), - Capacity: v["Capacity"].(int64), - MergedNodes: v["Merged nodes"].(int64), - UnmergedNodes: v["Unmerged nodes"].(int64), - MergedWeight: v["Merged weight"].(int64), - UnmergedWeight: v["Unmerged weight"].(int64), - Observations: v["Observations"].(int64), - TotalCompressions: v["Total compressions"].(int64), - } -} - -func TestTDigest(t *testing.T) { - configOptions := []util.ConfigOptions{ - { - Name: "txn-context-enabled", - Options: []string{"yes", "no"}, - ConfigType: util.YesNo, - }, - } - - configsMatrix, err := util.GenerateConfigsMatrix(configOptions) - require.NoError(t, err) - - for _, configs := range configsMatrix { - tdigestTests(t, configs) - } -} - -func tdigestTests(t *testing.T, configs util.KvrocksServerConfigs) { - srv := util.StartServer(t, configs) - defer srv.Close() - ctx := context.Background() - rdb := srv.NewClient() - defer func() { require.NoError(t, rdb.Close()) }() - - t.Run("tdigest.create with different arguments", func(t *testing.T) { - keyPrefix := "tdigest_create_" - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.CREATE").Err(), errMsgWrongNumberArg) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key", "hahah").Err(), errMsgWrongNumberArg) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key", "1", "hahah").Err(), errMsgWrongNumberArg) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key", "compression").Err(), errMsgWrongNumberArg) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key", "compression", "hahah").Err(), errMsgParseCompression) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key", "compression", "0").Err(), errMsgNeedToBePositive) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key", "compression", "-1").Err(), errMsgNeedToBePositive) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key", "compression", "0.1").Err(), errMsgParseCompression) - - require.NoError(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key0", "compression", "1").Err()) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key0", "compression", "1").Err(), errMsgKeyAlreadyExists) - require.NoError(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key1", "compression", "1000").Err()) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key", "compression", "1001").Err(), errMsgMustInRange) - }) - - t.Run("tdigest.info with different arguments", func(t *testing.T) { - keyPrefix := "tdigest_info_" - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.INFO").Err(), errMsgWrongNumberArg) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.INFO", keyPrefix+"key", "hahah").Err(), errMsgWrongNumberArg) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.INFO", keyPrefix+"key").Err(), errMsgKeyNotExist) - require.NoError(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key0", "compression", "1").Err()) - { - rsp := rdb.Do(ctx, "TDIGEST.INFO", keyPrefix+"key0") - require.NoError(t, rsp.Err()) - info := toTdigestInfo(t, rsp.Val()) - require.EqualValues(t, 1, info.Compression) - require.EqualValues(t, 1*6+10, info.Capacity) - require.EqualValues(t, 0, info.MergedNodes) - require.EqualValues(t, 0, info.UnmergedNodes) - require.EqualValues(t, 0, info.MergedWeight) - require.EqualValues(t, 0, info.UnmergedWeight) - require.EqualValues(t, 0, info.Observations) - require.EqualValues(t, 0, info.TotalCompressions) - } - - { - require.NoError(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"key1", "compression", "1000").Err()) - rsp := rdb.Do(ctx, "TDIGEST.INFO", keyPrefix+"key1") - require.NoError(t, rsp.Err()) - info := toTdigestInfo(t, rsp.Val()) - require.EqualValues(t, 1000, info.Compression) - require.EqualValues(t, 1024, info.Capacity) // max is 1024 - require.EqualValues(t, 0, info.MergedNodes) - require.EqualValues(t, 0, info.UnmergedNodes) - require.EqualValues(t, 0, info.MergedWeight) - require.EqualValues(t, 0, info.UnmergedWeight) - require.EqualValues(t, 0, info.Observations) - require.EqualValues(t, 0, info.TotalCompressions) - } - }) - - t.Run("tdigest.add with different arguments", func(t *testing.T) { - keyPrefix := "tdigest_add_" - - // Satisfy the number of parameters - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.ADD").Err(), errMsgWrongNumberArg) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.ADD", keyPrefix+"key").Err(), errMsgWrongNumberArg) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.ADD", keyPrefix+"key", "abc").Err(), "not a valid float") - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.ADD", keyPrefix+"nonexistent", "1.0").Err(), errMsgKeyNotExist) - - // Test adding values to a key - key := keyPrefix + "test1" - require.NoError(t, rdb.Do(ctx, "TDIGEST.CREATE", key, "compression", "100").Err()) - require.NoError(t, rdb.Do(ctx, "TDIGEST.ADD", key, "42.0").Err()) - - rsp := rdb.Do(ctx, "TDIGEST.INFO", key) - require.NoError(t, rsp.Err()) - info := toTdigestInfo(t, rsp.Val()) - require.EqualValues(t, 1, info.UnmergedNodes) - require.EqualValues(t, 1, info.Observations) - - require.NoError(t, rdb.Do(ctx, "TDIGEST.ADD", key, "1.0", "2.0", "3.0", "4.0", "5.0").Err()) - - rsp = rdb.Do(ctx, "TDIGEST.INFO", key) - require.NoError(t, rsp.Err()) - info = toTdigestInfo(t, rsp.Val()) - require.EqualValues(t, 6, info.Observations) - - // Test adding values to a key with compression - key2 := keyPrefix + "test2" - require.NoError(t, rdb.Do(ctx, "TDIGEST.CREATE", key2, "compression", "100").Err()) - - args := []interface{}{key2} - for i := 1; i <= 1000; i++ { - args = append(args, float64(i)) - } - require.NoError(t, rdb.Do(ctx, append([]interface{}{"TDIGEST.ADD"}, args...)...).Err()) - - rsp = rdb.Do(ctx, "TDIGEST.INFO", key2) - require.NoError(t, rsp.Err()) - info = toTdigestInfo(t, rsp.Val()) - require.EqualValues(t, 1000, info.Observations) - - // Test adding values to a key with compression and merge node - key3 := keyPrefix + "test3" - require.NoError(t, rdb.Do(ctx, "TDIGEST.CREATE", key3, "compression", "10").Err()) - - args = []interface{}{key3} - for i := 1; i <= 100; i++ { - args = append(args, float64(i%10)) - } - require.NoError(t, rdb.Do(ctx, append([]interface{}{"TDIGEST.ADD"}, args...)...).Err()) - - rsp = rdb.Do(ctx, "TDIGEST.INFO", key3) - require.NoError(t, rsp.Err()) - info = toTdigestInfo(t, rsp.Val()) - - require.Greater(t, info.MergedNodes, int64(0)) - require.Greater(t, info.MergedWeight, int64(0)) - require.EqualValues(t, 100, info.Observations) - require.Greater(t, info.TotalCompressions, int64(0)) - }) - - t.Run("tdigest.max with different arguments", func(t *testing.T) { - keyPrefix := "tdigest_max_" - - // Test invalid arguments - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.MAX").Err(), errMsgWrongNumberArg) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.MAX", keyPrefix+"nonexistent").Err(), errMsgKeyNotExist) - - // Test with empty tdigest - key := keyPrefix + "test1" - require.NoError(t, rdb.Do(ctx, "TDIGEST.CREATE", key, "compression", "100").Err()) - rsp := rdb.Do(ctx, "TDIGEST.MAX", key) - require.NoError(t, rsp.Err()) - require.EqualValues(t, rsp.Val(), "nan") - - // Test with single value - require.NoError(t, rdb.Do(ctx, "TDIGEST.ADD", key, "42.5").Err()) - rsp = rdb.Do(ctx, "TDIGEST.MAX", key) - require.NoError(t, rsp.Err()) - require.Equal(t, "42.5", rsp.Val()) - - // Test with multiple values - require.NoError(t, rdb.Do(ctx, "TDIGEST.ADD", key, "1.0", "100.5", "50.5", "-10.5").Err()) - rsp = rdb.Do(ctx, "TDIGEST.MAX", key) - require.NoError(t, rsp.Err()) - require.Equal(t, "100.5", rsp.Val()) - }) - - t.Run("tdigest.min with different arguments", func(t *testing.T) { - keyPrefix := "tdigest_min_" - - // Test invalid arguments - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.MIN").Err(), errMsgWrongNumberArg) - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.MIN", keyPrefix+"nonexistent").Err(), errMsgKeyNotExist) - - // Test with empty tdigest - key := keyPrefix + "test1" - require.NoError(t, rdb.Do(ctx, "TDIGEST.CREATE", key, "compression", "100").Err()) - rsp := rdb.Do(ctx, "TDIGEST.MIN", key) - require.NoError(t, rsp.Err()) - require.EqualValues(t, rsp.Val(), "nan") - - // Test with single value - require.NoError(t, rdb.Do(ctx, "TDIGEST.ADD", key, "42.5").Err()) - rsp = rdb.Do(ctx, "TDIGEST.MIN", key) - require.NoError(t, rsp.Err()) - require.Equal(t, "42.5", rsp.Val()) - - // Test with multiple values - require.NoError(t, rdb.Do(ctx, "TDIGEST.ADD", key, "1.0", "100.5", "50.5", "-10.5").Err()) - rsp = rdb.Do(ctx, "TDIGEST.MIN", key) - require.NoError(t, rsp.Err()) - require.Equal(t, "-10.5", rsp.Val()) - }) - t.Run("tdigest.reset with different arguments", func(t *testing.T) { - keyPrefix := "tdigest_reset_" - - // Testing with no arguments to .RESET - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.RESET").Err(), errMsgWrongNumberArg) - - require.NoError(t, rdb.Do(ctx, "TDIGEST.CREATE", keyPrefix+"mydigest", "compression", "101").Err()) - - key := keyPrefix + "mydigest" - // Adding some data to digest - require.NoError(t, rdb.Do(ctx, "TDIGEST.ADD", key, "-84.3", "199.3", "343.34", "12.34").Err()) - - // Checking MIN value to ensure data was added - rsp := rdb.Do(ctx, "TDIGEST.MIN", key) - require.NoError(t, rsp.Err()) - require.EqualValues(t, rsp.Val(), "-84.3") - - // Reset on a non-existent key - require.ErrorContains(t, rdb.Do(ctx, "TDIGEST.RESET", keyPrefix+"notexist").Err(), errMsgKeyNotExist) - - // Get TDIGEST.INFO before reset - rsp = rdb.Do(ctx, "TDIGEST.INFO", key) - require.NoError(t, rsp.Err()) - infoBeforeReset := toTdigestInfo(t, rsp.Val()) - - // Perform the reset - require.NoError(t, rdb.Do(ctx, "TDIGEST.RESET", key).Err()) - - // Get TDIGEST.INFO after reset - rsp = rdb.Do(ctx, "TDIGEST.INFO", key) - require.NoError(t, rsp.Err()) - infoAfterReset := toTdigestInfo(t, rsp.Val()) - - // Ensure capacity remains unchanged - require.EqualValues(t, infoBeforeReset.Capacity, infoAfterReset.Capacity) - require.EqualValues(t, 101, infoAfterReset.Compression) - require.EqualValues(t, 0, infoAfterReset.MergedNodes) - require.EqualValues(t, 0, infoAfterReset.UnmergedNodes) - require.EqualValues(t, 0, infoAfterReset.Observations) - require.EqualValues(t, 0, infoAfterReset.TotalCompressions) - - // Reset on an empty digest - emptyDigestKey := keyPrefix + "empty" - require.NoError(t, rdb.Do(ctx, "TDIGEST.CREATE", emptyDigestKey, "COMPRESSION", "100").Err()) - rsp = rdb.Do(ctx, "TDIGEST.RESET", emptyDigestKey) - require.NoError(t, rsp.Err()) - - // Ensure empty digest's capacity remains the same - rsp = rdb.Do(ctx, "TDIGEST.INFO", emptyDigestKey) - require.NoError(t, rsp.Err()) - infoAfterEmptyReset := toTdigestInfo(t, rsp.Val()) - require.EqualValues(t, 100, infoAfterEmptyReset.Compression) - }) -}
