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

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


The following commit(s) were added to refs/heads/master by this push:
     new 54c65702 Limit the extra options of jemalloc profiler (#3101)
54c65702 is described below

commit 54c65702f2bf92493facb6f0439a2b84da13b489
Author: Bright Chen <chenguangmin...@foxmail.com>
AuthorDate: Fri Sep 26 19:46:56 2025 +0800

    Limit the extra options of jemalloc profiler (#3101)
    
    * Limit the extra options of jemalloc profiler
    
    * Add warning log
---
 src/brpc/details/jemalloc_profiler.cpp | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/src/brpc/details/jemalloc_profiler.cpp 
b/src/brpc/details/jemalloc_profiler.cpp
index c14d5490..fdd06fb4 100644
--- a/src/brpc/details/jemalloc_profiler.cpp
+++ b/src/brpc/details/jemalloc_profiler.cpp
@@ -166,6 +166,23 @@ static int JeProfileReset(size_t lg_sample) {
     return 0;
 }
 
+// https://github.com/jemalloc/jemalloc/blob/5.3.0/bin/jeprof.in#L211-L222
+static const std::unordered_set<const char*> g_extra_options_set = {
+    "inuse_space", "inuse_objects", "alloc_space",
+    "alloc_objects", "show_bytes", "drop_negative",
+    "total_delay", "contentions", "mean_delay"
+};
+
+std::string GlobalExtraOptionsString() {
+    std::string result;
+    result.reserve(64);
+    for (const auto& option : g_extra_options_set) {
+        result.append(option);
+        result.append(" ");
+    }
+    return result;
+}
+
 void JeControlProfile(Controller* cntl) {
     const brpc::URI& uri = cntl->http_request().uri();
     // 
http:ip:port/pprof/heap?display=(text|svg|stats|flamegraph)&extra_options=(inuse_space|inuse_objects..)
@@ -228,13 +245,20 @@ void JeControlProfile(Controller* cntl) {
     }
     const std::string process_file(process_path, len);
 
-    std::string cmd_str = jeprof + " " + process_file + " " + prof_name;
+    std::string cmd_str = butil::string_printf(
+        "%s %s %s", jeprof.c_str(), process_file.c_str(), prof_name.c_str());
 
     // https://github.com/jemalloc/jemalloc/blob/5.3.0/bin/jeprof.in#L211-L222
     // e.g: inuse_space, contentions
     const std::string* uri_extra_options = uri.GetQuery("extra_options");
     if (uri_extra_options != nullptr && !uri_extra_options->empty()) {
-        cmd_str += " --" + *uri_extra_options + " ";
+        if (g_extra_options_set.count(uri_extra_options->c_str()) > 0) {
+            butil::string_appendf(&cmd_str, " --%s", 
uri_extra_options->c_str());
+        } else {
+            static std::string g_options_str = GlobalExtraOptionsString();
+            LOG(WARNING) << "Unsupported jemalloc options=" << 
*uri_extra_options
+                         << ", only support [" << g_options_str << "]";
+        }
     }
 
     bool display_img = false;
@@ -244,12 +268,14 @@ void JeControlProfile(Controller* cntl) {
     } else if (*uri_display == "flamegraph") {
         const char* flamegraph_tool = getenv("FLAMEGRAPH_PL_PATH");
         if (!flamegraph_tool) {
-            LOG(WARNING) << " display: " << *uri_display << " invalid, env 
FLAMEGRAPH_PL_PATH invalid";
+            LOG(WARNING) << " display: " << *uri_display
+                         << " invalid, env FLAMEGRAPH_PL_PATH invalid";
             buf.append("\ndisplay:" + *uri_display + " invalid, env 
FLAMEGRAPH_PL_PATH invalid"); 
             return;
         }
         const int width_size = FLAGS_max_flame_graph_width > 0 ? 
FLAGS_max_flame_graph_width : 1200;
-        cmd_str += " --collapsed | " + std::string(flamegraph_tool) + " 
--colors mem --width " + std::to_string(width_size);
+        butil::string_appendf(&cmd_str, " --collapsed | %s --colors mem 
--width %d",
+                              flamegraph_tool, width_size);
         display_img = true;
     } else if (*uri_display == "text") {
         cmd_str += " --text ";


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@brpc.apache.org
For additional commands, e-mail: dev-h...@brpc.apache.org

Reply via email to