]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: log: support extra log origins for '%OG' alias
authorAurelien DARRAGON <adarragon@haproxy.com>
Tue, 10 Sep 2024 13:39:23 +0000 (15:39 +0200)
committerAurelien DARRAGON <adarragon@haproxy.com>
Thu, 26 Sep 2024 14:53:07 +0000 (16:53 +0200)
Following previous commits, let's improve log_orig_to_str() so that
extra log origins (registered through log_orig_register()) can be
translated to string from origin ID.

For that, it is required to add eb_32 tree node to log_origin struct in
order to enable quick integer lookup during runtime. Slow name lookup
using the list is acceptable for config parsing, but it is not the case
during runtime when log_orig_to_str() is expected to be used. Also, to
prevent duplicated info, get rid of ->id field and use ->tree.key instead

include/haproxy/log-t.h
src/log.c

index 2bcb2ddc4bff6462345eecbdc97f7c1880f4d06c..85ea15f048b00e43acbf540d49cadc7e8a5081db 100644 (file)
@@ -294,8 +294,8 @@ struct log_orig {
 /* used to register extra log origins */
 struct log_origin_node {
        struct list list;      /* per-name lookup during config */
+       struct eb32_node tree; /* per-id lookup during runtime */
        const char *name;
-       uint32_t id;
 };
 
 /* log profile step flags */
index 38b02edb61438b670dc7ed0c872a914ff71d6e05..2d73d1b963f516d114c69c93e13399b24a114130 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -91,6 +91,8 @@ static const struct log_fmt_st log_formats[LOG_FORMATS] = {
 
 /* list of extra log origins */
 static struct list log_origins = LIST_HEAD_INIT(log_origins);
+/* tree of extra log origins (lookup by id) */
+static struct eb_root log_origins_per_id = EB_ROOT_UNIQUE;
 
 /* get human readable representation for log_orig enum members */
 const char *log_orig_to_str(enum log_orig_id orig)
@@ -111,7 +113,17 @@ const char *log_orig_to_str(enum log_orig_id orig)
                case LOG_ORIG_TXN_CLOSE:
                        return "txn_close";
                default:
+               {
+                       /* catchall for extra log origins */
+                       struct log_origin_node *origin;
+
+                       /* lookup raw origin id */
+                       origin = container_of_safe(eb32_lookup(&log_origins_per_id, orig),
+                                                  struct log_origin_node, tree);
+                       if (origin)
+                               return origin->name;
                        break;
+               }
        }
        return "unspec";
 }
@@ -6364,7 +6376,7 @@ int cfg_parse_log_profile(const char *file, int linenum, char **args, int kwm)
                                        }
                                        log_profile_step_init(&extra->step);
                                        extra->orig = cur;
-                                       extra->node.key = cur->id;
+                                       extra->node.key = cur->tree.key;
                                        eb32_insert(&prof->extra, &extra->node);
                                        extra_step = &extra->step;
                                        target_step = &extra_step;
@@ -6490,8 +6502,8 @@ enum log_orig_id log_orig_register(const char *name)
 
        list_for_each_entry(cur, &log_origins, list) {
                if (strcmp(name, cur->name) == 0)
-                       return cur->id;
-               last = cur->id;
+                       return cur->tree.key;
+               last = cur->tree.key;
        }
        /* not found, need to register new log origin */
 
@@ -6504,14 +6516,15 @@ enum log_orig_id log_orig_register(const char *name)
        if (cur == NULL)
                goto out_oom;
 
-       cur->id = LOG_ORIG_EXTRA + last;
        cur->name = strdup(name);
        if (!cur->name) {
                free(cur);
                goto out_oom;
        }
+       cur->tree.key = LOG_ORIG_EXTRA + last;
        LIST_APPEND(&log_origins, &cur->list);
-       return cur->id;
+       eb32_insert(&log_origins_per_id, &cur->tree);
+       return cur->tree.key;
 
  out_oom:
        ha_alert("Failed to register additional log origin. Out of memory\n");