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

bankim 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 23fd58c  [util] Add a function to fetch non-default flags as a map
23fd58c is described below

commit 23fd58c39177110fa64047d566a4a1c375e061f5
Author: Bankim Bhavsar <[email protected]>
AuthorDate: Tue May 4 14:06:00 2021 -0700

    [util] Add a function to fetch non-default flags as a map
    
    We already have a function that returns non-default flags
    as a vector of strings. This change adds a function
    that returns non-default flags as a map refactoring
    and reusing the existing logic.
    
    This function is used in add master tool to bring
    up the new master as it's unnecessary to pass all
    the flags to the kudu master. This is similar to
    master run implementation in master_runner.cc.
    
    Change-Id: I7e7c9fc4de9be05110dba5ca02f48d46b6b474b7
    Reviewed-on: http://gerrit.cloudera.org:8080/17400
    Tested-by: Kudu Jenkins
    Reviewed-by: Andrew Wong <[email protected]>
    Reviewed-by: Mahesh Reddy <[email protected]>
    Reviewed-by: Grant Henke <[email protected]>
    Reviewed-by: Alexey Serbin <[email protected]>
---
 src/kudu/tools/tool_action_master.cc |  2 +-
 src/kudu/util/flags.cc               | 50 ++++++++++++++++++++++++------------
 src/kudu/util/flags.h                |  9 ++++---
 3 files changed, 40 insertions(+), 21 deletions(-)

diff --git a/src/kudu/tools/tool_action_master.cc 
b/src/kudu/tools/tool_action_master.cc
index 4b61e4f..3a49e25 100644
--- a/src/kudu/tools/tool_action_master.cc
+++ b/src/kudu/tools/tool_action_master.cc
@@ -369,7 +369,7 @@ Status AddMaster(const RunnerContext& context) {
   if (FLAGS_fs_data_dirs.empty()) {
     return Status::InvalidArgument("Flag -fs_data_dirs not supplied");
   }
-  GFlagsMap flags_map = GetFlagsMap();
+  GFlagsMap flags_map = GetNonDefaultFlagsMap();
   // Remove the optional parameters for this command.
   // Remaining optional flags need to be passed to the new master.
   flags_map.erase("wait_secs");
diff --git a/src/kudu/util/flags.cc b/src/kudu/util/flags.cc
index 01a0100..949018c 100644
--- a/src/kudu/util/flags.cc
+++ b/src/kudu/util/flags.cc
@@ -21,10 +21,12 @@
 #include <sys/stat.h>
 #include <unistd.h> // IWYU pragma: keep
 
+#include <algorithm>
 #include <cstdlib>
 #include <cstring>
 #include <functional>
 #include <iostream>
+#include <iterator>
 #include <map>
 #include <string>
 #include <unordered_set>
@@ -560,34 +562,50 @@ string CommandlineFlagsIntoString(EscapeMode mode) {
   return ret_value;
 }
 
+vector<CommandLineFlagInfo> GetNonDefaultFlagsHelper() {
+  vector<CommandLineFlagInfo> all_flags;
+  GetAllFlags(&all_flags);
+  vector<CommandLineFlagInfo> non_default_flags;
+  std::copy_if(all_flags.begin(), all_flags.end(), 
std::back_inserter(non_default_flags),
+               [] (const auto& flag) {
+                 // In addition to checking that the flag has been rewritten 
with 'is_default',
+                 // we also check that the value is different from the default 
value.
+                 return !flag.is_default && flag.current_value != 
flag.default_value;
+               });
+  return non_default_flags;
+}
+
 string GetNonDefaultFlags() {
   ostringstream args;
-  vector<CommandLineFlagInfo> flags;
-  GetAllFlags(&flags);
-  for (const auto& flag : flags) {
-    if (!flag.is_default) {
-      // This only means that the flag has been rewritten.
-      // We need to check that the value is different from the default value.
-      if (flag.current_value != flag.default_value) {
-        if (!args.str().empty()) {
-          args << '\n';
-        }
-
-        // Redact the flags tagged as sensitive, if redaction is enabled.
-        string flag_value = CheckFlagAndRedact(flag, EscapeMode::NONE);
-        args << "--" << flag.name << '=' << flag_value;
-      }
+  for (const auto& flag : GetNonDefaultFlagsHelper()) {
+    if (!args.str().empty()) {
+      args << '\n';
     }
+    // Redact the flags tagged as sensitive, if redaction is enabled.
+    string flag_value = CheckFlagAndRedact(flag, EscapeMode::NONE);
+    args << "--" << flag.name << '=' << flag_value;
   }
   return args.str();
 }
 
+GFlagsMap GetNonDefaultFlagsMap() {
+  GFlagsMap flags_by_name;
+  for (auto& flag : GetNonDefaultFlagsHelper()) {
+    // Instead of "flags_by_name.emplace(flag.name, std::move(flag))" using
+    // following approach as order of evaluation of parameters could be 
different
+    // leading to unexpected value in "flag.name".
+    flags_by_name[flag.name] = std::move(flag);
+  }
+  return flags_by_name;
+}
+
 GFlagsMap GetFlagsMap() {
   vector<CommandLineFlagInfo> default_flags;
   GetAllFlags(&default_flags);
   GFlagsMap flags_by_name;
   for (auto& flag : default_flags) {
-    flags_by_name.emplace(flag.name, std::move(flag));
+    // See the note in GetNonDefaultFlagsMap() above.
+    flags_by_name[flag.name] = std::move(flag);
   }
   return flags_by_name;
 }
diff --git a/src/kudu/util/flags.h b/src/kudu/util/flags.h
index 98f8cb8..b88c25d 100644
--- a/src/kudu/util/flags.h
+++ b/src/kudu/util/flags.h
@@ -21,11 +21,9 @@
 #include <string>
 #include <unordered_map>
 
-#include "kudu/util/status.h"
+#include <gflags/gflags.h>
 
-namespace google {
-  struct CommandLineFlagInfo;
-}
+#include "kudu/util/status.h"
 
 namespace kudu {
 
@@ -77,6 +75,9 @@ typedef std::unordered_map<std::string, 
google::CommandLineFlagInfo> GFlagsMap;
 // are tagged as sensitive, if redaction is enabled.
 std::string GetNonDefaultFlags();
 
+// Same as 'GetNonDefaultFlags' but returns the output as a map.
+GFlagsMap GetNonDefaultFlagsMap();
+
 GFlagsMap GetFlagsMap();
 
 enum class TriStateFlag {

Reply via email to