annotate src/director/doveadm-connection.c @ 22536:5f09f6aa089b

director: doveadm HOST-* commands now wait for ring sync before returning OK This should make it easier for tests and maybe for scripts in general, so they won't think the command failed when it just takes a while to finish.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 14 Aug 2017 10:29:47 +0300
parents 2805abc195e1
children 4e3e963c32f0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21312
diff changeset
1 /* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "ioloop.h"
15187
02451e967a06 Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
5 #include "net.h"
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "istream.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "ostream.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "array.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "str.h"
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
10 #include "strescape.h"
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "llist.h"
11373
26cfc1c3a4b1 director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents: 11355
diff changeset
12 #include "master-service.h"
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "user-directory.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "mail-host.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "director.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "director-host.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include "director-request.h"
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
18 #include "director-connection.h"
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include "doveadm-connection.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 #include <unistd.h>
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
11458
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11373
diff changeset
23 #define DOVEADM_PROTOCOL_VERSION_MAJOR 1
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11373
diff changeset
24 #define DOVEADM_HANDSHAKE "VERSION\tdirector-doveadm\t1\t0\n"
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 #define MAX_VALID_VHOST_COUNT 1000
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
27 #define DEFAULT_MAX_MOVING_USERS 100
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
28 #define DOVEADM_CONNECTION_RING_SYNC_TIMEOUT_MSECS (30*1000)
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
29
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
30 enum doveadm_director_cmd_ret {
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
31 DOVEADM_DIRECTOR_CMD_RET_FAIL = -1,
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
32 DOVEADM_DIRECTOR_CMD_RET_UNFINISHED = 0,
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
33 DOVEADM_DIRECTOR_CMD_RET_OK = 1,
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
34 DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK,
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
35 };
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
36
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
37 typedef void
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
38 doveadm_connection_ring_sync_callback_t(struct doveadm_connection *);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
39
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
40 struct director_reset_cmd {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
41 struct director_reset_cmd *prev, *next;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
42
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
43 struct director *dir;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
44 struct doveadm_connection *_conn;
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
45 struct director_user_iter *iter;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
46 unsigned int host_idx, hosts_count;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
47 unsigned int max_moving_users;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
48 };
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 struct doveadm_connection {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 struct doveadm_connection *prev, *next;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 int fd;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 struct io *io;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 struct istream *input;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 struct ostream *output;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 struct director *dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
59 struct timeout *to_ring_sync_abort;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
60 struct director_reset_cmd *reset_cmd;
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
61 doveadm_connection_ring_sync_callback_t *ring_sync_callback;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
62
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 unsigned int handshaked:1;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 };
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 static struct doveadm_connection *doveadm_connections;
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
67 static struct doveadm_connection *doveadm_ring_sync_pending_connections;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
68 static struct director_reset_cmd *reset_cmds = NULL;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
70 static void doveadm_connection_set_io(struct doveadm_connection *conn);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 static void doveadm_connection_deinit(struct doveadm_connection **_conn);
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
72 static void
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
73 doveadm_connection_ring_sync_list_move(struct doveadm_connection *conn);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
75 static enum doveadm_director_cmd_ret
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
76 doveadm_cmd_host_list(struct doveadm_connection *conn,
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
77 const char *const *args ATTR_UNUSED)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 struct mail_host *const *hostp;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 string_t *str = t_str_new(1024);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81
11352
19336bddada2 director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents: 11351
diff changeset
82 array_foreach(mail_hosts_get(conn->dir->mail_hosts), hostp) {
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
83 str_printfa(str, "%s\t%u\t%u\t",
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 net_ip2addr(&(*hostp)->ip), (*hostp)->vhost_count,
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 (*hostp)->user_count);
19408
7e47f561ad49 director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents: 19407
diff changeset
86 str_append_tabescaped(str, mail_host_get_tag(*hostp));
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
87 str_printfa(str, "\t%c\t%ld", (*hostp)->down ? 'D' : 'U',
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
88 (long)(*hostp)->last_updown_change);
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
89 str_append_c(str, '\n');
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 str_append_c(str, '\n');
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
92 o_stream_nsend(conn->output, str_data(str), str_len(str));
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
93 return DOVEADM_DIRECTOR_CMD_RET_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
96 static enum doveadm_director_cmd_ret
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
97 doveadm_cmd_host_list_removed(struct doveadm_connection *conn,
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
98 const char *const *args ATTR_UNUSED)
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
99 {
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
100 struct mail_host_list *orig_hosts_list;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
101 struct mail_host *const *orig_hosts, *const *cur_hosts;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
102 unsigned int i, j, orig_hosts_count, cur_hosts_count;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
103 string_t *str = t_str_new(1024);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
104 int ret;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
105
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
106 orig_hosts_list = mail_hosts_init(conn->dir->set->director_user_expire,
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
107 conn->dir->set->director_consistent_hashing,
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
108 NULL);
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
109 (void)mail_hosts_parse_and_add(orig_hosts_list,
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
110 conn->dir->set->director_mail_servers);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
111
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
112 orig_hosts = array_get(mail_hosts_get(orig_hosts_list),
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
113 &orig_hosts_count);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
114 cur_hosts = array_get(mail_hosts_get(conn->dir->mail_hosts),
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
115 &cur_hosts_count);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
116
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
117 /* the hosts are sorted by IP */
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
118 for (i = j = 0; i < orig_hosts_count && j < cur_hosts_count; ) {
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
119 ret = net_ip_cmp(&orig_hosts[i]->ip, &cur_hosts[j]->ip);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
120 if (ret == 0)
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
121 i++, j++;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
122 else if (ret > 0)
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
123 j++;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
124 else {
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
125 str_printfa(str, "%s\n",
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
126 net_ip2addr(&orig_hosts[i]->ip));
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
127 i++;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
128 }
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
129 }
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
130 for (; i < orig_hosts_count; i++)
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
131 str_printfa(str, "%s\n", net_ip2addr(&orig_hosts[i]->ip));
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
132 str_append_c(str, '\n');
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
133 o_stream_nsend(conn->output, str_data(str), str_len(str));
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
134
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
135 mail_hosts_deinit(&orig_hosts_list);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
136 return DOVEADM_DIRECTOR_CMD_RET_OK;
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
137 }
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
138
18062
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
139 static void doveadm_director_append_status(struct director *dir, string_t *str)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
140 {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
141 if (!dir->ring_handshaked)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
142 str_append(str, "handshaking");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
143 else if (dir->ring_synced)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
144 str_append(str, "synced");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
145 else {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
146 str_printfa(str, "syncing - last sync %d secs ago",
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
147 (int)(ioloop_time - dir->ring_last_sync_time));
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
148 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
149 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
150
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
151 static void
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
152 doveadm_director_connection_append_status(struct director_connection *conn,
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
153 string_t *str)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
154 {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
155 if (!director_connection_is_handshaked(conn))
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
156 str_append(str, "handshaking");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
157 else if (director_connection_is_synced(conn))
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
158 str_append(str, "synced");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
159 else
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
160 str_append(str, "syncing");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
161 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
162
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
163 static void
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
164 doveadm_director_host_append_status(struct director *dir,
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
165 const struct director_host *host,
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
166 string_t *str)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
167 {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
168 struct director_connection *conn = NULL;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
169
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
170 if (dir->left != NULL &&
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
171 director_connection_get_host(dir->left) == host)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
172 conn = dir->left;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
173 else if (dir->right != NULL &&
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
174 director_connection_get_host(dir->right) == host)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
175 conn = dir->right;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
176 else {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
177 /* we might have a connection that is being connected */
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
178 struct director_connection *const *connp;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
179
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
180 array_foreach(&dir->connections, connp) {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
181 if (director_connection_get_host(*connp) == host) {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
182 conn = *connp;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
183 break;
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
184 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
185 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
186 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
187
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
188 if (conn != NULL)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
189 doveadm_director_connection_append_status(conn, str);
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
190 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
191
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
192 static enum doveadm_director_cmd_ret
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
193 doveadm_cmd_director_list(struct doveadm_connection *conn,
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
194 const char *const *args ATTR_UNUSED)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 {
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
196 struct director *dir = conn->dir;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 struct director_host *const *hostp;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 string_t *str = t_str_new(1024);
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
199 const char *type;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
200 bool left, right;
14432
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
201 time_t last_failed;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
203 array_foreach(&dir->dir_hosts, hostp) {
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
204 const struct director_host *host = *hostp;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
205
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
206 left = dir->left != NULL &&
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
207 director_connection_get_host(dir->left) == host;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
208 right = dir->right != NULL &&
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
209 director_connection_get_host(dir->right) == host;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
210
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
211 if (host->removed)
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
212 type = "removed";
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
213 else if (dir->self_host == host)
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
214 type = "self";
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
215 else if (left)
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
216 type = right ? "l+r" : "left";
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
217 else if (right)
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
218 type = "right";
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
219 else
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
220 type = "";
14432
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
221
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
222 last_failed = I_MAX(host->last_network_failure,
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
223 host->last_protocol_failure);
18062
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
224 str_printfa(str, "%s\t%u\t%s\t%lu\t",
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
225 net_ip2addr(&host->ip), host->port, type,
14432
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
226 (unsigned long)last_failed);
18062
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
227 if (dir->self_host == host)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
228 doveadm_director_append_status(dir, str);
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
229 else
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
230 doveadm_director_host_append_status(dir, host, str);
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
231 str_append_c(str, '\n');
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 str_append_c(str, '\n');
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
234 o_stream_nsend(conn->output, str_data(str), str_len(str));
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
235 return DOVEADM_DIRECTOR_CMD_RET_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
238 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
239 doveadm_cmd_director_add(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
240 const char *const *args)
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
241 {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
242 struct director_host *host;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
243 struct ip_addr ip;
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18729
diff changeset
244 in_port_t port = conn->dir->self_port;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
245
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
246 if (args[0] == NULL ||
20968
2a7e47e01509 director: Make sure IP address parsing works in DIRECTOR-ADD/REMOVE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20967
diff changeset
247 net_addr2ip(args[0], &ip) < 0 ||
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18729
diff changeset
248 (args[1] != NULL && net_str2port(args[1], &port) < 0)) {
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
249 i_error("doveadm sent invalid DIRECTOR-ADD parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
250 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
251 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
252
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
253 if (director_host_lookup(conn->dir, &ip, port) == NULL) {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
254 host = director_host_add(conn->dir, &ip, port);
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
255 director_notify_ring_added(host, conn->dir->self_host);
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
256 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
257 o_stream_nsend(conn->output, "OK\n", 3);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
258 return DOVEADM_DIRECTOR_CMD_RET_OK;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
259 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
260
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
261 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
262 doveadm_cmd_director_remove(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
263 const char *const *args)
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
264 {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
265 struct director_host *host;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
266 struct ip_addr ip;
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18729
diff changeset
267 in_port_t port = 0;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
268
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
269 if (args[0] == NULL ||
20968
2a7e47e01509 director: Make sure IP address parsing works in DIRECTOR-ADD/REMOVE
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20967
diff changeset
270 net_addr2ip(args[0], &ip) < 0 ||
19035
aabfe48db1cf Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents: 18729
diff changeset
271 (args[1] != NULL && net_str2port(args[1], &port) < 0)) {
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
272 i_error("doveadm sent invalid DIRECTOR-REMOVE parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
273 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
274 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
275
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
276 host = port != 0 ?
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
277 director_host_lookup(conn->dir, &ip, port) :
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
278 director_host_lookup_ip(conn->dir, &ip);
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
279 if (host == NULL)
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
280 o_stream_nsend_str(conn->output, "NOTFOUND\n");
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
281 else {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
282 director_ring_remove(host, conn->dir->self_host);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
283 o_stream_nsend(conn->output, "OK\n", 3);
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
284 }
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
285 return DOVEADM_DIRECTOR_CMD_RET_OK;
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
286 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
287
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
288 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
289 doveadm_cmd_host_set_or_update(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
290 const char *const *args, bool update)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 {
11352
19336bddada2 director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents: 11351
diff changeset
292 struct director *dir = conn->dir;
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
293 const char *ip_str, *tag = "";
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 struct mail_host *host;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 struct ip_addr ip;
15904
d3cf06639864 Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
296 unsigned int vhost_count = UINT_MAX;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
298 ip_str = args[0];
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
299 if (ip_str != NULL) {
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
300 tag = strchr(ip_str, '@');
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
301 if (tag == NULL)
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
302 tag = "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
303 else
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
304 ip_str = t_strdup_until(ip_str, tag++);
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
305 }
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
306 if (ip_str == NULL || net_addr2ip(ip_str, &ip) < 0 ||
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
307 (args[1] != NULL && str_to_uint(args[1], &vhost_count) < 0) ||
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
308 (args[1] == NULL && update)) {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
309 i_error("doveadm sent invalid %s parameters",
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
310 update ? "HOST-UPDATE" : "HOST-SET");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
311 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 }
15904
d3cf06639864 Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
313 if (vhost_count > MAX_VALID_VHOST_COUNT && vhost_count != UINT_MAX) {
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
314 o_stream_nsend_str(conn->output, "vhost count too large\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
315 return DOVEADM_DIRECTOR_CMD_RET_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 }
11352
19336bddada2 director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents: 11351
diff changeset
317 host = mail_host_lookup(dir->mail_hosts, &ip);
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
318 if (host == NULL) {
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
319 if (update) {
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
320 o_stream_nsend_str(conn->output, "NOTFOUND\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
321 return DOVEADM_DIRECTOR_CMD_RET_OK;
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
322 }
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
323 host = mail_host_add_ip(dir->mail_hosts, &ip, tag);
19497
1d2999cfe0a4 director: If doveadm attempts to change tag for an existing host, return error.
Timo Sirainen <tss@iki.fi>
parents: 19437
diff changeset
324 } else if (tag[0] != '\0' && strcmp(mail_host_get_tag(host), tag) != 0) {
1d2999cfe0a4 director: If doveadm attempts to change tag for an existing host, return error.
Timo Sirainen <tss@iki.fi>
parents: 19437
diff changeset
325 o_stream_nsend_str(conn->output, "host tag can't be changed\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
326 return DOVEADM_DIRECTOR_CMD_RET_OK;
19288
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
327 } else if (host->desynced) {
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
328 o_stream_nsend_str(conn->output,
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
329 "host is already being updated - try again later\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
330 return DOVEADM_DIRECTOR_CMD_RET_OK;
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
331 }
15904
d3cf06639864 Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
332 if (vhost_count != UINT_MAX)
21842
86e52ff70044 director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21443
diff changeset
333 mail_host_set_vhost_count(host, vhost_count, "doveadm: ");
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
334 /* NOTE: we don't support changing a tag for an existing host.
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
335 it needs to be removed first. otherwise it would be a bit ugly to
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
336 handle. */
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
337 director_update_host(dir, dir->self_host, NULL, host);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
339 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
342 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
343 doveadm_cmd_host_set(struct doveadm_connection *conn, const char *const *args)
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
344 {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
345 return doveadm_cmd_host_set_or_update(conn, args, FALSE);
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
346 }
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
347
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
348 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
349 doveadm_cmd_host_update(struct doveadm_connection *conn, const char *const *args)
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
350 {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
351 return doveadm_cmd_host_set_or_update(conn, args, TRUE);
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
352 }
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
353
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
354 static enum doveadm_director_cmd_ret
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
355 doveadm_cmd_host_updown(struct doveadm_connection *conn, bool down,
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
356 const char *const *args)
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
357 {
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
358 struct mail_host *host;
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
359 struct ip_addr ip;
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
360
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
361 if (args[0] == NULL || net_addr2ip(args[0], &ip) < 0) {
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
362 i_error("doveadm sent invalid %s parameters: %s",
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
363 down ? "HOST-DOWN" : "HOST-UP",
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
364 args[0] == NULL ? "" : args[0]);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
365 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
366 }
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
367 host = mail_host_lookup(conn->dir->mail_hosts, &ip);
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
368 if (host == NULL) {
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
369 o_stream_nsend_str(conn->output, "NOTFOUND\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
370 return DOVEADM_DIRECTOR_CMD_RET_OK;
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
371 }
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
372 if (host->down == down) {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
373 o_stream_nsend_str(conn->output, "OK\n");
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
374 return DOVEADM_DIRECTOR_CMD_RET_OK;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
375 } else if (host->desynced) {
19288
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
376 o_stream_nsend_str(conn->output,
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
377 "host is already being updated - try again later\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
378 return DOVEADM_DIRECTOR_CMD_RET_OK;
19288
5939512ff017 director: Don't allow doveadm to update backend's state if the state is already being changed.
Timo Sirainen <tss@iki.fi>
parents: 19078
diff changeset
379 } else {
21842
86e52ff70044 director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21443
diff changeset
380 mail_host_set_down(host, down, ioloop_time, "doveadm: ");
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
381 director_update_host(conn->dir, conn->dir->self_host,
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
382 NULL, host);
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
383 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK;
18729
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
384 }
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
385 }
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
386
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
387 static enum doveadm_director_cmd_ret
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
388 doveadm_cmd_host_up(struct doveadm_connection *conn,
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
389 const char *const *args)
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
390 {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
391 return doveadm_cmd_host_updown(conn, FALSE, args);
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
392 }
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
393
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
394 static enum doveadm_director_cmd_ret
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
395 doveadm_cmd_host_down(struct doveadm_connection *conn,
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
396 const char *const *args)
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
397 {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
398 return doveadm_cmd_host_updown(conn, TRUE, args);
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
399 }
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
400
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
401 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
402 doveadm_cmd_host_remove(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
403 const char *const *args)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 struct mail_host *host;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 struct ip_addr ip;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
408 if (args[0] == NULL || net_addr2ip(args[0], &ip) < 0) {
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
409 i_error("doveadm sent invalid HOST-REMOVE parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
410 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 }
11352
19336bddada2 director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents: 11351
diff changeset
412 host = mail_host_lookup(conn->dir->mail_hosts, &ip);
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
413 if (host == NULL) {
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
414 o_stream_nsend_str(conn->output, "NOTFOUND\n");
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
415 return DOVEADM_DIRECTOR_CMD_RET_OK;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
416 } else {
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
417 director_remove_host(conn->dir, conn->dir->self_host,
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
418 NULL, host);
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
419 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
423 static void
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
424 doveadm_cmd_host_flush_all(struct doveadm_connection *conn)
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
425 {
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
426 struct mail_host *const *hostp;
17725
bd381e882485 director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents: 17418
diff changeset
427 unsigned int total_user_count = 0;
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
428
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
429 array_foreach(mail_hosts_get(conn->dir->mail_hosts), hostp) {
17725
bd381e882485 director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents: 17418
diff changeset
430 total_user_count += (*hostp)->user_count;
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
431 director_flush_host(conn->dir, conn->dir->self_host,
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
432 NULL, *hostp);
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
433 }
17725
bd381e882485 director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents: 17418
diff changeset
434 i_warning("Flushed all backend hosts with %u users. This is an unsafe "
bd381e882485 director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents: 17418
diff changeset
435 "operation and may cause the same users to end up in multiple backends.",
bd381e882485 director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents: 17418
diff changeset
436 total_user_count);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
437 o_stream_nsend(conn->output, "OK\n", 3);
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
438 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
439
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
440 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
441 doveadm_cmd_host_flush(struct doveadm_connection *conn, const char *const *args)
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
442 {
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
443 struct mail_host *host;
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
444 struct ip_addr ip;
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
445
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
446 if (args[0] == NULL || args[0][0] == '\0') {
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
447 doveadm_cmd_host_flush_all(conn);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
448 return DOVEADM_DIRECTOR_CMD_RET_OK;
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
449 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
450
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
451 if (net_addr2ip(args[0], &ip) < 0) {
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
452 i_error("doveadm sent invalid HOST-FLUSH parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
453 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
454 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
455 host = mail_host_lookup(conn->dir->mail_hosts, &ip);
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
456 if (host == NULL) {
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
457 o_stream_nsend_str(conn->output, "NOTFOUND\n");
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
458 return DOVEADM_DIRECTOR_CMD_RET_OK;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
459 } else {
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
460 director_flush_host(conn->dir, conn->dir->self_host,
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
461 NULL, host);
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
462 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK;
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
463 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
464 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
465
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
466 static void doveadm_reset_cmd_free(struct director_reset_cmd *cmd)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
467 {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
468 DLLIST_REMOVE(&reset_cmds, cmd);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
469
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
470 if (cmd->iter != NULL)
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
471 director_iterate_users_deinit(&cmd->iter);
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
472 if (cmd->_conn != NULL)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
473 cmd->_conn->reset_cmd = NULL;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
474 i_free(cmd);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
475 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
476
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
477 static bool
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
478 director_host_reset_users(struct director_reset_cmd *cmd,
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
479 struct mail_host *host)
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
480 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
481 struct director *dir = cmd->dir;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
482 struct user *user;
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
483 struct mail_host *new_host;
22506
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
484 bool users_killed = FALSE;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
485
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
486 if (dir->users_moving_count >= cmd->max_moving_users)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
487 return FALSE;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
488
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
489 if (dir->right != NULL)
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
490 director_connection_cork(dir->right);
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
491
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
492 if (cmd->iter == NULL)
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
493 cmd->iter = director_iterate_users_init(dir);
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
494
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
495 while ((user = director_iterate_users_next(cmd->iter)) != NULL) {
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
496 if (user->host != host)
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
497 continue;
22506
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
498
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
499 new_host = mail_host_get_by_hash(dir->mail_hosts,
19408
7e47f561ad49 director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents: 19407
diff changeset
500 user->username_hash,
7e47f561ad49 director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents: 19407
diff changeset
501 mail_host_get_tag(host));
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
502 if (new_host != host) T_BEGIN {
22506
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
503 if (new_host != NULL) {
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
504 director_move_user(dir, dir->self_host, NULL,
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
505 user->username_hash, new_host);
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
506 } else {
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
507 /* there are no more available backends.
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
508 kick the user instead. */
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
509 director_kill_user(dir, dir->self_host, user,
22510
3c4348ffe0d6 director: Fix flush to kick the user also when all backends are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22506
diff changeset
510 user->host->tag, user->host,
3c4348ffe0d6 director: Fix flush to kick the user also when all backends are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22506
diff changeset
511 TRUE);
22506
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
512 users_killed = TRUE;
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
513 }
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
514 } T_END;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
515 if (dir->users_moving_count >= cmd->max_moving_users)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
516 break;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
517 }
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
518 if (user == NULL)
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
519 director_iterate_users_deinit(&cmd->iter);
22506
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
520 if (users_killed) {
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
521 /* no more backends. we already sent kills. now remove the
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
522 users entirely from the host. */
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
523 director_flush_host(dir, dir->self_host, NULL, host);
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
524 }
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
525 if (dir->right != NULL)
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
526 director_connection_uncork(dir->right);
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
527 return user == NULL;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
528 }
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
529
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
530 static bool
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
531 director_reset_cmd_run(struct director_reset_cmd *cmd)
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
532 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
533 struct mail_host *const *hosts;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
534 unsigned int count;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
535
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
536 hosts = array_get(mail_hosts_get(cmd->dir->mail_hosts), &count);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
537 if (count > cmd->hosts_count)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
538 count = cmd->hosts_count;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
539 while (cmd->host_idx < count) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
540 if (!director_host_reset_users(cmd, hosts[cmd->host_idx]))
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
541 return FALSE;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
542 cmd->host_idx++;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
543 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
544 if (cmd->_conn != NULL) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
545 struct doveadm_connection *conn = cmd->_conn;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
546
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
547 o_stream_nsend(conn->output, "OK\n", 3);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
548 if (conn->io == NULL)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
549 doveadm_connection_set_io(conn);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
550 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
551 doveadm_reset_cmd_free(cmd);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
552 return TRUE;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
553 }
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
554
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
555 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
556 doveadm_cmd_host_reset_users(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
557 const char *const *args)
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
558 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
559 struct director_reset_cmd *cmd;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
560 struct ip_addr ip;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
561 struct mail_host *const *hosts;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
562 unsigned int i = 0, count;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
563 unsigned int max_moving_users = DEFAULT_MAX_MOVING_USERS;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
564
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
565 if (args[0] != NULL && args[1] != NULL &&
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
566 str_to_uint(args[1], &max_moving_users) < 0) {
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
567 i_error("doveadm sent invalid HOST-RESET-USERS parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
568 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
569 }
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
570
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
571 hosts = array_get(mail_hosts_get(conn->dir->mail_hosts), &count);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
572 if (args[0] != NULL && args[0][0] != '\0') {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
573 if (net_addr2ip(args[0], &ip) < 0) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
574 i_error("doveadm sent invalid HOST-RESET-USERS ip: %s",
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
575 args[0]);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
576 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
577 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
578
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
579 for (i = 0; i < count; i++) {
20984
d3f2fc420d2b director: Fix HOST-RESET-USERS with host parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20976
diff changeset
580 if (net_ip_compare(&hosts[i]->ip, &ip))
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
581 break;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
582 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
583 if (i == count) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
584 o_stream_nsend_str(conn->output, "NOTFOUND\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
585 return DOVEADM_DIRECTOR_CMD_RET_OK;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
586 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
587 count = i+1;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
588 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
589
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
590 conn->reset_cmd = cmd = i_new(struct director_reset_cmd, 1);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
591 cmd->dir = conn->dir;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
592 cmd->_conn = conn;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
593 cmd->max_moving_users = max_moving_users;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
594 cmd->host_idx = i;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
595 cmd->hosts_count = count;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
596 DLLIST_PREPEND(&reset_cmds, cmd);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
597
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
598 if (!director_reset_cmd_run(cmd)) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
599 /* we still have work to do. don't handle any more doveadm
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
600 input until we're finished. */
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
601 io_remove(&conn->io);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
602 return DOVEADM_DIRECTOR_CMD_RET_UNFINISHED;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
603 }
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
604 return DOVEADM_DIRECTOR_CMD_RET_OK;
18709
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
605 }
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
606
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
607 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
608 doveadm_cmd_user_lookup(struct doveadm_connection *conn,
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
609 const char *const *args)
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
610 {
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
611 struct user *user;
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
612 struct mail_host *host;
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
613 const char *username, *tag;
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
614 unsigned int username_hash;
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
615 struct mail_tag *mail_tag;
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
616 string_t *str = t_str_new(256);
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
617
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
618 if (args[0] == NULL) {
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
619 username = "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
620 tag = "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
621 } else {
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
622 username = args[0];
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
623 tag = args[1] != NULL ? args[1] : "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
624 }
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
625 if (str_to_uint(username, &username_hash) < 0)
21076
ef9d8f4c6c67 director: Code cleanup - moved username_hash generation to director.h
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21075
diff changeset
626 username_hash = director_get_username_hash(conn->dir, username);
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
627
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
628 /* get user's current host */
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
629 mail_tag = mail_tag_find(conn->dir->mail_hosts, tag);
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
630 user = mail_tag == NULL ? NULL :
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
631 user_directory_lookup(mail_tag->users, username_hash);
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
632 if (user == NULL)
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
633 str_append(str, "\t0");
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
634 else {
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
635 str_printfa(str, "%s\t%u", net_ip2addr(&user->host->ip),
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
636 user->timestamp +
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
637 conn->dir->set->director_user_expire);
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
638 }
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
639
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
640 /* get host if it wasn't in user directory */
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
641 host = mail_host_get_by_hash(conn->dir->mail_hosts, username_hash, tag);
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
642 if (host == NULL)
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
643 str_append(str, "\t");
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
644 else
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
645 str_printfa(str, "\t%s", net_ip2addr(&host->ip));
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
646
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
647 /* get host with default configuration */
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
648 host = mail_host_get_by_hash(conn->dir->orig_config_hosts,
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
649 username_hash, tag);
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
650 if (host == NULL)
19437
ac30316bed82 director: Fixed "doveadm director status user@domain" not to hang due to missing LF.
Timo Sirainen <tss@iki.fi>
parents: 19408
diff changeset
651 str_append(str, "\t\n");
11353
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
652 else
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
653 str_printfa(str, "\t%s\n", net_ip2addr(&host->ip));
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
654 o_stream_nsend(conn->output, str_data(str), str_len(str));
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
655 return DOVEADM_DIRECTOR_CMD_RET_OK;
11351
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
656 }
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
657
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
658 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
659 doveadm_cmd_user_list(struct doveadm_connection *conn, const char *const *args)
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
660 {
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
661 struct director_user_iter *iter;
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
662 struct user *user;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
663 struct ip_addr ip;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
664
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
665 if (args[0] != NULL && args[0][0] != '\0') {
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
666 if (net_addr2ip(args[0], &ip) < 0) {
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
667 i_error("doveadm sent invalid USER-LIST parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
668 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
669 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
670 } else {
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
671 ip.family = 0;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
672 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
673
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
674 iter = director_iterate_users_init(conn->dir);
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
675 while ((user = director_iterate_users_next(iter)) != NULL) {
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
676 if (ip.family == 0 ||
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
677 net_ip_compare(&ip, &user->host->ip)) T_BEGIN {
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
678 unsigned int expire_time = user->timestamp +
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
679 conn->dir->set->director_user_expire;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
680
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
681 o_stream_nsend_str(conn->output, t_strdup_printf(
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
682 "%u\t%u\t%s\n",
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
683 user->username_hash, expire_time,
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
684 net_ip2addr(&user->host->ip)));
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
685 } T_END;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
686 }
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
687 director_iterate_users_deinit(&iter);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
688 o_stream_nsend(conn->output, "\n", 1);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
689 return DOVEADM_DIRECTOR_CMD_RET_OK;
11823
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
690 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
691
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
692 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
693 doveadm_cmd_user_move(struct doveadm_connection *conn, const char *const *args)
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
694 {
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
695 unsigned int username_hash;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
696 struct user *user;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
697 struct mail_host *host;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
698 struct ip_addr ip;
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
699
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
700 if (args[0] == NULL || args[1] == NULL ||
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
701 net_addr2ip(args[1], &ip) < 0) {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
702 i_error("doveadm sent invalid USER-MOVE parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
703 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
704 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
705 host = mail_host_lookup(conn->dir->mail_hosts, &ip);
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
706 if (host == NULL) {
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
707 o_stream_nsend_str(conn->output, "NOTFOUND\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
708 return DOVEADM_DIRECTOR_CMD_RET_OK;
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
709 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
710
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
711 if (str_to_uint(args[0], &username_hash) < 0)
21076
ef9d8f4c6c67 director: Code cleanup - moved username_hash generation to director.h
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21075
diff changeset
712 username_hash = director_get_username_hash(conn->dir, args[0]);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
713
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
714 user = user_directory_lookup(host->tag->users, username_hash);
20986
410eacd7ad40 director: Code cleanup - added USER_IS_BEING_KILLED() macro
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20984
diff changeset
715 if (user != NULL && USER_IS_BEING_KILLED(user)) {
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
716 o_stream_nsend_str(conn->output, "TRYAGAIN\n");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
717 return DOVEADM_DIRECTOR_CMD_RET_OK;
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
718 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
719
21432
14e13ad7efde director: Ignore doveadm user move if host is already the same.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
720 if (user == NULL || user->host != host) {
14e13ad7efde director: Ignore doveadm user move if host is already the same.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
721 director_move_user(conn->dir, conn->dir->self_host, NULL,
14e13ad7efde director: Ignore doveadm user move if host is already the same.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
722 username_hash, host);
21443
2b9164c4299a director: "doveadm director move" to same host now refreshes user's timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21432
diff changeset
723 } else {
2b9164c4299a director: "doveadm director move" to same host now refreshes user's timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21432
diff changeset
724 /* already the correct host. reset the user's timeout. */
2b9164c4299a director: "doveadm director move" to same host now refreshes user's timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21432
diff changeset
725 user_directory_refresh(host->tag->users, user);
2b9164c4299a director: "doveadm director move" to same host now refreshes user's timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21432
diff changeset
726 director_update_user(conn->dir, conn->dir->self_host, user);
21432
14e13ad7efde director: Ignore doveadm user move if host is already the same.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
727 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
728 o_stream_nsend(conn->output, "OK\n", 3);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
729 return DOVEADM_DIRECTOR_CMD_RET_OK;
13045
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
730 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
731
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
732 static enum doveadm_director_cmd_ret
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
733 doveadm_cmd_user_kick(struct doveadm_connection *conn, const char *const *args)
17418
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
734 {
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
735 if (args[0] == NULL) {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
736 i_error("doveadm sent invalid USER-KICK parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
737 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
17418
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
738 }
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
739
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
740 director_kick_user(conn->dir, conn->dir->self_host, NULL, args[0]);
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
741 o_stream_nsend(conn->output, "OK\n", 3);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
742 return DOVEADM_DIRECTOR_CMD_RET_OK;
17418
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
743 }
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
744
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
745 static enum doveadm_director_cmd_ret
21312
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
746 doveadm_cmd_user_kick_alt(struct doveadm_connection *conn, const char *const *args)
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
747 {
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
748 if (str_array_length(args) < 2) {
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
749 i_error("doveadm sent invalid USER-KICK-ALT parameters");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
750 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
21312
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
751 }
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
752
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
753 director_kick_user_alt(conn->dir, conn->dir->self_host, NULL,
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
754 args[0], args[1]);
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
755 o_stream_nsend(conn->output, "OK\n", 3);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
756 return DOVEADM_DIRECTOR_CMD_RET_OK;
21312
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
757 }
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
758
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
759 struct {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
760 const char *name;
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
761 enum doveadm_director_cmd_ret (*cmd)
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
762 (struct doveadm_connection *conn, const char *const *args);
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
763 } doveadm_director_commands[] = {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
764 { "HOST-LIST", doveadm_cmd_host_list },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
765 { "HOST-LIST-REMOVED", doveadm_cmd_host_list_removed },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
766 { "DIRECTOR-LIST", doveadm_cmd_director_list },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
767 { "DIRECTOR-ADD", doveadm_cmd_director_add },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
768 { "DIRECTOR-REMOVE", doveadm_cmd_director_remove },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
769 { "HOST-SET", doveadm_cmd_host_set },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
770 { "HOST-UPDATE", doveadm_cmd_host_update },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
771 { "HOST-UP", doveadm_cmd_host_up },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
772 { "HOST-DOWN", doveadm_cmd_host_down },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
773 { "HOST-REMOVE", doveadm_cmd_host_remove },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
774 { "HOST-FLUSH", doveadm_cmd_host_flush },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
775 { "HOST-RESET-USERS", doveadm_cmd_host_reset_users },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
776 { "USER-LOOKUP", doveadm_cmd_user_lookup },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
777 { "USER-LIST", doveadm_cmd_user_list },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
778 { "USER-MOVE", doveadm_cmd_user_move },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
779 { "USER-KICK", doveadm_cmd_user_kick },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
780 { "USER-KICK-ALT", doveadm_cmd_user_kick_alt },
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
781 };
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
782
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
783 static void
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
784 doveadm_connection_ring_sync_timeout(struct doveadm_connection *conn)
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
785 {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
786 doveadm_connection_ring_sync_list_move(conn);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
787 o_stream_nsend_str(conn->output, "Ring sync timed out\n");
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
788
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
789 doveadm_connection_set_io(conn);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
790 io_set_pending(conn->io);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
791 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
792
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
793 static void
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
794 doveadm_connection_set_ring_sync_callback(struct doveadm_connection *conn,
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
795 doveadm_connection_ring_sync_callback_t *callback)
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
796 {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
797 i_assert(conn->ring_sync_callback == NULL);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
798 i_assert(conn->to_ring_sync_abort == NULL);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
799
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
800 conn->ring_sync_callback = callback;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
801 io_remove(&conn->io);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
802 DLLIST_REMOVE(&doveadm_connections, conn);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
803 DLLIST_PREPEND(&doveadm_ring_sync_pending_connections, conn);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
804 conn->to_ring_sync_abort =
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
805 timeout_add(DOVEADM_CONNECTION_RING_SYNC_TIMEOUT_MSECS,
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
806 doveadm_connection_ring_sync_timeout, conn);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
807 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
808
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
809 static void doveadm_connection_ret_ok(struct doveadm_connection *conn)
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
810 {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
811 o_stream_nsend(conn->output, "OK\n", 3);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
812 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
813
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
814 static enum doveadm_director_cmd_ret
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
815 doveadm_connection_cmd_run(struct doveadm_connection *conn,
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
816 const char *const *args, unsigned int i)
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
817 {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
818 enum doveadm_director_cmd_ret ret;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
819
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
820 ret = doveadm_director_commands[i].cmd(conn, args);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
821 if (ret != DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK)
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
822 return ret;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
823 /* Delay sending OK until ring is synced. This way doveadm will know
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
824 whether the call actually succeeded or not. */
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
825 if (conn->dir->ring_synced) {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
826 /* director is alone */
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
827 i_assert(conn->dir->right == NULL && conn->dir->left == NULL);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
828 o_stream_nsend(conn->output, "OK\n", 3);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
829 return DOVEADM_DIRECTOR_CMD_RET_OK;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
830 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
831 doveadm_connection_set_ring_sync_callback(conn, doveadm_connection_ret_ok);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
832 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
833 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
834
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
835 static enum doveadm_director_cmd_ret
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
836 doveadm_connection_cmd(struct doveadm_connection *conn, const char *line)
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
837 {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
838 const char *cmd, *const *args;
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
839
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
840 args = t_strsplit_tabescaped(line);
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
841 if (args[0] == NULL) {
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
842 i_error("doveadm sent empty command line");
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
843 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
844 }
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
845 cmd = args[0];
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
846 args++;
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
847
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
848 for (unsigned int i = 0; i < N_ELEMENTS(doveadm_director_commands); i++) {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
849 if (strcmp(doveadm_director_commands[i].name, cmd) == 0)
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
850 return doveadm_connection_cmd_run(conn, args, i);
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
851 }
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
852 i_error("doveadm sent unknown command: %s", line);
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
853 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
854 }
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
855
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
856 static void doveadm_connection_input(struct doveadm_connection *conn)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
857 {
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
858 const char *line;
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
859 enum doveadm_director_cmd_ret ret = DOVEADM_DIRECTOR_CMD_RET_OK;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
861 if (!conn->handshaked) {
11894
06a7435b6f53 director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents: 11823
diff changeset
862 if ((line = i_stream_read_next_line(conn->input)) == NULL) {
06a7435b6f53 director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents: 11823
diff changeset
863 if (conn->input->eof || conn->input->stream_errno != 0)
06a7435b6f53 director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents: 11823
diff changeset
864 doveadm_connection_deinit(&conn);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
865 return;
11894
06a7435b6f53 director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents: 11823
diff changeset
866 }
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
867
11458
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11373
diff changeset
868 if (!version_string_verify(line, "director-doveadm",
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11373
diff changeset
869 DOVEADM_PROTOCOL_VERSION_MAJOR)) {
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
870 i_error("doveadm not compatible with this server "
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
871 "(mixed old and new binaries?)");
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
872 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
873 return;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
874 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
875 conn->handshaked = TRUE;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
876 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
877
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
878 while ((line = i_stream_read_next_line(conn->input)) != NULL &&
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
879 ret == DOVEADM_DIRECTOR_CMD_RET_OK) {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
880 T_BEGIN {
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
881 ret = doveadm_connection_cmd(conn, line);
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
882 } T_END;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
883 }
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
884 if (conn->input->eof || conn->input->stream_errno != 0 ||
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
885 ret == DOVEADM_DIRECTOR_CMD_RET_FAIL)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
886 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
887 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
888
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
889 static void doveadm_connection_set_io(struct doveadm_connection *conn)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
890 {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
891 conn->io = io_add(conn->fd, IO_READ, doveadm_connection_input, conn);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
892 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
893
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
894 struct doveadm_connection *
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
895 doveadm_connection_init(struct director *dir, int fd)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
896 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
897 struct doveadm_connection *conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
898
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
899 conn = i_new(struct doveadm_connection, 1);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
900 conn->fd = fd;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
901 conn->dir = dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
902 conn->input = i_stream_create_fd(conn->fd, 1024, FALSE);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
903 conn->output = o_stream_create_fd(conn->fd, (size_t)-1, FALSE);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
904 o_stream_set_no_error_handling(conn->output, TRUE);
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
905 doveadm_connection_set_io(conn);
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
906 o_stream_nsend_str(conn->output, DOVEADM_HANDSHAKE);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
907
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
908 DLLIST_PREPEND(&doveadm_connections, conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
909 return conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
910 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
911
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
912 static void doveadm_connection_deinit(struct doveadm_connection **_conn)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
913 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
914 struct doveadm_connection *conn = *_conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
915
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
916 *_conn = NULL;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
917
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
918 i_assert(conn->to_ring_sync_abort == NULL);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
919
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
920 if (conn->reset_cmd != NULL) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
921 /* finish the move even if doveadm disconnected */
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
922 conn->reset_cmd->_conn = NULL;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
923 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
924
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
925 DLLIST_REMOVE(&doveadm_connections, conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
926 io_remove(&conn->io);
11322
12316378922e director: Memory leak fix.
Timo Sirainen <tss@iki.fi>
parents: 11321
diff changeset
927 i_stream_unref(&conn->input);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
928 o_stream_unref(&conn->output);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
929 if (close(conn->fd) < 0)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
930 i_error("close(doveadm connection) failed: %m");
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
931 i_free(conn);
11373
26cfc1c3a4b1 director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents: 11355
diff changeset
932
26cfc1c3a4b1 director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents: 11355
diff changeset
933 master_service_client_connection_destroyed(master_service);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
934 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
935
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
936 static void
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
937 doveadm_connection_ring_sync_list_move(struct doveadm_connection *conn)
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
938 {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
939 timeout_remove(&conn->to_ring_sync_abort);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
940 DLLIST_REMOVE(&doveadm_ring_sync_pending_connections, conn);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
941 DLLIST_PREPEND(&doveadm_connections, conn);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
942 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
943
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
944 void doveadm_connections_deinit(void)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
945 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
946 while (reset_cmds != NULL)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
947 doveadm_reset_cmd_free(reset_cmds);
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
948
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
949 unsigned int pending_count = 0;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
950 while (doveadm_ring_sync_pending_connections != NULL) {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
951 doveadm_connection_ring_sync_list_move(doveadm_ring_sync_pending_connections);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
952 pending_count++;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
953 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
954 if (pending_count > 0)
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
955 i_warning("Shutting down while %u doveadm connections were waiting for ring sync", pending_count);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
956 while (doveadm_connections != NULL) {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
957 struct doveadm_connection *conn = doveadm_connections;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
958
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
959 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
960 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
961 }
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
962
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
963 static void doveadm_connections_continue_reset_cmds(void)
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
964 {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
965 while (reset_cmds != NULL) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
966 if (!director_reset_cmd_run(reset_cmds))
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
967 break;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
968 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
969 }
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
970
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
971 void doveadm_connections_ring_synced(void)
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
972 {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
973 while (doveadm_ring_sync_pending_connections != NULL) {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
974 struct doveadm_connection *conn =
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
975 doveadm_ring_sync_pending_connections;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
976 doveadm_connection_ring_sync_callback_t *callback =
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
977 conn->ring_sync_callback;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
978
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
979 conn->ring_sync_callback = NULL;
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
980 doveadm_connection_ring_sync_list_move(conn);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
981 doveadm_connection_set_io(conn);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
982 io_set_pending(conn->io);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
983 callback(conn);
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
984 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
985 doveadm_connections_continue_reset_cmds();
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
986 }