From d6631a9acd1df187b6d36f67c2c3aaa2a73b87d6 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Thu, 6 Mar 2025 20:08:16 +0200 Subject: [PATCH] lmtp: Add and use lmtp_pre_mail_settings It only has mail_max_lock_timeout setting. This is much efficient to lookup than the full large mail_storage_settings. --- src/lmtp/lmtp-local.c | 12 ++++++------ src/lmtp/lmtp-settings.c | 24 ++++++++++++++++++++++++ src/lmtp/lmtp-settings.h | 6 ++++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/lmtp/lmtp-local.c b/src/lmtp/lmtp-local.c index 4d827ec932..6f386477e9 100644 --- a/src/lmtp/lmtp-local.c +++ b/src/lmtp/lmtp-local.c @@ -431,7 +431,7 @@ lmtp_local_deliver(struct lmtp_local *local, struct lmtp_local_deliver_context lldctx; struct mail_user *rcpt_user; const struct mail_storage_service_input *input; - const struct mail_storage_settings *mail_set; + const struct lmtp_pre_mail_settings *pre_mail_set; struct smtp_proxy_data proxy_data; struct mail_namespace *ns; const char *error, *username; @@ -441,9 +441,9 @@ lmtp_local_deliver(struct lmtp_local *local, username = t_strdup(input->username); if (settings_get(mail_storage_service_user_get_event(service_user), - &mail_storage_setting_parser_info, + &lmtp_pre_mail_setting_parser_info, SETTINGS_GET_FLAG_NO_EXPAND, - &mail_set, &error) < 0) { + &pre_mail_set, &error) < 0) { e_error(rcpt->event, "%s", error); smtp_server_recipient_reply(rcpt, 451, "4.3.0", "Temporary internal error"); @@ -453,8 +453,8 @@ lmtp_local_deliver(struct lmtp_local *local, smtp_server_connection_get_proxy_data (client->conn, &proxy_data); if (proxy_data.timeout_secs > 0 && - (mail_set->mail_max_lock_timeout == 0 || - mail_set->mail_max_lock_timeout > proxy_data.timeout_secs)) { + (pre_mail_set->mail_max_lock_timeout == 0 || + pre_mail_set->mail_max_lock_timeout > proxy_data.timeout_secs)) { /* set lock timeout waits to be less than when proxy has advertised that it's going to timeout the connection. this avoids duplicate deliveries in case the delivery @@ -467,7 +467,7 @@ lmtp_local_deliver(struct lmtp_local *local, settings_override(set_instance, "*/mail_max_lock_timeout", value, SETTINGS_OVERRIDE_TYPE_CODE); } - settings_free(mail_set); + settings_free(pre_mail_set); i_zero(&lldctx); lldctx.session_id = lrcpt->session_id; diff --git a/src/lmtp/lmtp-settings.c b/src/lmtp/lmtp-settings.c index ea7f3a5a08..7fe9a74db7 100644 --- a/src/lmtp/lmtp-settings.c +++ b/src/lmtp/lmtp-settings.c @@ -55,6 +55,30 @@ const struct setting_keyvalue lmtp_service_settings_defaults[] = { { NULL, NULL } }; +#undef DEF +#define DEF(type, name) \ + SETTING_DEFINE_STRUCT_##type(#name, name, struct lmtp_pre_mail_settings) + +static const struct setting_define lmtp_pre_mail_setting_defines[] = { + DEF(TIME, mail_max_lock_timeout), + + SETTING_DEFINE_LIST_END +}; + +static const struct lmtp_pre_mail_settings lmtp_pre_mail_default_settings = { + .mail_max_lock_timeout = 0, +}; + +const struct setting_parser_info lmtp_pre_mail_setting_parser_info = { + .name = "lmtp_pre_mail", + + .defines = lmtp_pre_mail_setting_defines, + .defaults = &lmtp_pre_mail_default_settings, + + .struct_size = sizeof(struct lmtp_pre_mail_settings), + .pool_offset1 = 1 + offsetof(struct lmtp_pre_mail_settings, pool), +}; + #undef DEF #define DEF(type, name) \ SETTING_DEFINE_STRUCT_##type(#name, name, struct lmtp_settings) diff --git a/src/lmtp/lmtp-settings.h b/src/lmtp/lmtp-settings.h index 7e79941692..b6ab546a60 100644 --- a/src/lmtp/lmtp-settings.h +++ b/src/lmtp/lmtp-settings.h @@ -18,6 +18,11 @@ enum lmtp_client_workarounds { }; /* */ +struct lmtp_pre_mail_settings { + pool_t pool; + unsigned int mail_max_lock_timeout; +}; + struct lmtp_settings { pool_t pool; bool lmtp_proxy; @@ -44,6 +49,7 @@ struct lmtp_settings { enum lmtp_client_workarounds parsed_workarounds; }; +extern const struct setting_parser_info lmtp_pre_mail_setting_parser_info; extern const struct setting_parser_info lmtp_setting_parser_info; #endif -- 2.47.3