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