From d414ebf0c7a784fcd9854192b8d795c2b7238397 Mon Sep 17 00:00:00 2001 From: Yorgos Thessalonikefs Date: Fri, 23 Jan 2026 17:08:55 +0100 Subject: [PATCH] - On Linux systems log the system-wide unique thread ID instead of Unbound's internal thread counter. --- daemon/daemon.c | 27 +++++++++++++++++++++++++-- daemon/remote.c | 12 +++++++++++- daemon/remote.h | 6 ++++++ daemon/worker.c | 3 --- dnstap/dtstream.c | 12 +++++++++++- dnstap/dtstream.h | 6 ++++++ util/log.c | 32 ++++++++++++++++---------------- 7 files changed, 75 insertions(+), 23 deletions(-) diff --git a/daemon/daemon.c b/daemon/daemon.c index f882bb9ad..eb27fd3ab 100644 --- a/daemon/daemon.c +++ b/daemon/daemon.c @@ -631,6 +631,25 @@ static void close_other_pipes(struct daemon* daemon, int thr) } #endif /* THREADS_DISABLED */ +/** + * Function to set the thread local log ID. + * Either the internal thread number, or the LWP ID on Linux based on + * configuration. + */ +static void +set_log_thread_id(struct worker* worker, struct config_file* cfg) +{ + (void)cfg; + log_assert(worker); +#if defined(HAVE_GETTID) && !defined(THREADS_DISABLED) + worker->thread_tid = gettid(); + if(1/*cfg->log_thread_id*/) + log_thread_set(&worker->thread_tid); + else +#endif + log_thread_set(&worker->thread_num); +} + /** * Function to start one thread. * @param arg: user argument. @@ -641,7 +660,7 @@ thread_start(void* arg) { struct worker* worker = (struct worker*)arg; int port_num = 0; - log_thread_set(&worker->thread_num); + set_log_thread_id(worker, worker->daemon->cfg); ub_thread_blocksigs(); #ifdef THREADS_DISABLED /* close pipe ends used by main */ @@ -801,9 +820,13 @@ daemon_fork(struct daemon* daemon) fatal_exit("RPZ requires the respip module"); /* first create all the worker structures, so we can pass - * them to the newly created threads. + * them to the newly created threads. */ daemon_create_workers(daemon); + /* Set it for the first (main) worker since it does not take part in + * the thread_start() procedure. + */ + set_log_thread_id(daemon->workers[0], daemon->cfg); #if defined(HAVE_EV_LOOP) || defined(HAVE_EV_DEFAULT_LOOP) /* in libev the first inited base gets signals */ diff --git a/daemon/remote.c b/daemon/remote.c index 0d55619c2..9732ace6d 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -6627,7 +6627,14 @@ static void* fast_reload_thread_main(void* arg) struct fast_reload_thread* fast_reload_thread = (struct fast_reload_thread*)arg; struct timeval time_start, time_read, time_construct, time_reload, time_end; - log_thread_set(&fast_reload_thread->threadnum); + +#if defined(HAVE_GETTID) && !defined(THREADS_DISABLED) + fast_reload_thread->thread_tid = gettid(); + if(fast_reload_thread->thread_tid_log) + log_thread_set(&fast_reload_thread->thread_tid); + else +#endif + log_thread_set(&fast_reload_thread->threadnum); verbose(VERB_ALGO, "start fast reload thread"); if(fast_reload_thread->fr_verb >= 1) { @@ -7015,6 +7022,9 @@ fast_reload_thread_setup(struct worker* worker, int fr_verb, int fr_nopause, lock_basic_init(&fr->fr_output_lock); lock_protect(&fr->fr_output_lock, fr->fr_output, sizeof(*fr->fr_output)); +#ifdef HAVE_GETTID + fr->thread_tid_log = 1; /* worker->env->cfg->log_thread_id */ +#endif return 1; } diff --git a/daemon/remote.h b/daemon/remote.h index 064d7b7fc..77c00a597 100644 --- a/daemon/remote.h +++ b/daemon/remote.h @@ -206,6 +206,12 @@ struct fast_reload_thread { int commpair[2]; /** thread id, of the io thread */ ub_thread_type tid; +#ifdef HAVE_GETTID + /** thread tid, the LWP id */ + pid_t thread_tid; + /** if logging should include the LWP id */ + int thread_tid_log; +#endif /** if the io processing has started */ int started; /** if the thread has to quit */ diff --git a/daemon/worker.c b/daemon/worker.c index 0f0af7457..3c3af8d8f 100644 --- a/daemon/worker.c +++ b/daemon/worker.c @@ -2184,9 +2184,6 @@ worker_init(struct worker* worker, struct config_file *cfg, struct dt_env* dtenv = &worker->dtenv; #else void* dtenv = NULL; -#endif -#ifdef HAVE_GETTID - worker->thread_tid = gettid(); #endif worker->need_to_exit = 0; worker->base = comm_base_create(do_sigs); diff --git a/dnstap/dtstream.c b/dnstap/dtstream.c index 39d43403b..748305ce7 100644 --- a/dnstap/dtstream.c +++ b/dnstap/dtstream.c @@ -448,6 +448,9 @@ int dt_io_thread_apply_cfg(struct dt_io_thread* dtio, struct config_file *cfg) dtio->tls_use_sni = cfg->tls_use_sni; #endif /* HAVE_SSL */ } +#ifdef HAVE_GETTID + dtio->thread_tid_log = 1 /*cfg->log_thread_id*/; +#endif return 1; } @@ -2130,7 +2133,14 @@ static void* dnstap_io(void* arg) struct dt_io_thread* dtio = (struct dt_io_thread*)arg; time_t secs = 0; struct timeval now; - log_thread_set(&dtio->threadnum); + +#if defined(HAVE_GETTID) && !defined(THREADS_DISABLED) + dtio->thread_tid = gettid(); + if(dtio->thread_tid_log) + log_thread_set(&dtio->thread_tid); + else +#endif + log_thread_set(&dtio->threadnum); /* setup */ verbose(VERB_ALGO, "start dnstap io thread"); diff --git a/dnstap/dtstream.h b/dnstap/dtstream.h index f87d6dc8d..4c0a6285f 100644 --- a/dnstap/dtstream.h +++ b/dnstap/dtstream.h @@ -131,6 +131,12 @@ struct dt_io_thread { struct dt_io_list_item* io_list_iter; /** thread id, of the io thread */ ub_thread_type tid; +#ifdef HAVE_GETTID + /** thread tid, the LWP id */ + pid_t thread_tid; + /** if logging should include the LWP id */ + int thread_tid_log; +#endif /** if the io processing has started */ int started; /** ssl context for the io thread, for tls connections. type SSL_CTX* */ diff --git a/util/log.c b/util/log.c index b75cf065f..f2beafc87 100644 --- a/util/log.c +++ b/util/log.c @@ -174,10 +174,10 @@ void log_thread_set(int* num) int log_thread_get(void) { - unsigned int* tid; + int* tid; if(!key_created) return 0; - tid = (unsigned int*)ub_thread_key_get(logkey); - return (int)(tid?*tid:0); + tid = ub_thread_key_get(logkey); + return (tid?*tid:0); } void log_ident_set(const char* id) @@ -229,7 +229,7 @@ log_vmsg(int pri, const char* type, const char *format, va_list args) { char message[MAXSYSLOGMSGLEN]; - unsigned int* tid = (unsigned int*)ub_thread_key_get(logkey); + int tid = log_thread_get(); time_t now; #if defined(HAVE_STRFTIME) && defined(HAVE_LOCALTIME_R) char tmbuf[32]; @@ -241,8 +241,8 @@ log_vmsg(int pri, const char* type, vsnprintf(message, sizeof(message), format, args); #ifdef HAVE_SYSLOG_H if(logging_to_syslog) { - syslog(pri, "[%d:%x] %s: %s", - (int)getpid(), tid?*tid:0, type, message); + syslog(pri, "[%d:%d] %s: %s", + (int)getpid(), tid, type, message); return; } #elif defined(UB_ON_WINDOWS) @@ -263,8 +263,8 @@ log_vmsg(int pri, const char* type, tp=MSG_GENERIC_SUCCESS; wt=EVENTLOG_SUCCESS; } - snprintf(m, sizeof(m), "[%s:%x] %s: %s", - ident, tid?*tid:0, type, message); + snprintf(m, sizeof(m), "[%s:%d] %s: %s", + ident, tid, type, message); s = RegisterEventSource(NULL, SERVICE_NAME); if(!s) return; ReportEvent(s, wt, 0, tp, NULL, 1, 0, &str, NULL); @@ -294,9 +294,9 @@ log_vmsg(int pri, const char* type, tzbuf[3] = ':'; tzbuf[6] = 0; } - fprintf(logfile, "%s.%3.3d%s %s[%d:%x] %s: %s\n", + fprintf(logfile, "%s.%3.3d%s %s[%d:%d] %s: %s\n", tmbuf, (int)tv.tv_usec/1000, tzbuf, - ident, (int)getpid(), tid?*tid:0, type, message); + ident, (int)getpid(), tid, type, message); #ifdef UB_ON_WINDOWS /* line buffering does not work on windows */ fflush(logfile); @@ -310,19 +310,19 @@ log_vmsg(int pri, const char* type, if(log_time_asc && strftime(tmbuf, sizeof(tmbuf), "%b %d %H:%M:%S", localtime_r(&now, &tm))%(sizeof(tmbuf)) != 0) { /* %sizeof buf!=0 because old strftime returned max on error */ - fprintf(logfile, "%s %s[%d:%x] %s: %s\n", tmbuf, - ident, (int)getpid(), tid?*tid:0, type, message); + fprintf(logfile, "%s %s[%d:%d] %s: %s\n", tmbuf, + ident, (int)getpid(), tid, type, message); } else #elif defined(UB_ON_WINDOWS) if(log_time_asc && GetTimeFormat(LOCALE_USER_DEFAULT, 0, NULL, NULL, tmbuf, sizeof(tmbuf)) && GetDateFormat(LOCALE_USER_DEFAULT, 0, NULL, NULL, dtbuf, sizeof(dtbuf))) { - fprintf(logfile, "%s %s %s[%d:%x] %s: %s\n", dtbuf, tmbuf, - ident, (int)getpid(), tid?*tid:0, type, message); + fprintf(logfile, "%s %s %s[%d:%d] %s: %s\n", dtbuf, tmbuf, + ident, (int)getpid(), tid, type, message); } else #endif - fprintf(logfile, "[" ARG_LL "d] %s[%d:%x] %s: %s\n", (long long)now, - ident, (int)getpid(), tid?*tid:0, type, message); + fprintf(logfile, "[" ARG_LL "d] %s[%d:%d] %s: %s\n", (long long)now, + ident, (int)getpid(), tid, type, message); #ifdef UB_ON_WINDOWS /* line buffering does not work on windows */ fflush(logfile); -- 2.47.3