From: sergey.kitov Date: Thu, 16 Dec 2021 09:49:24 +0000 (+0200) Subject: lib-master: Add process_shutdown_filter setting X-Git-Tag: 2.3.19~108 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a97162ccc68659699933b440180b933e5fad310e;p=thirdparty%2Fdovecot%2Fcore.git lib-master: Add process_shutdown_filter setting --- diff --git a/src/lib-master/master-service-private.h b/src/lib-master/master-service-private.h index a23a2cc1e1..429f2eb713 100644 --- a/src/lib-master/master-service-private.h +++ b/src/lib-master/master-service-private.h @@ -73,6 +73,7 @@ struct master_service { struct stats_client *stats_client; struct master_service_haproxy_conn *haproxy_conns; + struct event_filter *process_shutdown_filter; bool killed:1; bool stopping:1; diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 87845a4352..f0f0797f43 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -46,6 +46,7 @@ static const struct setting_define master_service_setting_defines[] = { DEF(STR, log_timestamp), DEF(STR, log_debug), DEF(STR, log_core_filter), + DEF(STR, process_shutdown_filter), DEF(STR, syslog_facility), DEF(STR, import_environment), DEF(STR, stats_writer_socket_path), @@ -83,6 +84,7 @@ static const struct master_service_settings master_service_default_settings = { .log_timestamp = DEFAULT_FAILURE_STAMP_FORMAT, .log_debug = "", .log_core_filter = "", + .process_shutdown_filter = "", .syslog_facility = "mail", .import_environment = "TZ CORE_OUTOFMEM CORE_ERROR" ENV_SYSTEMD ENV_GDB, .stats_writer_socket_path = "stats-writer", @@ -132,6 +134,12 @@ setting_filter_parse(const char *set_name, const char *set_value, return TRUE; } +static void +master_service_set_process_shutdown_filter_wrapper(struct event_filter *filter) +{ + master_service_set_process_shutdown_filter(master_service, filter); +} + static bool master_service_settings_check(void *_set, pool_t pool ATTR_UNUSED, const char **error_r) @@ -155,6 +163,11 @@ master_service_settings_check(void *_set, pool_t pool ATTR_UNUSED, if (!setting_filter_parse("log_core_filter", set->log_core_filter, event_set_global_core_log_filter, error_r)) return FALSE; + if (!setting_filter_parse("process_shutdown_filter", + set->process_shutdown_filter, + master_service_set_process_shutdown_filter_wrapper, + error_r)) + return FALSE; return TRUE; } /* */ diff --git a/src/lib-master/master-service-settings.h b/src/lib-master/master-service-settings.h index fc396f9d49..eceec0c6e2 100644 --- a/src/lib-master/master-service-settings.h +++ b/src/lib-master/master-service-settings.h @@ -19,6 +19,7 @@ struct master_service_settings { const char *log_timestamp; const char *log_debug; const char *log_core_filter; + const char *process_shutdown_filter; const char *syslog_facility; const char *import_environment; const char *stats_writer_socket_path; diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index fe48127659..5adc8be922 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -132,7 +132,7 @@ sig_state_changed(const siginfo_t *si ATTR_UNUSED, void *context) static bool master_service_event_callback(struct event *event, enum event_callback_type type, - struct failure_context *ctx ATTR_UNUSED, + struct failure_context *ctx, const char *fmt ATTR_UNUSED, va_list args ATTR_UNUSED) { @@ -142,6 +142,12 @@ master_service_event_callback(struct event *event, inherit the category from them. */ event_add_category(event, &master_service_category); } + /* This callback may be called while still in master_service_init(). + In that case master_service is NULL. */ + if (type == EVENT_CALLBACK_TYPE_SEND && master_service != NULL && + event_filter_match(master_service->process_shutdown_filter, + event, ctx)) + master_service_stop_new_connections(master_service); return TRUE; } @@ -1526,3 +1532,16 @@ bool version_string_verify_full(const char *line, const char *service_name, } T_END; return ret; } + +void master_service_set_process_shutdown_filter(struct master_service *service, + struct event_filter *filter) +{ + master_service_unset_process_shutdown_filter(service); + service->process_shutdown_filter = filter; + event_filter_ref(service->process_shutdown_filter); +} + +void master_service_unset_process_shutdown_filter(struct master_service *service) +{ + event_filter_unref(&service->process_shutdown_filter); +} diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index 0ee35b3246..bd32ad0cc6 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -253,4 +253,10 @@ bool version_string_verify_full(const char *line, const char *service_name, unsigned major_version, unsigned int *minor_version_r); +/* Sets process shutdown filter */ +void master_service_set_process_shutdown_filter(struct master_service *service, + struct event_filter *filter); +/* Unsets process shutdown filter, if it exists */ +void master_service_unset_process_shutdown_filter(struct master_service *service); + #endif