annotate src/director/doveadm-connection.c @ 22631:53082f1df8a6

director: Show each director connection in doveadm DIRECTOR-LIST Previously the host was shown only once, regardless of how many connections it had. This especially helps when there are just two directors, but also can be useful when showing incoming/outgoing connections that are still in handshaking phase.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 26 Oct 2017 13:56:25 +0300
parents 0170e1657f4d
children 6e235143e177
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
22537
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
37 enum doveadm_director_cmd_flag {
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
38 DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC = 0x01,
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
39 };
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
40
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
41 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
42 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
43
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
44 struct director_reset_cmd {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
45 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
46
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
47 struct director *dir;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
48 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
49 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
50 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
51 unsigned int max_moving_users;
22552
7b8e95de2bff director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22537
diff changeset
52 bool users_killed;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
53 };
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 struct doveadm_connection {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 struct doveadm_connection *prev, *next;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 int fd;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 struct io *io;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 struct istream *input;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 struct ostream *output;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 struct director *dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
64 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
65 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
66 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
67
22537
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
68 const char **cmd_pending_args;
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
69 unsigned int cmd_pending_idx;
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
70
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 unsigned int handshaked:1;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 };
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 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
75 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
76 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
77
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
78 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
79 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
80 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
81 doveadm_connection_ring_sync_list_move(struct doveadm_connection *conn);
22537
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
82 static void doveadm_connection_cmd_run_synced(struct doveadm_connection *conn);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
84 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
85 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
86 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
87 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 struct mail_host *const *hostp;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 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
90
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
91 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
92 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
93 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
94 (*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
95 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
96 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
97 (long)(*hostp)->last_updown_change);
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
98 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
99 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 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
101 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
102 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
103 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
105 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
106 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
107 const char *const *args ATTR_UNUSED)
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
108 {
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
109 struct mail_host_list *orig_hosts_list;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
110 struct mail_host *const *orig_hosts, *const *cur_hosts;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
111 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
112 string_t *str = t_str_new(1024);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
113 int ret;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
114
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
115 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
116 conn->dir->set->director_consistent_hashing,
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
117 NULL);
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
118 (void)mail_hosts_parse_and_add(orig_hosts_list,
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
119 conn->dir->set->director_mail_servers);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
120
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
121 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
122 &orig_hosts_count);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
123 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
124 &cur_hosts_count);
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
125
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
126 /* the hosts are sorted by IP */
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
127 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
128 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
129 if (ret == 0)
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
130 i++, j++;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
131 else if (ret > 0)
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
132 j++;
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
133 else {
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
134 str_printfa(str, "%s\n",
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
135 net_ip2addr(&orig_hosts[i]->ip));
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
136 i++;
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 }
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
139 for (; i < orig_hosts_count; i++)
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
140 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
141 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
142 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
143
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
144 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
145 return DOVEADM_DIRECTOR_CMD_RET_OK;
12986
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
146 }
c838d40bd38e doveadm: Added "director dump" command.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
147
22631
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
148 static void
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
149 doveadm_director_host_append_status(const struct director_host *host,
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
150 const char *type, string_t *str)
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
151 {
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
152 time_t last_failed = I_MAX(host->last_network_failure,
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
153 host->last_protocol_failure);
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
154 str_printfa(str, "%s\t%u\t%s\t%ld\t",
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
155 net_ip2addr(&host->ip), host->port, type,
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
156 (long)last_failed);
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
157 }
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
158
18062
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
159 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
160 {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
161 if (!dir->ring_handshaked)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
162 str_append(str, "handshaking");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
163 else if (dir->ring_synced)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
164 str_append(str, "synced");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
165 else {
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
166 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
167 (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
168 }
22630
0170e1657f4d doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22571
diff changeset
169 str_printfa(str, "\t%u", dir->last_sync_msecs);
18062
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
170 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
171
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
172 static void
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
173 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
174 string_t *str)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
175 {
22630
0170e1657f4d doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22571
diff changeset
176 struct director_connection_status status;
0170e1657f4d doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22571
diff changeset
177
18062
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
178 if (!director_connection_is_handshaked(conn))
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
179 str_append(str, "handshaking");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
180 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
181 str_append(str, "synced");
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
182 else
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
183 str_append(str, "syncing");
22630
0170e1657f4d doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22571
diff changeset
184
0170e1657f4d doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22571
diff changeset
185 director_connection_get_status(conn, &status);
0170e1657f4d doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22571
diff changeset
186 str_printfa(str, "\t%u\t%"PRIuUOFF_T"\t%"PRIuUOFF_T"\t%zu\t%zu\t"
0170e1657f4d doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22571
diff changeset
187 "%ld\t%ld", status.last_ping_msecs,
0170e1657f4d doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22571
diff changeset
188 status.bytes_read, status.bytes_sent,
0170e1657f4d doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22571
diff changeset
189 status.bytes_buffered, status.peak_bytes_buffered,
0170e1657f4d doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22571
diff changeset
190 (long)status.last_input.tv_sec,
0170e1657f4d doveadm director ring status: Add more fields related to connection status
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22571
diff changeset
191 (long)status.last_output.tv_sec);
18062
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
192 }
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
193
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
194 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
195 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
196 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
197 {
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
198 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
199 struct director_host *const *hostp;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 string_t *str = t_str_new(1024);
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
201 const char *type;
22631
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
202 struct director_connection *const *connp;
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
203 ARRAY(struct director_host *) hosts;
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
204
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
205 t_array_init(&hosts, array_count(&dir->dir_hosts));
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
206 array_append_array(&hosts, &dir->dir_hosts);
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
207
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
208 /* show each individual connection */
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
209 array_foreach(&dir->connections, connp) {
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
210 const struct director_host *host =
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
211 director_connection_get_host(*connp);
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
212 /* NOTE: for incoming connections host is initially NULL */
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213
22631
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
214 array_foreach(&hosts, hostp) {
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
215 if (*hostp == host) {
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
216 array_delete(&hosts,
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
217 array_foreach_idx(&hosts, hostp), 1);
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
218 break;
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
219 }
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
220 }
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
221 if (*connp == dir->left)
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
222 type = "left";
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
223 else if (*connp == dir->right)
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
224 type = "right";
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
225 else if (director_connection_is_incoming(*connp))
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
226 type = "in";
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
227 else
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
228 type = "out";
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
229
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
230 if (host != NULL)
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
231 doveadm_director_host_append_status(host, type, str);
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
232 doveadm_director_connection_append_status(*connp, str);
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
233 str_append_c(str, '\n');
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
234 }
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
235
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
236 /* show the rest of the hosts that don't have any connections */
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
237 array_foreach(&hosts, hostp) {
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
238 const struct director_host *host = *hostp;
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
239
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
240 if (host->removed)
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
241 type = "removed";
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
242 else if (dir->self_host == host)
13320
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
243 type = "self";
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
244 else
63680f6e21a2 director: Updated DIRECTOR-LIST doveadm command.
Timo Sirainen <tss@iki.fi>
parents: 13045
diff changeset
245 type = "";
14432
366b9e5fc85c director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
246
22631
53082f1df8a6 director: Show each director connection in doveadm DIRECTOR-LIST
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22630
diff changeset
247 doveadm_director_host_append_status(host, type, str);
18062
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
248 if (dir->self_host == host)
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
249 doveadm_director_append_status(dir, str);
ade6dcace5cd doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents: 17725
diff changeset
250 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
251 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 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
253 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
254 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
255 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
257 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
258 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
259 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
260 {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
261 struct director_host *host;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
262 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
263 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
264
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
265 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
266 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
267 (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
268 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
269 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
270 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
271
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
272 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
273 host = director_host_add(conn->dir, &ip, port);
22562
3af1ba6b5248 director: Log info line whenever a director is added/removed from ring
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22559
diff changeset
274 director_notify_ring_added(host, conn->dir->self_host, TRUE);
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
275 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
276 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
277 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
278 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
279
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
280 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
281 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
282 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
283 {
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
284 struct director_host *host;
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
285 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
286 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
287
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
288 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
289 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
290 (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
291 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
292 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
293 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
294
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
295 host = port != 0 ?
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
296 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
297 director_host_lookup_ip(conn->dir, &ip);
22571
4057b92ed502 director: Don't crash on doveadm director ring remove for unknown director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22569
diff changeset
298 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
299 o_stream_nsend_str(conn->output, "NOTFOUND\n");
22571
4057b92ed502 director: Don't crash on doveadm director ring remove for unknown director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22569
diff changeset
300 return DOVEADM_DIRECTOR_CMD_RET_OK;
4057b92ed502 director: Don't crash on doveadm director ring remove for unknown director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22569
diff changeset
301 } else {
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
302 director_ring_remove(host, conn->dir->self_host);
22571
4057b92ed502 director: Don't crash on doveadm director ring remove for unknown director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22569
diff changeset
303 return DOVEADM_DIRECTOR_CMD_RET_RING_SYNC_OK;
4057b92ed502 director: Don't crash on doveadm director ring remove for unknown director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22569
diff changeset
304 }
14571
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
305 }
42cca8a1d179 director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents: 14471
diff changeset
306
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
307 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
308 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
309 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
310 {
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
311 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
312 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
313 struct mail_host *host;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 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
315 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
316
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
317 ip_str = args[0];
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
318 if (ip_str != NULL) {
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
319 tag = strchr(ip_str, '@');
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
320 if (tag == NULL)
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
321 tag = "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
322 else
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
323 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
324 }
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
325 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
326 (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
327 (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
328 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
329 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
330 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
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 > 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
333 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
334 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
335 }
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
336 host = mail_host_lookup(dir->mail_hosts, &ip);
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
337 if (host == NULL) {
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
338 if (update) {
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
339 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
340 return DOVEADM_DIRECTOR_CMD_RET_OK;
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
341 }
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
342 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
343 } 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
344 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
345 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
346 } 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
347 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
348 "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
349 return DOVEADM_DIRECTOR_CMD_RET_OK;
19078
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
350 }
15904
d3cf06639864 Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
351 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
352 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
353 /* 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
354 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
355 handle. */
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
356 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
357
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
358 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
359 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
361 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
362 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
363 {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
364 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
365 }
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
366
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
367 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
368 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
369 {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
370 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
371 }
7ac9ec913a39 doveadm director update command added.
Timo Sirainen <tss@iki.fi>
parents: 19035
diff changeset
372
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
373 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
374 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
375 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
376 {
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
377 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
378 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
379
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
380 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
381 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
382 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
383 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
384 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
385 }
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
386 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
387 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
388 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
389 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
390 }
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
391 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
392 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
393 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
394 } 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
395 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
396 "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
397 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
398 } else {
21842
86e52ff70044 director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents: 21443
diff changeset
399 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
400 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
401 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
402 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
403 }
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
404 }
0ee3e734249a director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents: 18709
diff changeset
405
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
406 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
407 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
408 const char *const *args)
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
409 {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
410 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
411 }
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
412
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
413 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
414 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
415 const char *const *args)
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
416 {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
417 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
418 }
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
419
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
420 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
421 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
422 const char *const *args)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 struct mail_host *host;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 struct ip_addr ip;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
427 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
428 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
429 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
430 }
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
431 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
432 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
433 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
434 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
435 } else {
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
436 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
437 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
438 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
439 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441
11355
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
442 static void
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
443 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
444 {
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
445 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
446 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
447
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
448 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
449 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
450 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
451 NULL, *hostp);
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
452 }
17725
bd381e882485 director: Log a warning when using "director host flush" for all hosts.
Timo Sirainen <tss@iki.fi>
parents: 17418
diff changeset
453 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
454 "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
455 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
456 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
457 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
458
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
459 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
460 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
461 {
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
462 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
463 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
464
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
465 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
466 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
467 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
468 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
469
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
470 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
471 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
472 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
473 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
474 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
475 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
476 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
477 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
478 } else {
11629
a07aa85f68c9 director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents: 11585
diff changeset
479 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
480 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
481 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
482 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
483 }
ef1de95396d4 Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents: 11353
diff changeset
484
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
485 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
486 {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
487 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
488
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
489 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
490 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
491 if (cmd->_conn != NULL)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
492 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
493 i_free(cmd);
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
494 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
495
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
496 static bool
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
497 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
498 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
499 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
500 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
501 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
502 struct mail_host *new_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
503
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
504 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
505 return FALSE;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
506
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
507 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
508 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
509
22552
7b8e95de2bff director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22537
diff changeset
510 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
511 cmd->iter = director_iterate_users_init(dir);
22552
7b8e95de2bff director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22537
diff changeset
512 cmd->users_killed = FALSE;
7b8e95de2bff director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22537
diff changeset
513 }
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
514
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
515 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
516 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
517 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
518
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
519 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
520 user->username_hash,
7e47f561ad49 director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents: 19407
diff changeset
521 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
522 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
523 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
524 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
525 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
526 } else {
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
527 /* 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
528 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
529 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
530 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
531 TRUE);
22552
7b8e95de2bff director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22537
diff changeset
532 cmd->users_killed = 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
533 }
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
534 } T_END;
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
535 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
536 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
537 }
22552
7b8e95de2bff director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22537
diff changeset
538 if (user == NULL) {
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
539 director_iterate_users_deinit(&cmd->iter);
22552
7b8e95de2bff director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22537
diff changeset
540 if (cmd->users_killed) {
7b8e95de2bff director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22537
diff changeset
541 /* no more backends. we already sent kills. now remove
7b8e95de2bff director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22537
diff changeset
542 the users entirely from the host. */
7b8e95de2bff director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22537
diff changeset
543 director_flush_host(dir, dir->self_host, NULL, host);
7b8e95de2bff director: Fix HOST-RESET-USERS when all hosts are down
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22537
diff changeset
544 }
22506
3afbfedcdd31 director: Fix crash when flush is run and all backends are down.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21842
diff changeset
545 }
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
546 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
547 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
548 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
549 }
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
550
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
551 static bool
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
552 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
553 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
554 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
555 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
556
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
557 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
558 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
559 count = cmd->hosts_count;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
560 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
561 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
562 return FALSE;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
563 cmd->host_idx++;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
564 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
565 if (cmd->_conn != NULL) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
566 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
567
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
568 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
569 if (conn->io == NULL)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
570 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
571 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
572 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
573 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
574 }
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
575
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
576 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
577 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
578 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
579 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
580 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
581 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
582 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
583 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
584 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
585
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
586 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
587 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
588 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
589 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
590 }
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
591
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
592 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
593 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
594 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
595 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
596 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
597 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
598 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
599
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
600 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
601 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
602 break;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
603 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
604 if (i == count) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
605 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
606 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
607 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
608 count = i+1;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
609 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
610
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
611 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
612 cmd->dir = conn->dir;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
613 cmd->_conn = conn;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
614 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
615 cmd->host_idx = i;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
616 cmd->hosts_count = count;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
617 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
618
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
619 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
620 /* 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
621 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
622 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
623 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
624 }
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
625 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
626 }
618c8d76bc5d director: Added HOST-RESET-USERS command to move users to their hash-assigned hosts.
Timo Sirainen <tss@iki.fi>
parents: 18541
diff changeset
627
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
628 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
629 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
630 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
631 {
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
632 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
633 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
634 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
635 unsigned int username_hash;
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
636 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
637 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
638
18067
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
639 if (args[0] == NULL) {
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
640 username = "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
641 tag = "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
642 } else {
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
643 username = args[0];
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
644 tag = args[1] != NULL ? args[1] : "";
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
645 }
a7e830b9b967 director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents: 18065
diff changeset
646 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
647 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
648
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
649 /* get user's current host */
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
650 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
651 user = mail_tag == NULL ? NULL :
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
652 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
653 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
654 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
655 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
656 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
657 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
658 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
659 }
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
660
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
661 /* 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
662 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
663 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
664 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
665 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
666 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
667
1bc3d5589c5a doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
668 /* 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
669 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
670 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
671 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
672 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
673 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
674 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
675 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
676 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
677 }
c57c1ff9c5f1 doveadm director status username now returns which server the user is assigned to.
Timo Sirainen <tss@iki.fi>
parents: 11322
diff changeset
678
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
679 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
680 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
681 {
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
682 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
683 struct user *user;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
684 struct ip_addr ip;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
685
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
686 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
687 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
688 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
689 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
690 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
691 } else {
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
692 ip.family = 0;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
693 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
694
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
695 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
696 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
697 if (ip.family == 0 ||
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
698 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
699 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
700 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
701
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
702 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
703 "%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
704 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
705 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
706 } T_END;
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
707 }
21075
6a363cb51d7f director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21074
diff changeset
708 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
709 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
710 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
711 }
4138737f41e6 doveadm: Added "director map" command to list user -> host mappings.
Timo Sirainen <tss@iki.fi>
parents: 11629
diff changeset
712
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
713 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
714 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
715 {
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
716 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
717 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
718 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
719 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
720
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
721 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
722 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
723 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
724 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
725 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
726 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
727 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
728 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
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
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
732 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
733 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
734
21079
d6f399a7f672 director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21076
diff changeset
735 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
736 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
737 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
738 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
739 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
740
21432
14e13ad7efde director: Ignore doveadm user move if host is already the same.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
741 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
742 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
743 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
744 } else {
2b9164c4299a director: "doveadm director move" to same host now refreshes user's timeout
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21432
diff changeset
745 /* 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
746 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
747 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
748 }
14681
ca37d1577291 Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents: 14571
diff changeset
749 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
750 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
751 }
79f9dce5d5fd director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents: 12986
diff changeset
752
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
753 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
754 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
755 {
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
756 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
757 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
758 return DOVEADM_DIRECTOR_CMD_RET_FAIL;
17418
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
759 }
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
760
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
761 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
762 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
763 return DOVEADM_DIRECTOR_CMD_RET_OK;
17418
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
764 }
64808a9703db doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
765
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
766 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
767 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
768 {
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
769 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
770 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
771 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
772 }
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
773
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
774 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
775 args[0], args[1]);
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
776 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
777 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
778 }
f9db0ad9001e director: doveadm command handling was missing USER-KICK-ALT
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21079
diff changeset
779
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
780 struct {
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
781 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
782 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
783 (struct doveadm_connection *conn, const char *const *args);
22537
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
784 enum doveadm_director_cmd_flag flags;
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
785 } doveadm_director_commands[] = {
22537
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
786 { "HOST-LIST", doveadm_cmd_host_list, 0 },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
787 { "HOST-LIST-REMOVED", doveadm_cmd_host_list_removed, 0 },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
788 { "DIRECTOR-LIST", doveadm_cmd_director_list, 0 },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
789 { "DIRECTOR-ADD", doveadm_cmd_director_add, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
790 { "DIRECTOR-REMOVE", doveadm_cmd_director_remove, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
791 { "HOST-SET", doveadm_cmd_host_set, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
792 { "HOST-UPDATE", doveadm_cmd_host_update, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
793 { "HOST-UP", doveadm_cmd_host_up, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
794 { "HOST-DOWN", doveadm_cmd_host_down, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
795 { "HOST-REMOVE", doveadm_cmd_host_remove, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
796 { "HOST-FLUSH", doveadm_cmd_host_flush, DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
797 { "HOST-RESET-USERS", doveadm_cmd_host_reset_users, 0 },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
798 { "USER-LOOKUP", doveadm_cmd_user_lookup, 0 },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
799 { "USER-LIST", doveadm_cmd_user_list, 0 },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
800 { "USER-MOVE", doveadm_cmd_user_move, 0 },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
801 { "USER-KICK", doveadm_cmd_user_kick, 0 },
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
802 { "USER-KICK-ALT", doveadm_cmd_user_kick_alt, 0 },
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
803 };
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
804
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
805 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
806 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
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 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
809 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
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 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
812 io_set_pending(conn->io);
22537
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
813
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
814 i_free_and_null(conn->cmd_pending_args);
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
815 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
816
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
817 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
818 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
819 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
820 {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
821 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
822 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
823
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
824 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
825 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
826 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
827 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
828 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
829 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
830 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
831 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
832
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
833 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
834 {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
835 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
836 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
837
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
838 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
839 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
840 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
841 {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
842 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
843
22537
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
844 if ((doveadm_director_commands[i].flags &
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
845 DOVEADM_DIRECTOR_CMD_FLAG_PRE_RING_SYNC) != 0 &&
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
846 !conn->dir->ring_synced) {
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
847 /* wait for ring to be synced before running the command */
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
848 conn->cmd_pending_args = p_strarray_dup(default_pool, args);
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
849 conn->cmd_pending_idx = i;
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
850 doveadm_connection_set_ring_sync_callback(conn,
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
851 doveadm_connection_cmd_run_synced);
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
852 return DOVEADM_DIRECTOR_CMD_RET_UNFINISHED;
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
853 }
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
854
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
855 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
856 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
857 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
858 /* 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
859 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
860 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
861 /* 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
862 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
863 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
864 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
865 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
866 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
867 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
868 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
869
22537
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
870 static void doveadm_connection_cmd_run_synced(struct doveadm_connection *conn)
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
871 {
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
872 const char **args = conn->cmd_pending_args;
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
873
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
874 conn->cmd_pending_args = NULL;
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
875 (void)doveadm_connection_cmd_run(conn, args, conn->cmd_pending_idx);
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
876 i_free(args);
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
877 }
4e3e963c32f0 director: Run director/host changing doveadm commands only after ring is synced
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22536
diff changeset
878
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
879 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
880 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
881 {
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
882 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
883
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
884 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
885 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
886 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
887 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
888 }
20970
d653bcdff8a2 director: Code cleanup - Give tab-unescaped args to all doveadm command handlers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20969
diff changeset
889 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
890 args++;
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
891
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
892 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
893 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
894 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
895 }
22534
30549d635210 director: Cleanup - Move all doveadm commands into an array.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22510
diff changeset
896 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
897 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
898 }
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
899
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
900 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
901 {
20967
1be6845a989b director: Code cleanup - moved command handling to its own function.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20963
diff changeset
902 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
903 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
904
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
905 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
906 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
907 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
908 doveadm_connection_deinit(&conn);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
909 return;
11894
06a7435b6f53 director: If doveadm connection disconnects before handshake, don't loop forever.
Timo Sirainen <tss@iki.fi>
parents: 11823
diff changeset
910 }
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
911
11458
4274d1549fa0 Added version_string_verify() and removed code duplication with it.
Timo Sirainen <tss@iki.fi>
parents: 11373
diff changeset
912 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
913 DOVEADM_PROTOCOL_VERSION_MAJOR)) {
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
914 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
915 "(mixed old and new binaries?)");
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
916 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
917 return;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
918 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
919 conn->handshaked = TRUE;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
920 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
921
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
922 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
923 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
924 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
925 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
926 } T_END;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
927 }
22535
2805abc195e1 director: Cleanup - Doveadm commands now return enum doveadm_director_cmd_ret
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22534
diff changeset
928 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
929 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
930 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
931 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
932
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
933 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
934 {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
935 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
936 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
937
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
938 struct doveadm_connection *
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
939 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
940 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
941 struct doveadm_connection *conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
942
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
943 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
944 conn->fd = fd;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
945 conn->dir = dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
946 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
947 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
948 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
949 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
950 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
951
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
952 DLLIST_PREPEND(&doveadm_connections, conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
953 return conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
954 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
955
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
956 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
957 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
958 struct doveadm_connection *conn = *_conn;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
959
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
960 *_conn = NULL;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
961
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
962 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
963
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
964 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
965 /* 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
966 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
967 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
968
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
969 DLLIST_REMOVE(&doveadm_connections, conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
970 io_remove(&conn->io);
11322
12316378922e director: Memory leak fix.
Timo Sirainen <tss@iki.fi>
parents: 11321
diff changeset
971 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
972 o_stream_unref(&conn->output);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
973 if (close(conn->fd) < 0)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
974 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
975 i_free(conn);
11373
26cfc1c3a4b1 director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents: 11355
diff changeset
976
26cfc1c3a4b1 director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents: 11355
diff changeset
977 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
978 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
979
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
980 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
981 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
982 {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
983 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
984 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
985 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
986 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
987
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
988 void doveadm_connections_deinit(void)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
989 {
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
990 while (reset_cmds != NULL)
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
991 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
992
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
993 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
994 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
995 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
996 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
997 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
998 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
999 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
1000 while (doveadm_connections != NULL) {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1001 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
1002
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1003 doveadm_connection_deinit(&conn);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1004 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1005 }
20976
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
1006
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
1007 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
1008 {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
1009 while (reset_cmds != NULL) {
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
1010 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
1011 break;
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
1012 }
39d96d2dad95 director: HOST-RESET-USERS moves users more slowly now.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20970
diff changeset
1013 }
22536
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
1014
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
1015 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
1016 {
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
1017 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
1018 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
1019 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
1020 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
1021 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
1022
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
1023 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
1024 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
1025 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
1026 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
1027 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
1028 }
5f09f6aa089b director: doveadm HOST-* commands now wait for ring sync before returning OK
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22535
diff changeset
1029 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
1030 }