]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
global: Send connection GUIDs to anvil
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Sun, 12 Dec 2021 23:26:21 +0000 (01:26 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Tue, 8 Feb 2022 09:48:24 +0000 (10:48 +0100)
src/imap-hibernate/imap-client.c
src/imap-hibernate/imap-client.h
src/imap/imap-client.c
src/imap/imap-client.h
src/lib-master/master-service.c
src/lib-master/master-service.h
src/lmtp/lmtp-local.c
src/pop3/pop3-client.c
src/pop3/pop3-client.h
src/submission/submission-client.c
src/submission/submission-client.h

index 8ae59240dfcdb0f6ae96a6ed3c3b5f09100abd0c..a2a49a0f1bba9657a05d472bd48414ebb574f768 100644 (file)
@@ -635,7 +635,8 @@ imap_client_create(int fd, const struct imap_client_state *state)
                .service_name = "imap",
                .ip = client->state.remote_ip,
        };
-       if (master_service_anvil_connect(master_service, &anvil_session))
+       if (master_service_anvil_connect(master_service, &anvil_session,
+                                        client->state.anvil_conn_guid))
                client->state.anvil_sent = TRUE;
 
        p_array_init(&client->notifys, pool, 2);
@@ -683,7 +684,8 @@ void imap_client_destroy(struct imap_client **_client, const char *reason)
                        .service_name = "imap",
                        .ip = client->state.remote_ip,
                };
-               master_service_anvil_disconnect(master_service, &anvil_session);
+               master_service_anvil_disconnect(master_service, &anvil_session,
+                                               client->state.anvil_conn_guid);
        }
 
        if (client->master_conn != NULL)
