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

adar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git


The following commit(s) were added to refs/heads/master by this push:
     new 2f8778c  [tools] Add options to get specific flags.
2f8778c is described below

commit 2f8778c40edd0114777054a7c2a6b79cc6949f56
Author: triplesheep <[email protected]>
AuthorDate: Thu Oct 17 22:43:37 2019 +0800

    [tools] Add options to get specific flags.
    
    Change-Id: Id51ac07ffae54cd1dee25921612934e84d505f24
    Reviewed-on: http://gerrit.cloudera.org:8080/14486
    Tested-by: Kudu Jenkins
    Reviewed-by: ZhangYao <[email protected]>
    Reviewed-by: Adar Dembo <[email protected]>
---
 src/kudu/server/generic_service.cc     |  9 ++++-
 src/kudu/server/server_base.proto      |  5 +++
 src/kudu/tools/kudu-tool-test.cc       | 30 ++++++++++++++++
 src/kudu/tools/tool_action_common.cc   | 11 +++++-
 src/kudu/tools/tool_action_master.cc   |  1 +
 src/kudu/tools/tool_action_tserver.cc  |  1 +
 src/kudu/tserver/tablet_server-test.cc | 66 ++++++++++++++++++++++++++++++++++
 7 files changed, 121 insertions(+), 2 deletions(-)

