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

djwang pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudberry.git

commit 6b6594697559c2c95c5f811582e8b1dd6004db96
Author: NJrslv <[email protected]>
AuthorDate: Mon Jun 9 16:59:13 2025 +0300

    [yagp_hooks_collector] Fix user filtering propagation timing
---
 src/Config.cpp      | 51 ++++++++++++++++-----------------------------------
 src/Config.h        |  1 +
 src/EventSender.cpp | 40 +++++++++++++++++++++++++++++++++++++++-
 src/EventSender.h   |  1 +
 4 files changed, 57 insertions(+), 36 deletions(-)

diff --git a/src/Config.cpp b/src/Config.cpp
index 42fa4b2fb12..19aa37d1b9d 100644
--- a/src/Config.cpp
+++ b/src/Config.cpp
@@ -6,7 +6,6 @@
 
 extern "C" {
 #include "postgres.h"
-#include "utils/builtins.h"
 #include "utils/guc.h"
 }
 
@@ -17,7 +16,12 @@ static bool guc_enable_collector = true;
 static bool guc_report_nested_queries = true;
 static char *guc_ignored_users = nullptr;
 static int guc_max_text_size = 1024; // in KB
-static std::unique_ptr<std::unordered_set<std::string>> ignored_users = 
nullptr;
+std::unique_ptr<std::unordered_set<std::string>> ignored_users_set = nullptr;
+bool ignored_users_guc_dirty = false;
+
+static void assign_ignored_users_hook(const char *, void *) {
+  ignored_users_guc_dirty = true;
+}
 
 void Config::init() {
   DefineCustomStringVariable(
@@ -44,11 +48,12 @@ void Config::init() {
       &guc_report_nested_queries, true, PGC_USERSET,
       GUC_NOT_IN_SAMPLE | GUC_GPDB_NEED_SYNC, 0LL, 0LL, 0LL);
 
-  DefineCustomStringVariable(
-      "yagpcc.ignored_users_list",
-      "Make yagpcc ignore queries issued by given users", 0LL,
-      &guc_ignored_users, "gpadmin,repl,gpperfmon,monitor", PGC_SUSET,
-      GUC_NOT_IN_SAMPLE | GUC_GPDB_NEED_SYNC, 0LL, 0LL, 0LL);
+  DefineCustomStringVariable("yagpcc.ignored_users_list",
+                             "Make yagpcc ignore queries issued by given 
users",
+                             0LL, &guc_ignored_users,
+                             "gpadmin,repl,gpperfmon,monitor", PGC_SUSET,
+                             GUC_NOT_IN_SAMPLE | GUC_GPDB_NEED_SYNC, 0LL,
+                             assign_ignored_users_hook, 0LL);
 
   DefineCustomIntVariable(
       "yagpcc.max_text_size",
@@ -62,36 +67,12 @@ bool Config::enable_analyze() { return guc_enable_analyze; }
 bool Config::enable_cdbstats() { return guc_enable_cdbstats; }
 bool Config::enable_collector() { return guc_enable_collector; }
 bool Config::report_nested_queries() { return guc_report_nested_queries; }
+const char *Config::ignored_users() { return guc_ignored_users; }
 size_t Config::max_text_size() { return guc_max_text_size * 1024; }
 
 bool Config::filter_user(const std::string *username) {
-  if (!ignored_users) {
-    ignored_users.reset(new std::unordered_set<std::string>());
-    if (guc_ignored_users == nullptr || guc_ignored_users[0] == '0') {
-      return false;
-    }
-    /* Need a modifiable copy of string */
-    char *rawstring = pstrdup(guc_ignored_users);
-    List *elemlist;
-    ListCell *l;
-
-    /* Parse string into list of identifiers */
-    if (!SplitIdentifierString(rawstring, ',', &elemlist)) {
-      /* syntax error in list */
-      pfree(rawstring);
-      list_free(elemlist);
-      ereport(
-          LOG,
-          (errcode(ERRCODE_SYNTAX_ERROR),
-           errmsg(
-               "invalid list syntax in parameter yagpcc.ignored_users_list")));
-      return false;
-    }
-    foreach (l, elemlist) {
-      ignored_users->insert((char *)lfirst(l));
-    }
-    pfree(rawstring);
-    list_free(elemlist);
+  if (!username || !ignored_users_set) {
+    return true;
   }
-  return !username || ignored_users->find(*username) != ignored_users->end();
+  return ignored_users_set->find(*username) != ignored_users_set->end();
 }
diff --git a/src/Config.h b/src/Config.h
index f806bc0dbf5..9dd33c68321 100644
--- a/src/Config.h
+++ b/src/Config.h
@@ -11,5 +11,6 @@ public:
   static bool enable_collector();
   static bool filter_user(const std::string *username);
   static bool report_nested_queries();
+  static const char *ignored_users();
   static size_t max_text_size();
 };
\ No newline at end of file
diff --git a/src/EventSender.cpp b/src/EventSender.cpp
index 2ba34d1e4cc..fed9b69911f 100644
--- a/src/EventSender.cpp
+++ b/src/EventSender.cpp
@@ -8,6 +8,7 @@ extern "C" {
 #include "access/hash.h"
 #include "executor/executor.h"
 #include "utils/elog.h"
+#include "utils/builtins.h"
 
 #include "cdb/cdbdisp.h"
 #include "cdb/cdbexplain.h"
@@ -20,6 +21,9 @@ extern "C" {
 #include "PgUtils.h"
 #include "ProtoUtils.h"
 
+extern std::unique_ptr<std::unordered_set<std::string>> ignored_users_set;
+extern bool ignored_users_guc_dirty;
+
 void EventSender::query_metrics_collect(QueryMetricsStatus status, void *arg) {
   if (Gp_role != GP_ROLE_DISPATCH && Gp_role != GP_ROLE_EXECUTE) {
     return;
@@ -62,6 +66,10 @@ void EventSender::executor_before_start(QueryDesc 
*query_desc,
     nested_timing = 0;
     nested_calls = 0;
   }
+  if (ignored_users_guc_dirty) {
+    update_ignored_users(Config::ignored_users());
+    ignored_users_guc_dirty = false;
+  }
   if (!need_collect(query_desc, nesting_level)) {
     return;
   }
@@ -262,7 +270,7 @@ void EventSender::ic_metrics_collect() {
 }
 
 EventSender::EventSender() {
-  if (Config::enable_collector() && !Config::filter_user(get_user_name())) {
+  if (Config::enable_collector()) {
     try {
       connector = new UDSConnector();
     } catch (const std::exception &e) {
@@ -347,6 +355,36 @@ void EventSender::update_nested_counters(QueryDesc 
*query_desc) {
   }
 }
 
+void EventSender::update_ignored_users(const char *new_guc_ignored_users) {
+  auto new_ignored_users_set =
+      std::make_unique<std::unordered_set<std::string>>();
+  if (new_guc_ignored_users != nullptr && new_guc_ignored_users[0] != '\0') {
+    /* Need a modifiable copy of string */
+    char *rawstring = pstrdup(new_guc_ignored_users);
+    List *elemlist;
+    ListCell *l;
+
+    /* Parse string into list of identifiers */
+    if (!SplitIdentifierString(rawstring, ',', &elemlist)) {
+      /* syntax error in list */
+      pfree(rawstring);
+      list_free(elemlist);
+      ereport(
+          LOG,
+          (errcode(ERRCODE_SYNTAX_ERROR),
+           errmsg(
+               "invalid list syntax in parameter yagpcc.ignored_users_list")));
+      return;
+    }
+    foreach (l, elemlist) {
+      new_ignored_users_set->insert((char *)lfirst(l));
+    }
+    pfree(rawstring);
+    list_free(elemlist);
+  }
+  ignored_users_set = std::move(new_ignored_users_set);
+}
+
 EventSender::QueryItem::QueryItem(EventSender::QueryState st,
                                   yagpcc::SetQueryReq *msg)
     : state(st), message(msg) {}
\ No newline at end of file
diff --git a/src/EventSender.h b/src/EventSender.h
index 99f7b24753d..6919defbbb3 100644
--- a/src/EventSender.h
+++ b/src/EventSender.h
@@ -57,6 +57,7 @@ private:
   void collect_query_done(QueryDesc *query_desc, QueryMetricsStatus status);
   void cleanup_messages();
   void update_nested_counters(QueryDesc *query_desc);
+  void update_ignored_users(const char *new_guc_ignored_users);
 
   UDSConnector *connector = nullptr;
   int nesting_level = 0;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to