You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kvrocks.apache.org by hu...@apache.org on 2025/08/30 08:14:59 UTC

(kvrocks) branch unstable updated: fix(test): flaky test case in KMETADTA command (#3150)

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 cddbccd6b fix(test): flaky test case in KMETADTA command (#3150)
cddbccd6b is described below

commit cddbccd6b118f8287dbfa57ed317e36251f4a330
Author: hulk <hu...@gmail.com>
AuthorDate: Sat Aug 30 16:14:54 2025 +0800

    fix(test): flaky test case in KMETADTA command (#3150)
    
    The root cause is generating random strings in a short time
    and using them to create fields for Hash/Set/ZSet.
    
    To fix this issue, just avoid using random strings if unnecessary
    which will also make the code more concise.
    
    
    ```
    --- FAIL: TestKMetadata (1.04s)
        --- FAIL: TestKMetadata/Test_KMetadata_for_set_type (0.00s)
            kmetadata_test.go:170:
                    Error Trace:    /__w/kvrocks/kvrocks/tests/gocase/unit/kmetadata/kmetadata_test.go:170
                    Error:          Not equal:
                                    expected: 4
                                    actual  : 3
                    Test:           TestKMetadata/Test_KMetadata_for_set_type
    FAIL
    ```
---
 .github/workflows/kvrocks.yaml                |   2 +-
 tests/gocase/unit/kmetadata/kmetadata_test.go | 148 ++++++++++----------------
 2 files changed, 55 insertions(+), 95 deletions(-)

diff --git a/.github/workflows/kvrocks.yaml b/.github/workflows/kvrocks.yaml
index 5b83f4308..5e7cd6e91 100644
--- a/.github/workflows/kvrocks.yaml
+++ b/.github/workflows/kvrocks.yaml
@@ -522,7 +522,7 @@ jobs:
       - name: Setup openSUSE
         if: ${{ startsWith(matrix.image, 'opensuse') }}
         run: |
-          zypper install -y gcc11 gcc11-c++ make wget git autoconf automake python3 python3-pip curl tar gzip cmake go
+          zypper install -y gcc11 gcc11-c++ make wget git autoconf automake python3 python3-pip curl tar gzip cmake go which
           update-alternatives --install /usr/bin/cc cc /usr/bin/gcc-11 100
           update-alternatives --install /usr/bin/c++ c++ /usr/bin/g++-11 100
           update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100
diff --git a/tests/gocase/unit/kmetadata/kmetadata_test.go b/tests/gocase/unit/kmetadata/kmetadata_test.go
index adfabc132..87e5bdfdf 100644
--- a/tests/gocase/unit/kmetadata/kmetadata_test.go
+++ b/tests/gocase/unit/kmetadata/kmetadata_test.go
@@ -25,7 +25,6 @@ import (
 	"testing"
 
 	"github.com/redis/go-redis/v9"
-	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
 	"github.com/apache/kvrocks/tests/gocase/util"
@@ -111,138 +110,99 @@ var testKMetadata = func(t *testing.T, configs util.KvrocksServerConfigs) {
 	defer func() { require.NoError(t, rdb.Close()) }()
 
 	t.Run("Test KMetadata for String type", func(t *testing.T) {
-		key := "__avoid_collisions__" + "_KMetadataString_" + util.RandString(1, 10, util.Alpha)
-		val := "__avoid_collisions__" + "_KMetadataString_" + util.RandString(1, 10, util.Alpha)
-		rdb.Set(ctx, key, val, 0)
+		key := "string_" + util.RandString(1, 10, util.Alpha)
+		val := util.RandString(1, 10, util.Alpha)
+		require.NoError(t, rdb.Set(ctx, key, val, 0).Err())
+		// Test KMetadata for string type
 		r := rdb.Do(ctx, "kmetadata", key)
 		result, err := r.Result()
-		if err != nil {
-			t.Fatalf("Command failed: %v", err)
-		}
+		require.NoError(t, err)
+
 		metaResponse, err := ExtractKMetadataResponse(result)
-		if err != nil {
-			t.Fatalf("Failed to extract response: %v", err)
-		}
-		assert.Equal(t, "string", metaResponse.ktype)
-		assert.Equal(t, int64(0), metaResponse.version)
-		assert.Equal(t, int64(0), metaResponse.size)
+		require.NoError(t, err)
+		require.Equal(t, "string", metaResponse.ktype)
+		require.Equal(t, int64(0), metaResponse.version)
+		require.Equal(t, int64(0), metaResponse.size)
 	})
 
 	t.Run("Test KMetadata for hash type", func(t *testing.T) {
-		key := "__avoid_collisions__" + "_kMetadataHash_" + util.RandString(1, 10, util.Alpha)
-		f1 := "__avoid_collisions__" + "_kMetadataHash_" + util.RandString(1, 10, util.Alpha)
-		v1 := "__avoid_collisions__" + "_kMetadataHash_" + util.RandString(1, 10, util.Alpha)
-		f2 := "__avoid_collisions__" + "_kMetadataHash_" + util.RandString(1, 10, util.Alpha)
-		v2 := "__avoid_collisions__" + "_kMetadataHash_" + util.RandString(1, 10, util.Alpha)
-		rdb.HSet(ctx, key, f1, v1, f2, v2)
+		key := "hash_" + util.RandString(1, 10, util.Alpha)
+		require.NoError(t, rdb.HSet(ctx, key, "f0", "v0", "f1", "v1").Err())
 		r := rdb.Do(ctx, "kmetadata", key)
 		result, err := r.Result()
-		if err != nil {
-			t.Fatalf("Command failed: %v", err)
-		}
+		require.NoError(t, err)
+
 		metaResponse, err := ExtractKMetadataResponse(result)
-		if err != nil {
-			t.Fatalf("Failed to extract response: %v", err)
-		}
-		assert.Equal(t, "hash", metaResponse.ktype)
-		assert.NotEqual(t, int64(0), metaResponse.version)
-		assert.Equal(t, int64(2), metaResponse.size)
+		require.NoError(t, err)
+		require.Equal(t, "hash", metaResponse.ktype)
+		require.NotEqual(t, int64(0), metaResponse.version)
+		require.Equal(t, int64(2), metaResponse.size)
 	})
 
 	t.Run("Test KMetadata for set type", func(t *testing.T) {
-		setName := "__avoid_collisions__" + "_kMetadataSet_" + util.RandString(1, 10, util.Alpha)
-		item1 := "__avoid_collisions__" + "_kMetadataSet_" + util.RandString(1, 10, util.Alpha)
-		item2 := "__avoid_collisions__" + "_kMetadataSet_" + util.RandString(1, 10, util.Alpha)
-		item3 := "__avoid_collisions__" + "_kMetadataSet_" + util.RandString(1, 10, util.Alpha)
-		item4 := "__avoid_collisions__" + "_kMetadataSet_" + util.RandString(1, 10, util.Alpha)
-		rdb.SAdd(ctx, setName, item1, item2, item3, item4)
+		setName := "set_" + util.RandString(1, 10, util.Alpha)
+		require.NoError(t, rdb.SAdd(ctx, setName, "e0", "e1", "e2", "e3").Err())
 		r := rdb.Do(ctx, "kmetadata", setName)
 		result, err := r.Result()
-		if err != nil {
-			t.Fatalf("Command failed: %v", err)
-		}
+		require.NoError(t, err)
+
 		metaResponse, err := ExtractKMetadataResponse(result)
-		if err != nil {
-			t.Fatalf("Failed to extract response: %v", err)
-		}
-		assert.Equal(t, "set", metaResponse.ktype)
-		assert.NotEqual(t, int64(0), metaResponse.version)
-		assert.Equal(t, int64(4), metaResponse.size)
+		require.NoError(t, err)
+		require.Equal(t, "set", metaResponse.ktype)
+		require.NotEqual(t, int64(0), metaResponse.version)
+		require.Equal(t, int64(4), metaResponse.size)
 	})
 
 	t.Run("Test KMetadata for zset type", func(t *testing.T) {
-		zsetName := "__avoid_collisions__" + "_kMetadataZSet_" + util.RandString(1, 10, util.Alpha)
+		zsetName := "zset_" + util.RandString(1, 10, util.Alpha)
 		members := []redis.Z{
-			{
-				Score:  1.0,
-				Member: "__avoid_collisions__" + "_kMetadataZSet_" + util.RandString(1, 10, util.Alpha),
-			},
-			{
-				Score:  2.0,
-				Member: "__avoid_collisions__" + "_kMetadataZSet_" + util.RandString(1, 10, util.Alpha),
-			},
-			{
-				Score:  3.0,
-				Member: "__avoid_collisions__" + "_kMetadataZSet_" + util.RandString(1, 10, util.Alpha),
-			},
+			{Score: 1.0, Member: "m0"},
+			{Score: 2.0, Member: "m1"},
+			{Score: 3.0, Member: "m2"},
 		}
 		rdb.ZAdd(ctx, zsetName, members...)
 		r := rdb.Do(ctx, "kmetadata", zsetName)
 		result, err := r.Result()
-		if err != nil {
-			t.Fatalf("Command failed: %v", err)
-		}
+		require.NoError(t, err)
+
 		metaResponse, err := ExtractKMetadataResponse(result)
-		if err != nil {
-			t.Fatalf("Failed to extract response: %v", err)
-		}
-		assert.Equal(t, "zset", metaResponse.ktype)
-		assert.NotEqual(t, int64(0), metaResponse.version)
-		assert.Equal(t, int64(3), metaResponse.size)
+		require.NoError(t, err)
+		require.Equal(t, "zset", metaResponse.ktype)
+		require.NotEqual(t, int64(0), metaResponse.version)
+		require.Equal(t, int64(3), metaResponse.size)
 	})
 
 	t.Run("Test KMetadata for Bitmap type", func(t *testing.T) {
-		bitMapKey := "__avoid_collisions__" + "_kMetadataBitMap_" + util.RandString(1, 10, util.Alpha)
-		rdb.SetBit(ctx, bitMapKey, 0, 1)
+		bitMapKey := "bitmap_" + util.RandString(1, 10, util.Alpha)
+		require.NoError(t, rdb.SetBit(ctx, bitMapKey, 0, 1).Err())
 		r := rdb.Do(ctx, "kmetadata", bitMapKey)
 		result, err := r.Result()
-		if err != nil {
-			t.Fatalf("Command failed: %v", err)
-		}
+		require.NoError(t, err)
+
 		metaResponse, err := ExtractKMetadataResponse(result)
-		if err != nil {
-			t.Fatalf("Failed to extract response: %v", err)
-		}
-		assert.Equal(t, "bitmap", metaResponse.ktype)
-		assert.NotEqual(t, int64(0), metaResponse.version)
-		assert.Equal(t, int64(1), metaResponse.size)
+		require.NoError(t, err)
+		require.Equal(t, "bitmap", metaResponse.ktype)
+		require.NotEqual(t, int64(0), metaResponse.version)
+		require.Equal(t, int64(1), metaResponse.size)
 	})
 
 	t.Run("Test KMetadata for List type", func(t *testing.T) {
-		listKey := "__avoid_collisions__" + "_kMetadataList_" + util.RandString(1, 10, util.Alpha)
-		item1 := "__avoid_collisions__" + "_kMetadataList_" + util.RandString(1, 10, util.Alpha)
-		item2 := "__avoid_collisions__" + "_kMetadataList_" + util.RandString(1, 10, util.Alpha)
-		rdb.RPush(ctx, listKey, item1, item2)
+		listKey := "list_" + util.RandString(1, 10, util.Alpha)
+		require.NoError(t, rdb.RPush(ctx, listKey, "a", "b").Err())
 		r := rdb.Do(ctx, "kmetadata", listKey)
 		result, err := r.Result()
-		if err != nil {
-			t.Fatalf("Command failed: %v", err)
-		}
+		require.NoError(t, err)
+
 		metaResponse, err := ExtractKMetadataResponse(result)
-		if err != nil {
-			t.Fatalf("Failed to extract response: %v", err)
-		}
-		assert.Equal(t, "list", metaResponse.ktype)
-		assert.NotEqual(t, int64(0), metaResponse.version)
-		assert.Equal(t, int64(2), metaResponse.size)
+		require.NoError(t, err)
+		require.Equal(t, "list", metaResponse.ktype)
+		require.NotEqual(t, int64(0), metaResponse.version)
+		require.Equal(t, int64(2), metaResponse.size)
 	})
 
 	t.Run("Test Key not present", func(t *testing.T) {
-		notFoundKey := "__avoid_collisions__" + "_kMetadataNotFound_" + util.RandString(1, 10, util.Alpha)
+		notFoundKey := "not_found_" + util.RandString(1, 10, util.Alpha)
 		r := rdb.Do(ctx, "kmetadata", notFoundKey)
-		val := r.Val()
-		assert.Equal(t, nil, val)
-		assert.Error(t, r.Err())
+		require.NotNil(t, r.Err())
 	})
-
 }