]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-server-recipient - Create transaction event early if there is no trans...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Mon, 9 Nov 2020 11:29:29 +0000 (12:29 +0100)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Mon, 24 May 2021 11:59:03 +0000 (11:59 +0000)
This allows having a parent for the recipient event once the recipient is
created, which can precede the creation of the transaction.

src/lib-smtp/smtp-server-connection.c
src/lib-smtp/smtp-server-private.h
src/lib-smtp/smtp-server-recipient.c
src/lib-smtp/smtp-server-transaction.c

index bdca2d0717712ce133c2cab1d2122a334da3d208..819dfb16124c1e8057c7d4754bd3cd0acd5f6311 100644 (file)
@@ -1115,6 +1115,7 @@ bool smtp_server_connection_unref(struct smtp_server_connection **_conn)
 
        i_free(conn->helo_domain);
        i_free(conn->username);
+       event_unref(&conn->next_trans_event);
        pool_unref(&conn->pool);
        return FALSE;
 }
index dce2be499257c8d7ba8d74be4d524321de634ff3..5028866f451ccffcac0f13d7d8ae8e661fa98cdc 100644 (file)
@@ -144,7 +144,7 @@ struct smtp_server_connection {
        struct smtp_server *server;
        pool_t pool;
        int refcount;
-       struct event *event;
+       struct event *event, *next_trans_event;
 
        struct smtp_server_settings set;
 
index d12aa39c3fc8cf053810665442148018d3b42921..536f3d2c9cfd80f50fe9b8f188b6c9bdd727f3c9 100644 (file)
@@ -30,14 +30,21 @@ smtp_server_recipient_create_event(struct smtp_server_recipient_private *prcpt)
                return;
 
        if (conn->state.trans == NULL) {
-               /* Use connection event directly if there is no transaction */
-               rcpt->event = event_create(conn->event);
+               /* Create event for the transaction early. */
+               if (conn->next_trans_event == NULL) {
+                       conn->next_trans_event = event_create(conn->event);
+                       event_set_append_log_prefix(conn->next_trans_event,
+                                                   "trans: ");
+               }
+               rcpt->event = event_create(conn->next_trans_event);
        } else {
-               /* Use transaction event, but drop its log prefix so that the
-                  connection event prefix remains. */
+               /* Use existing transaction event. */
                rcpt->event = event_create(conn->state.trans->event);
-               event_drop_parent_log_prefixes(rcpt->event, 1);
        }
+       /* Drop transaction log prefix so that the connection event prefix
+          remains. */
+       event_drop_parent_log_prefixes(rcpt->event, 1);
+
        smtp_server_recipient_update_event(prcpt);
 }
 
@@ -58,6 +65,8 @@ smtp_server_recipient_create(struct smtp_server_cmd_ctx *cmd,
        prcpt->rcpt.path = smtp_address_clone(pool, rcpt_to);
        smtp_params_rcpt_copy(pool, &prcpt->rcpt.params, params);
 
+       smtp_server_recipient_create_event(prcpt);
+
        return &prcpt->rcpt;
 }
 
index d51a635d7f398a3c847fb6cce064976bfa4d5dca..d91775f1477d217d5fe714450b44d6721b5240d9 100644 (file)
@@ -55,7 +55,12 @@ smtp_server_transaction_create(struct smtp_server_connection *conn,
        smtp_params_mail_copy(pool, &trans->params, &mail_data->params);
        trans->timestamp = mail_data->timestamp;
 
-       trans->event = event_create(conn->event);
+       if (conn->next_trans_event == NULL)
+               trans->event = event_create(conn->event);
+       else {
+               trans->event = conn->next_trans_event;
+               conn->next_trans_event = NULL;
+       }
        smtp_server_transaction_update_event(trans);
 
        struct event_passthrough *e =