This is an automated email from the ASF dual-hosted git repository.

twice 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 db0cbec06 feat(command): return all flags in COMMAND INFO (#3160)
db0cbec06 is described below

commit db0cbec060bb9d1e71a6942bba354b4b280a40f2
Author: Twice <[email protected]>
AuthorDate: Thu Sep 4 14:07:50 2025 +0800

    feat(command): return all flags in COMMAND INFO (#3160)
    
    Instead of just returning "write" or "readonly", now it can return full
    flag strings in COMMAND INFO to improve observibility of Kvrocks.
---
 src/commands/commander.cc                 |  5 ++---
 src/commands/commander.h                  | 21 +++++++++++++++++++++
 tests/gocase/unit/command/command_test.go |  2 +-
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/src/commands/commander.cc b/src/commands/commander.cc
index da32800be..8ef7ca33e 100644
--- a/src/commands/commander.cc
+++ b/src/commands/commander.cc
@@ -21,6 +21,7 @@
 #include "commander.h"
 
 #include "cluster/cluster_defs.h"
+#include "server/redis_reply.h"
 
 namespace redis {
 
@@ -47,9 +48,7 @@ std::string CommandTable::GetCommandInfo(const 
CommandAttributes *command_attrib
   command.append(redis::MultiLen(6));
   command.append(redis::BulkString(command_attributes->name));
   command.append(redis::Integer(command_attributes->arity));
-  command_flags.append(redis::MultiLen(1));
-  command_flags.append(redis::BulkString(command_attributes->InitialFlags() & 
kCmdWrite ? "write" : "readonly"));
-  command.append(command_flags);
+  
command.append(redis::ArrayOfBulkStrings(CommandAttributes::FlagsToString(command_attributes->InitialFlags())));
   auto key_range = command_attributes->InitialKeyRange().ValueOr({0, 0, 0});
   command.append(redis::Integer(key_range.first_key));
   command.append(redis::Integer(key_range.last_key));
diff --git a/src/commands/commander.h b/src/commands/commander.h
index 32b54978c..61a3b79d5 100644
--- a/src/commands/commander.h
+++ b/src/commands/commander.h
@@ -265,6 +265,8 @@ struct CommandAttributes {
 
   uint64_t InitialFlags() const { return flags_; }
 
+  static std::vector<std::string> FlagsToString(uint64_t flags);
+
   auto GenerateFlags(const std::vector<std::string> &args, const Config 
&config) const {
     uint64_t res = flags_;
     if (flag_gen_) res = flag_gen_(res, args, config);
@@ -371,6 +373,25 @@ inline uint64_t ParseCommandFlags(const std::string 
&description, const std::str
   return flags;
 }
 
+inline std::vector<std::string> CommandAttributes::FlagsToString(uint64_t 
flags) {
+  std::vector<std::string> res;
+
+  if (flags & kCmdWrite) res.emplace_back("write");
+  if (flags & kCmdReadOnly) res.emplace_back("readonly");
+  if (flags & kCmdLoading) res.emplace_back("ok-loading");
+  if (flags & kCmdBypassMulti) res.emplace_back("bypass-multi");
+  if (flags & kCmdExclusive) res.emplace_back("exclusive");
+  if (flags & kCmdNoMulti) res.emplace_back("no-multi");
+  if (flags & kCmdNoScript) res.emplace_back("no-script");
+  if (flags & kCmdNoDBSizeCheck) res.emplace_back("no-dbsize-check");
+  if (flags & kCmdSlow) res.emplace_back("slow");
+  if (flags & kCmdBlocking) res.emplace_back("blocking");
+  if (flags & kCmdAuth) res.emplace_back("auth");
+  if (flags & kCmdAdmin) res.emplace_back("admin");
+
+  return res;
+}
+
 template <typename T>
 auto MakeCmdAttr(const std::string &name, int arity, const std::string 
&description, NoKeyInThisCommand no_key,
                  const AdditionalFlagGen &flag_gen = {}) {
diff --git a/tests/gocase/unit/command/command_test.go 
b/tests/gocase/unit/command/command_test.go
index 27a6d5360..0331155b8 100644
--- a/tests/gocase/unit/command/command_test.go
+++ b/tests/gocase/unit/command/command_test.go
@@ -68,7 +68,7 @@ func TestCommand(t *testing.T) {
                require.Len(t, v, 6)
                require.Equal(t, "keys", v[0])
                require.EqualValues(t, 2, v[1])
-               require.Equal(t, []interface{}{"readonly"}, v[2])
+               require.Equal(t, []interface{}{"readonly", "slow"}, v[2])
                require.EqualValues(t, 0, v[3])
                require.EqualValues(t, 0, v[4])
                require.EqualValues(t, 0, v[5])

Reply via email to