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) {