From: Aurelien DARRAGON Date: Tue, 10 Sep 2024 13:39:23 +0000 (+0200) Subject: MINOR: log: support extra log origins for '%OG' alias X-Git-Tag: v3.1-dev9~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b882402a298b0618299580554c886c35ca27784a;p=thirdparty%2Fhaproxy.git MINOR: log: support extra log origins for '%OG' alias 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 --- diff --git a/include/haproxy/log-t.h b/include/haproxy/log-t.h index 2bcb2ddc4b..85ea15f048 100644 --- a/include/haproxy/log-t.h +++ b/include/haproxy/log-t.h @@ -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 */ diff --git a/src/log.c b/src/log.c index 38b02edb61..2d73d1b963 100644 --- 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");