From: Stephan Bosch Date: Mon, 9 Nov 2020 11:29:29 +0000 (+0100) Subject: lib-smtp: smtp-server-recipient - Create transaction event early if there is no trans... X-Git-Tag: 2.3.16~110 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b09ec34569a00cd98ef29afedbcab8d7e6867987;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-server-recipient - Create transaction event early if there is no transaction yet. This allows having a parent for the recipient event once the recipient is created, which can precede the creation of the transaction. --- diff --git a/src/lib-smtp/smtp-server-connection.c b/src/lib-smtp/smtp-server-connection.c index bdca2d0717..819dfb1612 100644 --- a/src/lib-smtp/smtp-server-connection.c +++ b/src/lib-smtp/smtp-server-connection.c @@ -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; } diff --git a/src/lib-smtp/smtp-server-private.h b/src/lib-smtp/smtp-server-private.h index dce2be4992..5028866f45 100644 --- a/src/lib-smtp/smtp-server-private.h +++ b/src/lib-smtp/smtp-server-private.h @@ -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; diff --git a/src/lib-smtp/smtp-server-recipient.c b/src/lib-smtp/smtp-server-recipient.c index d12aa39c3f..536f3d2c9c 100644 --- a/src/lib-smtp/smtp-server-recipient.c +++ b/src/lib-smtp/smtp-server-recipient.c @@ -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; } diff --git a/src/lib-smtp/smtp-server-transaction.c b/src/lib-smtp/smtp-server-transaction.c index d51a635d7f..d91775f147 100644 --- a/src/lib-smtp/smtp-server-transaction.c +++ b/src/lib-smtp/smtp-server-transaction.c @@ -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 =