From c46ee81b1d0d1b5c4b09584e7786ca9819bb0c94 Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Wed, 23 Apr 2025 16:53:42 -0400 Subject: [PATCH 01/15] config: add new context loop and channel for context signals. Signed-off-by: Phillip Adair Stewart Whelan --- include/fluent-bit/flb_config.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/fluent-bit/flb_config.h b/include/fluent-bit/flb_config.h index a41c7d83d2d..143326083f3 100644 --- a/include/fluent-bit/flb_config.h +++ b/include/fluent-bit/flb_config.h @@ -52,10 +52,22 @@ * pointers. */ +#define FLB_CONTEXT_EV_SIGNAL (1 << 0) /* 1 */ + +enum ctx_signal_type { + FLB_CTX_SIGNAL_RELOAD, + FLB_CTX_SIGNAL_SHUTDOWN, +}; + /* Main struct to hold the configuration of the runtime service */ struct flb_config { struct mk_event ch_event; + /* external communication channel for fluent-bit contexts */ + struct mk_event_loop *ctx_evl; + flb_pipefd_t ch_context_signal[2]; /* channel to recieve context signal events */ + struct mk_event event_context_signal; + int support_mode; /* enterprise support mode ? */ int is_ingestion_active; /* date ingestion active/allowed */ int is_shutting_down; /* is the service shutting down ? */ From 61a349c6f06796a8aa25a7b3912e9461467e504c Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Wed, 23 Apr 2025 16:55:38 -0400 Subject: [PATCH 02/15] engine: initialize the context event loop (used for internal signals). Signed-off-by: Phillip Adair Stewart Whelan --- src/flb_engine.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/flb_engine.c b/src/flb_engine.c index 5e1a8a8a563..77aae7d2ff2 100644 --- a/src/flb_engine.c +++ b/src/flb_engine.c @@ -695,6 +695,7 @@ int flb_engine_start(struct flb_config *config) struct flb_sched *sched; struct flb_net_dns dns_ctx; struct flb_notification *notification; + enum ctx_signal_type ctx_signal; /* Initialize the networking layer */ flb_net_lib_init(); @@ -719,6 +720,29 @@ int flb_engine_start(struct flb_config *config) } config->evl_bktq = evl_bktq; + /* + * Event loop channel to send context signals. + * + */ + /* Create the event loop and set it in the global configuration */ + config->ctx_evl = mk_event_loop_create(8); + if (!config->ctx_evl) { + fprintf(stderr, "[log] could not create context event loop\n"); + return -1; + } + + ret = mk_event_channel_create(config->ctx_evl, + &config->ch_context_signal[0], + &config->ch_context_signal[1], + &config->event_context_signal); + if (ret == -1) { + flb_error("[engine] could not create context signal channel"); + return -1; + } + /* Signal type to indicate a "context" event */ + config->event_context_signal.type = FLB_CONTEXT_EV_SIGNAL; + config->event_context_signal.priority = FLB_ENGINE_PRIORITY_THREAD; + /* * Event loop channel to ingest flush events from flb_engine_flush() * @@ -1047,8 +1071,14 @@ int flb_engine_start(struct flb_config *config) flb_info("[engine] service has stopped (%i pending tasks)", ret); ret = config->exit_status_code; + + ctx_signal = FLB_CTX_SIGNAL_SHUTDOWN; + flb_pipe_w(config->ch_context_signal[1], &ctx_signal, + sizeof(enum ctx_signal_type)); + flb_engine_shutdown(config); config = NULL; + return ret; } } From d73a36c1bf1642081e38ff8d37dadc9afcf3e37a Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Wed, 23 Apr 2025 16:56:06 -0400 Subject: [PATCH 03/15] fluent-bit: refactor main event loop to use context signals. Signed-off-by: Phillip Adair Stewart Whelan --- src/fluent-bit.c | 72 +++++++++++++++++++++++++++--------------------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/src/fluent-bit.c b/src/fluent-bit.c index a97ebb13857..b229d7ead45 100644 --- a/src/fluent-bit.c +++ b/src/fluent-bit.c @@ -1003,6 +1003,10 @@ int flb_main(int argc, char **argv) struct flb_cf *cf_opts; struct flb_cf_group *group; + struct mk_event *event; + enum ctx_signal_type ctx_signal; + int is_shutdown = 0; + prog_name = argv[0]; cf_opts = flb_cf_create(); @@ -1425,41 +1429,47 @@ int flb_main(int argc, char **argv) } #endif - while (ctx->status == FLB_LIB_OK && exit_signal == 0) { - sleep(1); - -#ifdef FLB_SYSTEM_WINDOWS - if (handler_signal == 1) { - handler_signal = 0; - flb_reload(ctx, cf_opts); - } - else if (handler_signal == 2){ - handler_signal = 0; - break; - } -#endif + while (exit_signal == 0 && is_shutdown == 0) { + mk_event_wait(config->ctx_evl); + mk_event_foreach(event, config->ctx_evl) { + if (exit_signal) { + break; + } + switch (event->type) { + case FLB_CONTEXT_EV_SIGNAL: + ret = flb_pipe_r(event->fd, &ctx_signal, + sizeof(enum ctx_signal_type)); + if (ret <= 0) { + flb_error("unable to read context eventt"); + continue; + } - /* set the context again before checking the status again */ - ctx = flb_context_get(); + switch(ctx_signal) { + case FLB_CTX_SIGNAL_SHUTDOWN: + is_shutdown = 1; + break; + case FLB_CTX_SIGNAL_RELOAD: + /* reload by using same config files/path */ + flb_bin_restarting == FLB_RELOAD_IN_PROGRESS; + ret = flb_reload(ctx, cf_opts); + if (ret == 0) { + ctx = flb_context_get(); + flb_bin_restarting = FLB_RELOAD_IDLE; + config = ctx->config; -#ifdef FLB_SYSTEM_WINDOWS - flb_console_handler_set_ctx(ctx, cf_opts); +#ifdef FLB_HAVE_CHUNK_TRACE + if (trace_input != NULL) { + enable_trace_input(ctx, trace_input, NULL /* prefix ... */, trace_output, trace_props); + } #endif - if (flb_bin_restarting == FLB_RELOAD_IN_PROGRESS) { - /* reload by using same config files/path */ - ret = flb_reload(ctx, cf_opts); - if (ret == 0) { - ctx = flb_context_get(); - flb_bin_restarting = FLB_RELOAD_IDLE; - } - else { - flb_bin_restarting = ret; - } - } - if (flb_bin_restarting == FLB_RELOAD_HALTED) { - sleep(1); - flb_bin_restarting = FLB_RELOAD_IDLE; + } + else { + flb_bin_restarting = ret; + } + break; + } + } } } From 28cb456cbb62223cc340a8164a76277bcc9cc75e Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Wed, 23 Apr 2025 16:56:40 -0400 Subject: [PATCH 04/15] http_server: reload: refactor to use context signals. Signed-off-by: Phillip Adair Stewart Whelan --- src/http_server/api/v2/reload.c | 38 ++++----------------------------- 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/src/http_server/api/v2/reload.c b/src/http_server/api/v2/reload.c index 2f8c947cbd9..e743d61135f 100644 --- a/src/http_server/api/v2/reload.c +++ b/src/http_server/api/v2/reload.c @@ -41,6 +41,7 @@ static void handle_reload_request(mk_request_t *request, struct flb_config *conf msgpack_packer mp_pck; msgpack_sbuffer mp_sbuf; int http_status = 200; + enum ctx_signal_type ctx_signal; /* initialize buffers */ msgpack_sbuffer_init(&mp_sbuf); @@ -50,7 +51,6 @@ static void handle_reload_request(mk_request_t *request, struct flb_config *conf msgpack_pack_str(&mp_pck, 6); msgpack_pack_str_body(&mp_pck, "reload", 6); -#ifdef FLB_SYSTEM_WINDOWS if (config->enable_hot_reload != FLB_TRUE) { msgpack_pack_str(&mp_pck, 11); msgpack_pack_str_body(&mp_pck, "not enabled", 11); @@ -67,37 +67,9 @@ static void handle_reload_request(mk_request_t *request, struct flb_config *conf http_status = 400; } else { - ret = GenerateConsoleCtrlEvent(1 /* CTRL_BREAK_EVENT_1 */, 0); - if (ret == 0) { - mk_http_status(request, 500); - mk_http_done(request); - return; - } - - msgpack_pack_str(&mp_pck, 4); - msgpack_pack_str_body(&mp_pck, "done", 4); - msgpack_pack_str(&mp_pck, 6); - msgpack_pack_str_body(&mp_pck, "status", 6); - msgpack_pack_int64(&mp_pck, ret); - } -#else - if (config->enable_hot_reload != FLB_TRUE) { - msgpack_pack_str(&mp_pck, 11); - msgpack_pack_str_body(&mp_pck, "not enabled", 11); - msgpack_pack_str(&mp_pck, 6); - msgpack_pack_str_body(&mp_pck, "status", 6); - msgpack_pack_int64(&mp_pck, -1); - } - else if (config->hot_reloading == FLB_TRUE) { - msgpack_pack_str(&mp_pck, 11); - msgpack_pack_str_body(&mp_pck, "in progress", 11); - msgpack_pack_str(&mp_pck, 6); - msgpack_pack_str_body(&mp_pck, "status", 6); - msgpack_pack_int64(&mp_pck, -2); - http_status = 400; - } - else { - ret = kill(getpid(), SIGHUP); + ctx_signal = FLB_CTX_SIGNAL_RELOAD; + ret = flb_pipe_w(config->ch_context_signal[1], &ctx_signal, + sizeof(enum ctx_signal_type)); if (ret != 0) { mk_http_status(request, 500); mk_http_done(request); @@ -111,8 +83,6 @@ static void handle_reload_request(mk_request_t *request, struct flb_config *conf msgpack_pack_int64(&mp_pck, ret); } -#endif - /* Export to JSON */ out_buf = flb_msgpack_raw_to_json_sds(mp_sbuf.data, mp_sbuf.size); msgpack_sbuffer_destroy(&mp_sbuf); From 66b464d6406a648bee9b6b8ecaee3274d3af5b51 Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Wed, 23 Apr 2025 16:56:59 -0400 Subject: [PATCH 05/15] in_calyptia_fleet: refactor to use context signals. Signed-off-by: Phillip Adair Stewart Whelan --- plugins/in_calyptia_fleet/in_calyptia_fleet.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/plugins/in_calyptia_fleet/in_calyptia_fleet.c b/plugins/in_calyptia_fleet/in_calyptia_fleet.c index 14033305f04..7ee09865d3e 100644 --- a/plugins/in_calyptia_fleet/in_calyptia_fleet.c +++ b/plugins/in_calyptia_fleet/in_calyptia_fleet.c @@ -455,6 +455,8 @@ static int exists_header_fleet_config(struct flb_in_calyptia_fleet_config *ctx) static void *do_reload(void *data) { struct reload_ctx *reload = (struct reload_ctx *)data; + enum ctx_signal_type ctx_signal; + int ret; if (reload == NULL) { return NULL; @@ -470,11 +472,16 @@ static void *do_reload(void *data) flb_free(reload); sleep(5); -#ifndef FLB_SYSTEM_WINDOWS - kill(getpid(), SIGHUP); -#else - GenerateConsoleCtrlEvent(1 /* CTRL_BREAK_EVENT_1 */, 0); -#endif + + ctx_signal = FLB_CTX_SIGNAL_RELOAD; + ret = flb_pipe_w(reload->flb->config->ch_context_signal[1], + &ctx_signal, + sizeof(enum ctx_signal_type)); + if (ret != 0) { + flb_error("unable to signal reload"); + return NULL; + } + return NULL; } From 12f9daf531df7222ce723838dfe621dd162045c7 Mon Sep 17 00:00:00 2001 From: Phillip Whelan Date: Wed, 23 Apr 2025 17:32:20 -0400 Subject: [PATCH 06/15] fluent-bit: refactor signal handlers to use context signals for shutdown and reload. Signed-off-by: Phillip Whelan --- src/fluent-bit.c | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/fluent-bit.c b/src/fluent-bit.c index b229d7ead45..8200f8281c4 100644 --- a/src/fluent-bit.c +++ b/src/fluent-bit.c @@ -71,6 +71,7 @@ extern void win32_started(void); flb_ctx_t *ctx; struct flb_config *config; +int ch_context_signal; volatile sig_atomic_t exit_signal = 0; volatile sig_atomic_t flb_bin_restarting = FLB_RELOAD_IDLE; @@ -541,7 +542,11 @@ static void flb_help_plugin(int rc, int format, static void flb_signal_handler_break_loop(int signal) { - exit_signal = signal; + enum ctx_signal_type ctx_signal; + + ctx_signal = FLB_CTX_SIGNAL_SHUTDOWN; + flb_pipe_w(ch_context_signal, &ctx_signal, + sizeof(enum ctx_signal_type)); } static void flb_signal_exit(int signal) @@ -603,6 +608,8 @@ static void flb_signal_handler_status_line(struct flb_cf *cf_opts) static void flb_signal_handler(int signal) { struct flb_cf *cf_opts = flb_cf_context_get(); + enum ctx_signal_type ctx_signal; + flb_signal_handler_status_line(cf_opts); switch (signal) { @@ -633,12 +640,10 @@ static void flb_signal_handler(int signal) break; #ifndef FLB_HAVE_STATIC_CONF case SIGHUP: - if (flb_bin_restarting == FLB_RELOAD_IDLE) { - flb_bin_restarting = FLB_RELOAD_IN_PROGRESS; - } - else { - flb_utils_error(FLB_ERR_RELOADING_IN_PROGRESS); - } + ctx_signal = FLB_CTX_SIGNAL_RELOAD; + flb_pipe_w(ch_context_signal, &ctx_signal, + sizeof(enum ctx_signal_type)); + break; #endif #endif @@ -661,6 +666,7 @@ void flb_console_handler_set_ctx(flb_ctx_t *ctx, struct flb_cf *cf_opts) static BOOL WINAPI flb_console_handler(DWORD evType) { struct flb_cf *cf_opts; + enum ctx_signal_type ctx_signal; switch(evType) { case 0 /* CTRL_C_EVENT_0 */: @@ -674,17 +680,9 @@ static BOOL WINAPI flb_console_handler(DWORD evType) handler_signal = 2; break; case 1 /* CTRL_BREAK_EVENT_1 */: - if (flb_bin_restarting == FLB_RELOAD_IDLE) { - flb_bin_restarting = FLB_RELOAD_IN_PROGRESS; - /* signal the main loop to execute reload. this is necessary since - * all signal handlers in win32 are executed on their own thread. - */ - handler_signal = 1; - flb_bin_restarting = FLB_RELOAD_IDLE; - } - else { - flb_utils_error(FLB_ERR_RELOADING_IN_PROGRESS); - } + ctx_signal = FLB_CTX_SIGNAL_SHUTDOWN; + flb_pipe_w(ch_context_signal, &ctx_signal, + sizeof(enum ctx_signal_type)); break; } return 1; @@ -1414,6 +1412,8 @@ int flb_main(int argc, char **argv) return ret; } + ch_context_signal = config->ch_context_signal[1]; + /* Store the current config format context from command line */ flb_cf_context_set(cf_opts); @@ -1456,13 +1456,12 @@ int flb_main(int argc, char **argv) ctx = flb_context_get(); flb_bin_restarting = FLB_RELOAD_IDLE; config = ctx->config; - + ch_context_signal = config->ch_context_signal[1]; #ifdef FLB_HAVE_CHUNK_TRACE if (trace_input != NULL) { enable_trace_input(ctx, trace_input, NULL /* prefix ... */, trace_output, trace_props); } #endif - } else { flb_bin_restarting = ret; From 70736d7704b6165ab3604450375c1bbbb35cf321 Mon Sep 17 00:00:00 2001 From: Phillip Whelan Date: Wed, 23 Apr 2025 17:37:33 -0400 Subject: [PATCH 07/15] engine: destroy channel and event loop for context signals. Signed-off-by: Phillip Whelan --- src/flb_engine.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/flb_engine.c b/src/flb_engine.c index 77aae7d2ff2..e0e662b3289 100644 --- a/src/flb_engine.c +++ b/src/flb_engine.c @@ -1215,6 +1215,15 @@ int flb_engine_shutdown(struct flb_config *config) flb_hs_destroy(config->http_ctx); } #endif + if (config->ctx_evl) { + mk_event_channel_destroy(config->ctx_evl, + config->ch_context_signal[0], + config->ch_context_signal[1], + &config->event_context_signal); + mk_event_loop_destroy(config->ctx_evl); + config->ctx_evl = NULL; + } + if (config->evl) { mk_event_channel_destroy(config->evl, config->ch_self_events[0], From ba31763be54aa6729bc59be6d2c24d98ec658c4f Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Thu, 8 May 2025 10:55:17 -0400 Subject: [PATCH 08/15] engine: refactor ctx_signal_type to use uin64_t instead of an enum. Signed-off-by: Phillip Adair Stewart Whelan --- include/fluent-bit/flb_config.h | 6 ++-- plugins/in_calyptia_fleet/in_calyptia_fleet.c | 5 ++-- src/flb_engine.c | 4 +-- src/fluent-bit.c | 30 +++++++++---------- src/http_server/api/v2/reload.c | 4 +-- 5 files changed, 22 insertions(+), 27 deletions(-) diff --git a/include/fluent-bit/flb_config.h b/include/fluent-bit/flb_config.h index 143326083f3..15e1f678ac3 100644 --- a/include/fluent-bit/flb_config.h +++ b/include/fluent-bit/flb_config.h @@ -54,10 +54,8 @@ #define FLB_CONTEXT_EV_SIGNAL (1 << 0) /* 1 */ -enum ctx_signal_type { - FLB_CTX_SIGNAL_RELOAD, - FLB_CTX_SIGNAL_SHUTDOWN, -}; +#define FLB_CTX_SIGNAL_RELOAD 1 +#define FLB_CTX_SIGNAL_SHUTDOWN 2 /* Main struct to hold the configuration of the runtime service */ struct flb_config { diff --git a/plugins/in_calyptia_fleet/in_calyptia_fleet.c b/plugins/in_calyptia_fleet/in_calyptia_fleet.c index 7ee09865d3e..4ba085afebf 100644 --- a/plugins/in_calyptia_fleet/in_calyptia_fleet.c +++ b/plugins/in_calyptia_fleet/in_calyptia_fleet.c @@ -455,7 +455,7 @@ static int exists_header_fleet_config(struct flb_in_calyptia_fleet_config *ctx) static void *do_reload(void *data) { struct reload_ctx *reload = (struct reload_ctx *)data; - enum ctx_signal_type ctx_signal; + uint64_t ctx_signal; int ret; if (reload == NULL) { @@ -475,8 +475,7 @@ static void *do_reload(void *data) ctx_signal = FLB_CTX_SIGNAL_RELOAD; ret = flb_pipe_w(reload->flb->config->ch_context_signal[1], - &ctx_signal, - sizeof(enum ctx_signal_type)); + &ctx_signal, sizeof(uint64_t)); if (ret != 0) { flb_error("unable to signal reload"); return NULL; diff --git a/src/flb_engine.c b/src/flb_engine.c index e0e662b3289..7fddba38c66 100644 --- a/src/flb_engine.c +++ b/src/flb_engine.c @@ -695,7 +695,7 @@ int flb_engine_start(struct flb_config *config) struct flb_sched *sched; struct flb_net_dns dns_ctx; struct flb_notification *notification; - enum ctx_signal_type ctx_signal; + uint64_t ctx_signal; /* Initialize the networking layer */ flb_net_lib_init(); @@ -1074,7 +1074,7 @@ int flb_engine_start(struct flb_config *config) ctx_signal = FLB_CTX_SIGNAL_SHUTDOWN; flb_pipe_w(config->ch_context_signal[1], &ctx_signal, - sizeof(enum ctx_signal_type)); + sizeof(uint64_t)); flb_engine_shutdown(config); config = NULL; diff --git a/src/fluent-bit.c b/src/fluent-bit.c index 8200f8281c4..f1457f145e1 100644 --- a/src/fluent-bit.c +++ b/src/fluent-bit.c @@ -542,11 +542,11 @@ static void flb_help_plugin(int rc, int format, static void flb_signal_handler_break_loop(int signal) { - enum ctx_signal_type ctx_signal; + uint64_t ctx_signal; ctx_signal = FLB_CTX_SIGNAL_SHUTDOWN; flb_pipe_w(ch_context_signal, &ctx_signal, - sizeof(enum ctx_signal_type)); + sizeof(uint64_t)); } static void flb_signal_exit(int signal) @@ -608,7 +608,7 @@ static void flb_signal_handler_status_line(struct flb_cf *cf_opts) static void flb_signal_handler(int signal) { struct flb_cf *cf_opts = flb_cf_context_get(); - enum ctx_signal_type ctx_signal; + uint64_t ctx_signal; flb_signal_handler_status_line(cf_opts); @@ -642,7 +642,7 @@ static void flb_signal_handler(int signal) case SIGHUP: ctx_signal = FLB_CTX_SIGNAL_RELOAD; flb_pipe_w(ch_context_signal, &ctx_signal, - sizeof(enum ctx_signal_type)); + sizeof(uint64_t)); break; #endif @@ -666,7 +666,7 @@ void flb_console_handler_set_ctx(flb_ctx_t *ctx, struct flb_cf *cf_opts) static BOOL WINAPI flb_console_handler(DWORD evType) { struct flb_cf *cf_opts; - enum ctx_signal_type ctx_signal; + uint64_t ctx_signal; switch(evType) { case 0 /* CTRL_C_EVENT_0 */: @@ -682,7 +682,7 @@ static BOOL WINAPI flb_console_handler(DWORD evType) case 1 /* CTRL_BREAK_EVENT_1 */: ctx_signal = FLB_CTX_SIGNAL_SHUTDOWN; flb_pipe_w(ch_context_signal, &ctx_signal, - sizeof(enum ctx_signal_type)); + sizeof(uint64_t)); break; } return 1; @@ -1002,7 +1002,7 @@ int flb_main(int argc, char **argv) struct flb_cf_group *group; struct mk_event *event; - enum ctx_signal_type ctx_signal; + uint64_t ctx_signal; int is_shutdown = 0; prog_name = argv[0]; @@ -1430,15 +1430,10 @@ int flb_main(int argc, char **argv) #endif while (exit_signal == 0 && is_shutdown == 0) { - mk_event_wait(config->ctx_evl); - mk_event_foreach(event, config->ctx_evl) { - if (exit_signal) { - break; - } - switch (event->type) { - case FLB_CONTEXT_EV_SIGNAL: - ret = flb_pipe_r(event->fd, &ctx_signal, - sizeof(enum ctx_signal_type)); + mk_event_wait(config->ch_evl); + mk_event_foreach(event, config->ch_evl) { + if (event->type == FLB_CONTEXT_EV_SIGNAL) { + ret = flb_pipe_r(event->fd, &ctx_signal, sizeof(uint64_t)); if (ret <= 0) { flb_error("unable to read context eventt"); continue; @@ -1468,6 +1463,9 @@ int flb_main(int argc, char **argv) } break; } + if (exit_signal || is_shutdown) { + break; + } } } } diff --git a/src/http_server/api/v2/reload.c b/src/http_server/api/v2/reload.c index e743d61135f..4106cdf578a 100644 --- a/src/http_server/api/v2/reload.c +++ b/src/http_server/api/v2/reload.c @@ -41,7 +41,7 @@ static void handle_reload_request(mk_request_t *request, struct flb_config *conf msgpack_packer mp_pck; msgpack_sbuffer mp_sbuf; int http_status = 200; - enum ctx_signal_type ctx_signal; + uint64_t ctx_signal; /* initialize buffers */ msgpack_sbuffer_init(&mp_sbuf); @@ -69,7 +69,7 @@ static void handle_reload_request(mk_request_t *request, struct flb_config *conf else { ctx_signal = FLB_CTX_SIGNAL_RELOAD; ret = flb_pipe_w(config->ch_context_signal[1], &ctx_signal, - sizeof(enum ctx_signal_type)); + sizeof(uint64_t)); if (ret != 0) { mk_http_status(request, 500); mk_http_done(request); From fd7e9f296764b52994215428324972a9edc248ac Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Fri, 9 May 2025 12:44:01 -0400 Subject: [PATCH 09/15] config: use helper functions to send config channel signals. Signed-off-by: Phillip Adair Stewart Whelan --- include/fluent-bit/flb_config.h | 10 ++++++++++ plugins/in_calyptia_fleet/in_calyptia_fleet.c | 5 +---- src/flb_engine.c | 6 +----- src/fluent-bit.c | 17 +++-------------- src/http_server/api/v2/reload.c | 5 +---- 5 files changed, 16 insertions(+), 27 deletions(-) diff --git a/include/fluent-bit/flb_config.h b/include/fluent-bit/flb_config.h index 15e1f678ac3..648019dc40c 100644 --- a/include/fluent-bit/flb_config.h +++ b/include/fluent-bit/flb_config.h @@ -323,6 +323,16 @@ struct flb_config { int dry_run; }; +static inline int flb_config_signal_channel_send(uint64_t channel, uint64_t signal_type) +{ + return flb_pipe_w(channel, &signal_type, sizeof(uint64_t)); +} + +static inline int flb_config_signal_send(struct flb_config *config, uint64_t signal_type) +{ + return flb_pipe_w(config->ch_context_signal[1], &signal_type, sizeof(uint64_t)); +} + #define FLB_CONFIG_LOG_LEVEL(c) (c->log->level) struct flb_config *flb_config_init(); diff --git a/plugins/in_calyptia_fleet/in_calyptia_fleet.c b/plugins/in_calyptia_fleet/in_calyptia_fleet.c index 4ba085afebf..c6d5be1af8d 100644 --- a/plugins/in_calyptia_fleet/in_calyptia_fleet.c +++ b/plugins/in_calyptia_fleet/in_calyptia_fleet.c @@ -455,7 +455,6 @@ static int exists_header_fleet_config(struct flb_in_calyptia_fleet_config *ctx) static void *do_reload(void *data) { struct reload_ctx *reload = (struct reload_ctx *)data; - uint64_t ctx_signal; int ret; if (reload == NULL) { @@ -473,9 +472,7 @@ static void *do_reload(void *data) flb_free(reload); sleep(5); - ctx_signal = FLB_CTX_SIGNAL_RELOAD; - ret = flb_pipe_w(reload->flb->config->ch_context_signal[1], - &ctx_signal, sizeof(uint64_t)); + ret = flb_config_signal_send(reload->flb->config, FLB_CTX_SIGNAL_RELOAD); if (ret != 0) { flb_error("unable to signal reload"); return NULL; diff --git a/src/flb_engine.c b/src/flb_engine.c index 7fddba38c66..ba5a5821961 100644 --- a/src/flb_engine.c +++ b/src/flb_engine.c @@ -695,7 +695,6 @@ int flb_engine_start(struct flb_config *config) struct flb_sched *sched; struct flb_net_dns dns_ctx; struct flb_notification *notification; - uint64_t ctx_signal; /* Initialize the networking layer */ flb_net_lib_init(); @@ -1072,10 +1071,7 @@ int flb_engine_start(struct flb_config *config) ret); ret = config->exit_status_code; - ctx_signal = FLB_CTX_SIGNAL_SHUTDOWN; - flb_pipe_w(config->ch_context_signal[1], &ctx_signal, - sizeof(uint64_t)); - + flb_config_signal_send(config, FLB_CTX_SIGNAL_SHUTDOWN); flb_engine_shutdown(config); config = NULL; diff --git a/src/fluent-bit.c b/src/fluent-bit.c index f1457f145e1..ef0eb870e58 100644 --- a/src/fluent-bit.c +++ b/src/fluent-bit.c @@ -542,11 +542,7 @@ static void flb_help_plugin(int rc, int format, static void flb_signal_handler_break_loop(int signal) { - uint64_t ctx_signal; - - ctx_signal = FLB_CTX_SIGNAL_SHUTDOWN; - flb_pipe_w(ch_context_signal, &ctx_signal, - sizeof(uint64_t)); + flb_config_signal_send(config, FLB_CTX_SIGNAL_SHUTDOWN); } static void flb_signal_exit(int signal) @@ -608,7 +604,6 @@ static void flb_signal_handler_status_line(struct flb_cf *cf_opts) static void flb_signal_handler(int signal) { struct flb_cf *cf_opts = flb_cf_context_get(); - uint64_t ctx_signal; flb_signal_handler_status_line(cf_opts); @@ -640,10 +635,7 @@ static void flb_signal_handler(int signal) break; #ifndef FLB_HAVE_STATIC_CONF case SIGHUP: - ctx_signal = FLB_CTX_SIGNAL_RELOAD; - flb_pipe_w(ch_context_signal, &ctx_signal, - sizeof(uint64_t)); - + flb_config_signal_channel_send(ch_context_signal, FLB_CTX_SIGNAL_RELOAD); break; #endif #endif @@ -666,7 +658,6 @@ void flb_console_handler_set_ctx(flb_ctx_t *ctx, struct flb_cf *cf_opts) static BOOL WINAPI flb_console_handler(DWORD evType) { struct flb_cf *cf_opts; - uint64_t ctx_signal; switch(evType) { case 0 /* CTRL_C_EVENT_0 */: @@ -680,9 +671,7 @@ static BOOL WINAPI flb_console_handler(DWORD evType) handler_signal = 2; break; case 1 /* CTRL_BREAK_EVENT_1 */: - ctx_signal = FLB_CTX_SIGNAL_SHUTDOWN; - flb_pipe_w(ch_context_signal, &ctx_signal, - sizeof(uint64_t)); + flb_config_signal_channel_send(ch_context_signal, FLB_CTX_SIGNAL_SHUTDOWN); break; } return 1; diff --git a/src/http_server/api/v2/reload.c b/src/http_server/api/v2/reload.c index 4106cdf578a..1b8bfdcec7b 100644 --- a/src/http_server/api/v2/reload.c +++ b/src/http_server/api/v2/reload.c @@ -41,7 +41,6 @@ static void handle_reload_request(mk_request_t *request, struct flb_config *conf msgpack_packer mp_pck; msgpack_sbuffer mp_sbuf; int http_status = 200; - uint64_t ctx_signal; /* initialize buffers */ msgpack_sbuffer_init(&mp_sbuf); @@ -67,9 +66,7 @@ static void handle_reload_request(mk_request_t *request, struct flb_config *conf http_status = 400; } else { - ctx_signal = FLB_CTX_SIGNAL_RELOAD; - ret = flb_pipe_w(config->ch_context_signal[1], &ctx_signal, - sizeof(uint64_t)); + ret = flb_config_signal_send(config, FLB_CTX_SIGNAL_RELOAD); if (ret != 0) { mk_http_status(request, 500); mk_http_done(request); From 52c0a6987248078403db19f7ea86c7e0b8200d79 Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Fri, 9 May 2025 12:46:37 -0400 Subject: [PATCH 10/15] engine: define constant for config context event loop. Signed-off-by: Phillip Adair Stewart Whelan --- include/fluent-bit/flb_config.h | 1 + src/flb_engine.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/include/fluent-bit/flb_config.h b/include/fluent-bit/flb_config.h index 648019dc40c..4556ab06bf9 100644 --- a/include/fluent-bit/flb_config.h +++ b/include/fluent-bit/flb_config.h @@ -41,6 +41,7 @@ #define FLB_CONFIG_DEFAULT_TASK_MAP_SIZE 2048 #define FLB_CONFIG_DEFAULT_TASK_MAP_SIZE_LIMIT 16384 #define FLB_CONFIG_DEFAULT_TASK_MAP_SIZE_GROWTH_SiZE 256 +#define FLB_CONFIG_EVENT_LOOP_SIZE 8 /* The reason behind FLB_CONFIG_DEFAULT_TASK_MAP_SIZE_LIMIT being set to 16384 * is that this is largest unsigned number expressable with 14 bits which is diff --git a/src/flb_engine.c b/src/flb_engine.c index ba5a5821961..919211852c8 100644 --- a/src/flb_engine.c +++ b/src/flb_engine.c @@ -724,7 +724,7 @@ int flb_engine_start(struct flb_config *config) * */ /* Create the event loop and set it in the global configuration */ - config->ctx_evl = mk_event_loop_create(8); + config->ctx_evl = mk_event_loop_create(FLB_CONFIG_EVENT_LOOP_SIZE); if (!config->ctx_evl) { fprintf(stderr, "[log] could not create context event loop\n"); return -1; From 36cf66a2dbb7ed4f2df3f1d786c28a9f687384dd Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Fri, 9 May 2025 12:48:20 -0400 Subject: [PATCH 11/15] engine: compare explicitly against NULL before deallocationg config context loop. Signed-off-by: Phillip Adair Stewart Whelan --- src/flb_engine.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/flb_engine.c b/src/flb_engine.c index 919211852c8..5c54135fb23 100644 --- a/src/flb_engine.c +++ b/src/flb_engine.c @@ -1211,7 +1211,7 @@ int flb_engine_shutdown(struct flb_config *config) flb_hs_destroy(config->http_ctx); } #endif - if (config->ctx_evl) { + if (config->ctx_evl != NULL) { mk_event_channel_destroy(config->ctx_evl, config->ch_context_signal[0], config->ch_context_signal[1], From 94deb770778788ce9255b4c1f1c73ef2af128b81 Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Fri, 9 May 2025 12:53:18 -0400 Subject: [PATCH 12/15] main: redefine ch_context_signal as flb_pipefd_t. Signed-off-by: Phillip Adair Stewart Whelan --- include/fluent-bit/flb_config.h | 2 +- src/fluent-bit.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/fluent-bit/flb_config.h b/include/fluent-bit/flb_config.h index 4556ab06bf9..7ff66eaf2f8 100644 --- a/include/fluent-bit/flb_config.h +++ b/include/fluent-bit/flb_config.h @@ -324,7 +324,7 @@ struct flb_config { int dry_run; }; -static inline int flb_config_signal_channel_send(uint64_t channel, uint64_t signal_type) +static inline int flb_config_signal_channel_send(flb_pipefd_t channel, uint64_t signal_type) { return flb_pipe_w(channel, &signal_type, sizeof(uint64_t)); } diff --git a/src/fluent-bit.c b/src/fluent-bit.c index ef0eb870e58..a868aa863d3 100644 --- a/src/fluent-bit.c +++ b/src/fluent-bit.c @@ -71,7 +71,7 @@ extern void win32_started(void); flb_ctx_t *ctx; struct flb_config *config; -int ch_context_signal; +flb_pipefd_t ch_context_signal; volatile sig_atomic_t exit_signal = 0; volatile sig_atomic_t flb_bin_restarting = FLB_RELOAD_IDLE; From 2641693370bb5fe41aed012eed5e0ae1f091728e Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Fri, 9 May 2025 13:04:03 -0400 Subject: [PATCH 13/15] main: use FLB_TRUE and FLB_FALSE with is_shutdown. Signed-off-by: Phillip Adair Stewart Whelan --- src/fluent-bit.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/fluent-bit.c b/src/fluent-bit.c index a868aa863d3..e05211ad95a 100644 --- a/src/fluent-bit.c +++ b/src/fluent-bit.c @@ -992,7 +992,7 @@ int flb_main(int argc, char **argv) struct mk_event *event; uint64_t ctx_signal; - int is_shutdown = 0; + int is_shutdown = FLB_FALSE; prog_name = argv[0]; @@ -1418,7 +1418,7 @@ int flb_main(int argc, char **argv) } #endif - while (exit_signal == 0 && is_shutdown == 0) { + while (exit_signal == FLB_FALSE && is_shutdown == FLB_FALSE) { mk_event_wait(config->ch_evl); mk_event_foreach(event, config->ch_evl) { if (event->type == FLB_CONTEXT_EV_SIGNAL) { @@ -1430,7 +1430,7 @@ int flb_main(int argc, char **argv) switch(ctx_signal) { case FLB_CTX_SIGNAL_SHUTDOWN: - is_shutdown = 1; + is_shutdown = FLB_TRUE; break; case FLB_CTX_SIGNAL_RELOAD: /* reload by using same config files/path */ @@ -1452,7 +1452,7 @@ int flb_main(int argc, char **argv) } break; } - if (exit_signal || is_shutdown) { + if (exit_signal == FLB_TRUE || is_shutdown == FLB_TRUE) { break; } } From d498ed45565988a9e22b09c473b78cac6a4906fc Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Fri, 9 May 2025 14:57:29 -0400 Subject: [PATCH 14/15] main: set flb_bin_restarting to FLB_RELOAD_ABORTED upon error. Signed-off-by: Phillip Adair Stewart Whelan --- src/fluent-bit.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fluent-bit.c b/src/fluent-bit.c index e05211ad95a..72990deae2e 100644 --- a/src/fluent-bit.c +++ b/src/fluent-bit.c @@ -1448,7 +1448,7 @@ int flb_main(int argc, char **argv) #endif } else { - flb_bin_restarting = ret; + flb_bin_restarting = FLB_RELOAD_ABORTED; } break; } From e4b60e67c08214fbe20a7af5f9b8412b3366c34f Mon Sep 17 00:00:00 2001 From: Phillip Adair Stewart Whelan Date: Fri, 9 May 2025 14:57:56 -0400 Subject: [PATCH 15/15] main: add is_reload flag to espace event loop upon reload. Signed-off-by: Phillip Adair Stewart Whelan --- src/fluent-bit.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/fluent-bit.c b/src/fluent-bit.c index 72990deae2e..b75efb826d7 100644 --- a/src/fluent-bit.c +++ b/src/fluent-bit.c @@ -993,6 +993,7 @@ int flb_main(int argc, char **argv) struct mk_event *event; uint64_t ctx_signal; int is_shutdown = FLB_FALSE; + int is_reload = FLB_FALSE; prog_name = argv[0]; @@ -1452,7 +1453,9 @@ int flb_main(int argc, char **argv) } break; } - if (exit_signal == FLB_TRUE || is_shutdown == FLB_TRUE) { + if (exit_signal == FLB_TRUE || is_shutdown == FLB_TRUE || is_reload == FLB_TRUE) { + // reset is_reload flag before re-entering the loop. + is_reload = FLB_FALSE; break; } }