diff --git a/src/kudu/server/generic_service.cc 
b/src/kudu/server/generic_service.cc
index 10e6ed4..ce9f917 100644
--- a/src/kudu/server/generic_service.cc
+++ b/src/kudu/server/generic_service.cc
@@ -79,12 +79,19 @@ void GenericServiceImpl::GetFlags(const GetFlagsRequestPB* 
req,
                                   GetFlagsResponsePB* resp,
                                   rpc::RpcContext* rpc) {
   // If no tags were specified, return all flags that have non-default values.
+  // If flags were specified, will ignore 'all_flags'.
   // If tags were specified, also filter flags that don't match any tag.
   bool all_flags = req->all_flags();
+  unordered_set<string> flags(req->flags().begin(), req->flags().end());
   for (const auto& entry : GetFlagsMap()) {
-    if (entry.second.is_default && !all_flags) {
+    if (entry.second.is_default && !all_flags && flags.empty()) {
       continue;
     }
+
+    if (!flags.empty() && !ContainsKey(flags, entry.first)) {
+      continue;
+    }
+
     unordered_set<string> tags;
     GetFlagTags(entry.first, &tags);
     bool matches = req->tags().empty();
diff --git a/src/kudu/server/server_base.proto 
b/src/kudu/server/server_base.proto
index 478e758..8242a68 100644
--- a/src/kudu/server/server_base.proto
+++ b/src/kudu/server/server_base.proto
@@ -44,9 +44,14 @@ message ServerStatusPB {
 message GetFlagsRequestPB {
   // Whether to return all flags, or only flags with non-default values.
   optional bool all_flags = 1;
+
   // A list of flag tags. Flags that match at least one tag are returned. If
   // no tags are specified, all flags match.
   repeated string tags = 2;
+
+  // A list of flags. Flags that in this list are returned. If flags are 
specified,
+  // will ignore 'all_flags'. If not, all flags match.
+  repeated string flags = 3;
 }
 
 message GetFlagsResponsePB {
diff --git a/src/kudu/tools/kudu-tool-test.cc b/src/kudu/tools/kudu-tool-test.cc
index f122e78..55a47e5 100644
--- a/src/kudu/tools/kudu-tool-test.cc
+++ b/src/kudu/tools/kudu-tool-test.cc
@@ -5234,6 +5234,36 @@ TEST_F(ToolTest, TestGetFlags) {
     ASSERT_STR_CONTAINS(out, "help,false,true");
     ASSERT_STR_NOT_MATCHES(out, "logemaillevel,*");
     ASSERT_STR_CONTAINS(out, Substitute("fs_wal_dir,$0,false", wal_dir));
+
+    // Check that we get flags with -flags.
+    out.clear();
+    NO_FATALS(RunActionStdoutString(
+        Substitute("$0 get_flags $1 -format=csv 
-flags=fs_wal_dir,logemaillevel",
+                   daemon_type, daemon_addr),
+        &out));
+    ASSERT_STR_NOT_MATCHES(out, "help*");
+    ASSERT_STR_CONTAINS(out, "logemaillevel,999,true");
+    ASSERT_STR_CONTAINS(out, Substitute("fs_wal_dir,$0,false", wal_dir));
+
+    // Check -flags will ignore -all_flags.
+    out.clear();
+    NO_FATALS(RunActionStdoutString(
+        Substitute("$0 get_flags $1 -format=csv -all_flags 
-flags=logemaillevel",
+                   daemon_type, daemon_addr),
+        &out));
+    ASSERT_STR_NOT_MATCHES(out, "help*");
+    ASSERT_STR_CONTAINS(out, "logemaillevel,999,true");
+    ASSERT_STR_NOT_MATCHES(out, "fs_wal_dir*");
+
+    // Check -flag_tags filter to matching tags with -flags.
+    out.clear();
+    NO_FATALS(RunActionStdoutString(
+        Substitute("$0 get_flags $1 -format=csv -flags=logemaillevel 
-flag_tags=stable",
+                   daemon_type, daemon_addr),
+        &out));
+    ASSERT_STR_NOT_MATCHES(out, "help*");
+    ASSERT_STR_NOT_MATCHES(out, "logemaillevel,*");
+    ASSERT_STR_NOT_MATCHES(out, "fs_wal_dir*");
   }
 }
 
diff --git a/src/kudu/tools/tool_action_common.cc 
b/src/kudu/tools/tool_action_common.cc
index a512ab2..bd9855d 100644
--- a/src/kudu/tools/tool_action_common.cc
+++ b/src/kudu/tools/tool_action_common.cc
@@ -118,6 +118,9 @@ DEFINE_string(flag_tags, "", "Comma-separated list of tags 
used to restrict whic
                              "flags are returned. An empty value matches all 
tags");
 DEFINE_bool(all_flags, false, "Whether to return all flags, or only flags that 
"
                               "were explicitly set.");
+DEFINE_string(flags, "", "Comma-separated list of flags used to restrict which 
"
+                         "flags are returned. An empty value means no 
restriction. "
+                         "If non-empty, all_flags is ignored.");
 DEFINE_string(tables, "", "Tables to include (comma-separated list of table 
names)"
                           "If not specified, includes all tables.");
 
@@ -412,6 +415,7 @@ Status PrintSegment(const 
scoped_refptr<ReadableLogSegment>& segment) {
 Status GetServerFlags(const string& address,
                       uint16_t default_port,
                       bool all_flags,
+                      const string& flags_to_get,
                       const string& flag_tags,
                       vector<server::GetFlagsResponsePB_Flag>* flags) {
   unique_ptr<GenericServiceProxy> proxy;
@@ -426,6 +430,10 @@ Status GetServerFlags(const string& address,
   for (StringPiece tag : strings::Split(flag_tags, ",", strings::SkipEmpty())) 
{
     req.add_tags(tag.as_string());
   }
+  for (StringPiece flag: strings::Split(flags_to_get, ",", 
strings::SkipEmpty())) {
+    req.add_flags(flag.as_string());
+  }
+
   RETURN_NOT_OK(proxy->GetFlags(req, &resp, &rpc));
 
   flags->clear();
@@ -435,7 +443,8 @@ Status GetServerFlags(const string& address,
 
 Status PrintServerFlags(const string& address, uint16_t default_port) {
   vector<server::GetFlagsResponsePB_Flag> flags;
-  RETURN_NOT_OK(GetServerFlags(address, default_port, FLAGS_all_flags, 
FLAGS_flag_tags, &flags));
+  RETURN_NOT_OK(GetServerFlags(address, default_port, FLAGS_all_flags,
+      FLAGS_flags, FLAGS_flag_tags, &flags));
 
   std::sort(flags.begin(), flags.end(),
       [](const GetFlagsResponsePB::Flag& left,
diff --git a/src/kudu/tools/tool_action_master.cc 
b/src/kudu/tools/tool_action_master.cc
index b83647c..dff62e8 100644
--- a/src/kudu/tools/tool_action_master.cc
+++ b/src/kudu/tools/tool_action_master.cc
@@ -337,6 +337,7 @@ unique_ptr<Mode> BuildMasterMode() {
         .Description("Get the gflags for a Kudu Master")
         .AddRequiredParameter({ kMasterAddressArg, kMasterAddressDesc })
         .AddOptionalParameter("all_flags")
+        .AddOptionalParameter("flags")
         .AddOptionalParameter("flag_tags")
         .Build();
     builder.AddAction(std::move(get_flags));
diff --git a/src/kudu/tools/tool_action_tserver.cc 
b/src/kudu/tools/tool_action_tserver.cc
index bf62257..337272a 100644
--- a/src/kudu/tools/tool_action_tserver.cc
+++ b/src/kudu/tools/tool_action_tserver.cc
@@ -225,6 +225,7 @@ unique_ptr<Mode> BuildTServerMode() {
       .Description("Get the gflags for a Kudu Tablet Server")
       .AddRequiredParameter({ kTServerAddressArg, kTServerAddressDesc })
       .AddOptionalParameter("all_flags")
+      .AddOptionalParameter("flags")
       .AddOptionalParameter("flag_tags")
       .Build();
 
diff --git a/src/kudu/tserver/tablet_server-test.cc 
b/src/kudu/tserver/tablet_server-test.cc
index 3a3f080..69dfff4 100644
--- a/src/kudu/tserver/tablet_server-test.cc
+++ b/src/kudu/tserver/tablet_server-test.cc
@@ -339,6 +339,72 @@ TEST_F(TabletServerTest, TestGetFlags) {
             return flag.name() == "logemaillevel";
           }));
   }
+
+  // Check that we get flags with -flags.
+  {
+    RpcController controller;
+    req.Clear();
+    req.add_flags("log_dir");
+    req.add_flags("logemaillevel");
+    ASSERT_OK(proxy.GetFlags(req, &resp, &controller));
+    SCOPED_TRACE(SecureDebugString(resp));
+    EXPECT_TRUE(std::any_of(resp.flags().begin(), resp.flags().end(),
+                            [](const server::GetFlagsResponsePB::Flag& flag) 
-> bool {
+                                return flag.name() == "log_dir";
+                            }));
+    EXPECT_TRUE(std::none_of(resp.flags().begin(), resp.flags().end(),
+                             [](const server::GetFlagsResponsePB::Flag& flag) 
-> bool {
+                                 return flag.name() == "help";
+                             }));
+    EXPECT_TRUE(std::any_of(resp.flags().begin(), resp.flags().end(),
+                            [](const server::GetFlagsResponsePB::Flag& flag) 
-> bool {
+                                return flag.name() == "logemaillevel";
+                            }));
+  }
+
+  // Check -flags will ignore -all_flags.
+  {
+    RpcController controller;
+    req.Clear();
+    req.set_all_flags(true);
+    req.add_flags("logemaillevel");
+    ASSERT_OK(proxy.GetFlags(req, &resp, &controller));
+    SCOPED_TRACE(SecureDebugString(resp));
+    EXPECT_TRUE(std::none_of(resp.flags().begin(), resp.flags().end(),
+                             [](const server::GetFlagsResponsePB::Flag& flag) 
-> bool {
+                                 return flag.name() == "log_dir";
+                             }));
+    EXPECT_TRUE(std::none_of(resp.flags().begin(), resp.flags().end(),
+                             [](const server::GetFlagsResponsePB::Flag& flag) 
-> bool {
+                                 return flag.name() == "help";
+                             }));
+    EXPECT_TRUE(std::any_of(resp.flags().begin(), resp.flags().end(),
+                            [](const server::GetFlagsResponsePB::Flag& flag) 
-> bool {
+                                return flag.name() == "logemaillevel";
+                            }));
+  }
+
+  // Check -flag_tags filter to matching tags with -flags.
+  {
+    RpcController controller;
+    req.Clear();
+    req.add_flags("logemaillevel");
+    req.add_tags("stable");
+    ASSERT_OK(proxy.GetFlags(req, &resp, &controller));
+    SCOPED_TRACE(SecureDebugString(resp));
+    EXPECT_TRUE(std::none_of(resp.flags().begin(), resp.flags().end(),
+                             [](const server::GetFlagsResponsePB::Flag& flag) 
-> bool {
+                                 return flag.name() == "log_dir";
+                             }));
+    EXPECT_TRUE(std::none_of(resp.flags().begin(), resp.flags().end(),
+                             [](const server::GetFlagsResponsePB::Flag& flag) 
-> bool {
+                                 return flag.name() == "help";
+                             }));
+    EXPECT_TRUE(std::none_of(resp.flags().begin(), resp.flags().end(),
+                             [](const server::GetFlagsResponsePB::Flag& flag) 
-> bool {
+                                 return flag.name() == "logemaillevel";
+                             }));
+  }
 }
 
 TEST_F(TabletServerTest, TestSetFlags) {

Reply via email to