index b6bb0e64699230d1b294a7b1c365829e667e1f3e..185da7e2435011c04abe34bc50e97f22936dbbff 100644 (file)
@@ -22,6 +22,7 @@ struct imap_client_state {
        const unsigned char *state;
        size_t state_size;
 
+       guid_128_t anvil_conn_guid;
        unsigned int imap_idle_notify_interval;
        bool idle_cmd;
        bool have_notify_fd;
index d842d6c7653d62cead70bc204aee06083c2abb57..f3f7022026d6c563b6ca01a76d45f1f0fe46f8dd 100644 (file)
@@ -204,7 +204,8 @@ struct client *client_create(int fd_in, int fd_out,
 
        struct master_service_anvil_session anvil_session;
        mail_user_get_anvil_session(client->user, &anvil_session);
-       if (master_service_anvil_connect(master_service, &anvil_session))
+       if (master_service_anvil_connect(master_service, &anvil_session,
+                                        client->anvil_conn_guid))
                client->anvil_sent = TRUE;
 
        imap_client_count++;
@@ -492,7 +493,8 @@ static void client_default_destroy(struct client *client, const char *reason)
        if (client->anvil_sent) {
                struct master_service_anvil_session anvil_session;
                mail_user_get_anvil_session(client->user, &anvil_session);
-               master_service_anvil_disconnect(master_service, &anvil_session);
+               master_service_anvil_disconnect(master_service, &anvil_session,
+                                               client->anvil_conn_guid);
        }
 
        if (client->free_parser != NULL)
index a307955f7de20714af2afedba254cc513be99a6c..19c0db8cce3fa831506b1c0e1d7653aacc66f771 100644 (file)
@@ -164,6 +164,7 @@ struct client {
        struct istream *input;
        struct ostream *output;
        struct timeout *to_idle, *to_idle_output, *to_delayed_input;
+       guid_128_t anvil_conn_guid;
 
        pool_t pool;
        struct mail_storage_service_user *service_user;
index fa1ba5d3e42c255627752486f9ae43214a4ffeb3..2baa1783df6c6cd13a5b819717ed8f3afac139f8 100644 (file)
@@ -961,21 +961,29 @@ master_service_anvil_session_to_cmd(string_t *cmd,
 }
 
 bool master_service_anvil_connect(struct master_service *service,
-       const struct master_service_anvil_session *session)
+       const struct master_service_anvil_session *session,
+       guid_128_t conn_guid_r)
 {
+       guid_128_generate(conn_guid_r);
+
        string_t *cmd = t_str_new(128);
        str_append(cmd, "CONNECT\t");
        master_service_anvil_session_to_cmd(cmd, session);
+       str_append_c(cmd, '\t');
+       str_append(cmd, guid_128_to_string(conn_guid_r));
        str_append_c(cmd, '\n');
        return master_service_anvil_send(service, str_c(cmd));
 }
 
 void master_service_anvil_disconnect(struct master_service *service,
-       const struct master_service_anvil_session *session)
+       const struct master_service_anvil_session *session,
+       const guid_128_t conn_guid)
 {
        string_t *cmd = t_str_new(128);
        str_append(cmd, "DISCONNECT\t");
        master_service_anvil_session_to_cmd(cmd, session);
+       str_append_c(cmd, '\t');
+       str_append(cmd, guid_128_to_string(conn_guid));
        str_append_c(cmd, '\n');
        (void)master_service_anvil_send(service, str_c(cmd));
 }
index 4c065bb91f455a7095c2afc374cb8243d4366828..2afa7fbb3214b76affc818366a37749cefb56d9c 100644 (file)
@@ -2,6 +2,7 @@
 #define MASTER_SERVICE_H
 
 #include "net.h"
+#include "guid.h"
 
 #include <unistd.h> /* for getopt() opt* variables */
 #include <stdio.h> /* for getopt() opt* variables in Solaris */
@@ -232,12 +233,15 @@ bool master_service_is_killed(struct master_service *service);
 bool master_service_is_master_stopped(struct master_service *service);
 
 /* Send CONNECT command to anvil process, if it's still connected.
-   Returns TRUE if it was successfully sent. */
+   Returns TRUE and connection GUID if it was successfully sent. */
 bool master_service_anvil_connect(struct master_service *service,
-       const struct master_service_anvil_session *session);
-/* Send DISCONNECT command to anvil process, if it's still connected. */
+       const struct master_service_anvil_session *session,
+       guid_128_t conn_guid_r);
+/* Send DISCONNECT command to anvil process, if it's still connected.
+   The conn_guid must match the guid returned by _connect(). */
 void master_service_anvil_disconnect(struct master_service *service,
-       const struct master_service_anvil_session *session);
+       const struct master_service_anvil_session *session,
+       const guid_128_t conn_guid);
 /* Call to accept the client connection. Otherwise the connection is closed. */
 void master_service_client_connection_accept(struct master_service_connection *conn);
 /* Used to create "extra client connections" outside the common accept()
index 61de1f6b82934d2f1134e59356dd0953f6202419..dd2c1443b51f1ca0a2e4852b7ec67b383484d93a 100644 (file)
@@ -30,6 +30,7 @@ struct lmtp_local_recipient {
 
        struct mail_storage_service_user *service_user;
        struct anvil_query *anvil_query;
+       guid_128_t anvil_conn_guid;
 
        struct lmtp_local_recipient *duplicate;
 
@@ -101,7 +102,8 @@ lmtp_local_rcpt_anvil_disconnect(struct lmtp_local_recipient *llrcpt)
                .username = input->username,
                .service_name = master_service_get_name(master_service),
        };
-       master_service_anvil_disconnect(master_service, &anvil_session);
+       master_service_anvil_disconnect(master_service, &anvil_session,
+                                       llrcpt->anvil_conn_guid);
 }
 
 static void
@@ -280,7 +282,8 @@ lmtp_local_rcpt_anvil_cb(const char *reply, void *context)
                        .username = input->username,
                        .service_name = master_service_get_name(master_service),
                };
-               if (master_service_anvil_connect(master_service, &anvil_session))
+               if (master_service_anvil_connect(master_service, &anvil_session,
+                                                llrcpt->anvil_conn_guid))
                        llrcpt->anvil_connect_sent = TRUE;
        }
 }
index 09d927175f4c87b00458103388043a8a373fba78..2d68debe5e8a4c83463071d5aa8a614f1463e75a 100644 (file)
@@ -475,7 +475,8 @@ int client_init_mailbox(struct client *client, const char **error_r)
 
        struct master_service_anvil_session anvil_session;
        mail_user_get_anvil_session(client->user, &anvil_session);
-       if (master_service_anvil_connect(master_service, &anvil_session))
+       if (master_service_anvil_connect(master_service, &anvil_session,
+                                        client->anvil_conn_guid))
                client->anvil_sent = TRUE;
        return 0;
 }
@@ -604,7 +605,8 @@ static void client_default_destroy(struct client *client, const char *reason)
        if (client->anvil_sent) {
                struct master_service_anvil_session anvil_session;
                mail_user_get_anvil_session(client->user, &anvil_session);
-               master_service_anvil_disconnect(master_service, &anvil_session);
+               master_service_anvil_disconnect(master_service, &anvil_session,
+                                               client->anvil_conn_guid);
        }
 
        if (client->session_dotlock != NULL)
index 5cb3f466eb15c2f1c938da2b5a6af8d2c42ecf2d..853f65fa5c9e6018745b9fede41904f5d5f05b0c 100644 (file)
@@ -2,6 +2,7 @@
 #define POP3_CLIENT_H
 
 #include "seq-range-array.h"
+#include "guid.h"
 
 struct client;
 struct mail_storage;
@@ -40,6 +41,7 @@ struct client {
        struct istream *input;
        struct ostream *output;
        struct timeout *to_idle, *to_commit;
+       guid_128_t anvil_conn_guid;
 
        command_func_t *cmd;
        void *cmd_context;
index a2d1914413130312a9851ade3c3ff3c6bb364e70..6a5fcf31682d65177f8dbf3be00bc19f98afe97f 100644 (file)
@@ -250,7 +250,8 @@ client_create(int fd_in, int fd_out, struct mail_user *user,
 
        struct master_service_anvil_session anvil_session;
        mail_user_get_anvil_session(client->user, &anvil_session);
-       if (master_service_anvil_connect(master_service, &anvil_session))
+       if (master_service_anvil_connect(master_service, &anvil_session,
+                                        client->anvil_conn_guid))
                client->anvil_sent = TRUE;
 
        if (hook_client_created != NULL)
@@ -313,7 +314,8 @@ client_default_destroy(struct client *client)
        if (client->anvil_sent) {
                struct master_service_anvil_session anvil_session;
                mail_user_get_anvil_session(client->user, &anvil_session);
-               master_service_anvil_disconnect(master_service, &anvil_session);
+               master_service_anvil_disconnect(master_service, &anvil_session,
+                                               client->anvil_conn_guid);
        }
 
        if (client->urlauth_ctx != NULL)
index 4bafd0376839db039eac32fb141d55f0170bd754..3545e6f7c11083a059180a0e6d5ca6a889f484d4 100644 (file)
@@ -2,6 +2,7 @@
 #define CLIENT_H
 
 #include "net.h"
+#include "guid.h"
 
 struct smtp_reply;
 
@@ -86,6 +87,7 @@ struct client {
        const struct submission_settings *set;
 
        struct smtp_server_connection *conn;
+       guid_128_t anvil_conn_guid;
        struct client_state state;
        ARRAY(struct submission_backend *) pending_backends;
        ARRAY(struct submission_recipient *) rcpt_to;