Mercurial > dovecot > core-2.2
annotate src/director/director-connection.c @ 14674:efd276ab2577
Merged changes from v2.1 tree.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 24 Jun 2012 20:57:06 +0300 |
parents | c93ca5e46a8a 7be9411da17b |
children | ca37d1577291 |
rev | line source |
---|---|
14133
ba770cba5598
Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents:
13941
diff
changeset
|
1 /* Copyright (c) 2010-2012 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 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
3 /* |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
4 Handshaking: |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
5 |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
6 Incoming director connections send: |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
7 |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
8 VERSION |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
9 ME |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
10 <wait for DONE from remote handshake> |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
11 DONE |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
12 <make this connection our "left" connection, potentially disconnecting |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
13 another one> |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
14 |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
15 Outgoing director connections send: |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
16 |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
17 VERSION |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
18 ME |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
19 [0..n] DIRECTOR |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
20 HOST-HAND-START |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
21 [0..n] HOST |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
22 HOST-HAND-END |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
23 [0..n] USER |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
24 <possibly other non-handshake commands between USERs> |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
25 DONE |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
26 <wait for DONE from remote> |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
27 <make this connection our "right" connection, potentially disconnecting |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
28 another one> |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
29 */ |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
30 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 #include "lib.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 #include "ioloop.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 #include "array.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 #include "network.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 #include "istream.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 #include "ostream.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 #include "str.h" |
11373
26cfc1c3a4b1
director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents:
11355
diff
changeset
|
38 #include "master-service.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 #include "mail-host.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 #include "director.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 #include "director-host.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 #include "director-request.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 #include "user-directory.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 #include "director-connection.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 #include <stdlib.h> |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 #include <unistd.h> |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 #define MAX_INBUF_SIZE 1024 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 #define MAX_OUTBUF_SIZE (1024*1024*10) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 #define OUTBUF_FLUSH_THRESHOLD (1024*128) |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
52 /* Max idling time before "ME" command must have been received, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
53 or we'll disconnect. */ |
14467 | 54 #define DIRECTOR_CONNECTION_ME_TIMEOUT_MSECS (10*1000) |
14477
ea5b949a623b
director: Increased timeout for sending USER data in handshake.
Timo Sirainen <tss@iki.fi>
parents:
14476
diff
changeset
|
55 /* Max time to wait for USERs in handshake to be sent. With a lot of users the |
ea5b949a623b
director: Increased timeout for sending USER data in handshake.
Timo Sirainen <tss@iki.fi>
parents:
14476
diff
changeset
|
56 kernel may quickly eat up everything we send, while the receiver is busy |
ea5b949a623b
director: Increased timeout for sending USER data in handshake.
Timo Sirainen <tss@iki.fi>
parents:
14476
diff
changeset
|
57 parsing the data. */ |
14483
10f5456704a7
director: USER sending timeout was higher than it needed to be.
Timo Sirainen <tss@iki.fi>
parents:
14482
diff
changeset
|
58 #define DIRECTOR_CONNECTION_SEND_USERS_TIMEOUT_MSECS (30*1000) |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
59 /* Max idling time before "DONE" command must have been received, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
60 or we'll disconnect. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
61 #define DIRECTOR_CONNECTION_DONE_TIMEOUT_MSECS (30*1000) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
62 /* How long to wait for PONG for an idling connection */ |
14467 | 63 #define DIRECTOR_CONNECTION_PING_IDLE_TIMEOUT_MSECS (10*1000) |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
64 /* Maximum time to wait for PONG reply */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
65 #define DIRECTOR_CONNECTION_PONG_TIMEOUT_MSECS (60*1000) |
11586
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
66 /* How long to wait to send PING when connection is idle */ |
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
67 #define DIRECTOR_CONNECTION_PING_INTERVAL_MSECS (15*1000) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
68 /* How long to wait before sending PING while waiting for SYNC reply */ |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
69 #define DIRECTOR_CONNECTION_PING_SYNC_INTERVAL_MSECS 1000 |
12065
ff5a47012287
director: If outgoing connection dies soon, mark the host as failed to avoid immediate reconnect.
Timo Sirainen <tss@iki.fi>
parents:
11816
diff
changeset
|
70 /* If outgoing director connection exists for less than this many seconds, |
ff5a47012287
director: If outgoing connection dies soon, mark the host as failed to avoid immediate reconnect.
Timo Sirainen <tss@iki.fi>
parents:
11816
diff
changeset
|
71 mark the host as failed so we won't try to reconnect to it immediately */ |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
72 #define DIRECTOR_SUCCESS_MIN_CONNECT_SECS 40 |
14575
dbe6d05fd595
director: When we find unwanted connection, wait for 10s for it to disconnect us, not 10ms.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
73 #define DIRECTOR_WAIT_DISCONNECT_SECS 10 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
75 #if DIRECTOR_CONNECTION_DONE_TIMEOUT_MSECS <= DIRECTOR_CONNECTION_PING_TIMEOUT_MSECS |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
76 # error DIRECTOR_CONNECTION_DONE_TIMEOUT_MSECS is too low |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
77 #endif |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
78 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
79 #if DIRECTOR_CONNECTION_PONG_TIMEOUT_MSECS <= DIRECTOR_CONNECTION_PING_IDLE_TIMEOUT_MSECS |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
80 # error DIRECTOR_CONNECTION_PONG_TIMEOUT_MSECS is too low |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
81 #endif |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
82 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
83 #define CMD_IS_USER_HANDHAKE(args) \ |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
84 (str_array_length(args) > 2) |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
85 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 struct director_connection { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 struct director *dir; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
88 char *name; |
12065
ff5a47012287
director: If outgoing connection dies soon, mark the host as failed to avoid immediate reconnect.
Timo Sirainen <tss@iki.fi>
parents:
11816
diff
changeset
|
89 time_t created; |
14431
084064444f89
director: Don't try to send the new SYNC parameter to old director versions.
Timo Sirainen <tss@iki.fi>
parents:
14409
diff
changeset
|
90 unsigned int minor_version; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 /* for incoming connections the director host isn't known until |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 ME-line is received */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 struct director_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 int fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 struct io *io; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 struct istream *input; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 struct ostream *output; |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
100 struct timeout *to_disconnect, *to_ping, *to_pong; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 struct user_directory_iter *user_iter; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
104 /* set during command execution */ |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
105 const char *cur_cmd, *cur_line; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
106 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 unsigned int in:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 unsigned int connected:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 unsigned int version_received:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 unsigned int me_received:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 unsigned int handshake_received:1; |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
112 unsigned int ignore_host_events:1; |
11585 | 113 unsigned int handshake_sending_hosts:1; |
11586
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
114 unsigned int ping_waiting:1; |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
115 unsigned int synced:1; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
116 unsigned int wrong_host:1; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
117 unsigned int verifying_left:1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
120 static void director_connection_disconnected(struct director_connection **conn); |
14479
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
121 static void director_connection_reconnect(struct director_connection **conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
123 static void ATTR_FORMAT(2, 3) |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
124 director_cmd_error(struct director_connection *conn, const char *fmt, ...) |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
125 { |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
126 va_list args; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
127 |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
128 va_start(args, fmt); |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
129 i_error("director(%s): Command %s: %s (input: %s)", conn->name, |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
130 conn->cur_cmd, t_strdup_vprintf(fmt, args), conn->cur_line); |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
131 va_end(args); |
14479
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
132 |
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
133 conn->host->last_protocol_failure = ioloop_time; |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
134 } |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
135 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
136 static void |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
137 director_connection_init_timeout(struct director_connection *conn) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
138 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
139 unsigned int secs = ioloop_time - conn->created; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
140 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
141 if (!conn->connected) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
142 i_error("director(%s): Connect timed out (%u secs)", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
143 conn->name, secs); |
14476
8245a97bf36c
director: Improved error message
Timo Sirainen <tss@iki.fi>
parents:
14475
diff
changeset
|
144 } else if (conn->io == NULL) { |
8245a97bf36c
director: Improved error message
Timo Sirainen <tss@iki.fi>
parents:
14475
diff
changeset
|
145 i_error("director(%s): Sending handshake (%u secs)", |
8245a97bf36c
director: Improved error message
Timo Sirainen <tss@iki.fi>
parents:
14475
diff
changeset
|
146 conn->name, secs); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
147 } else if (!conn->me_received) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
148 i_error("director(%s): Handshaking ME timed out (%u secs)", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
149 conn->name, secs); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
150 } else { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
151 i_error("director(%s): Handshaking DONE timed out (%u secs)", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
152 conn->name, secs); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
153 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
154 director_connection_disconnected(&conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
155 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
156 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
157 static void |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
158 director_connection_set_ping_timeout(struct director_connection *conn) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
159 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
160 unsigned int msecs; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
161 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
162 msecs = conn->synced || !conn->handshake_received ? |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
163 DIRECTOR_CONNECTION_PING_INTERVAL_MSECS : |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
164 DIRECTOR_CONNECTION_PING_SYNC_INTERVAL_MSECS; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
165 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
166 timeout_remove(&conn->to_ping); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
167 conn->to_ping = timeout_add(msecs, director_connection_ping, conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
168 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
169 |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
170 static void director_connection_wait_timeout(struct director_connection *conn) |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
171 { |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
172 director_connection_deinit(&conn); |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
173 } |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
174 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
175 static void director_connection_send_connect(struct director_connection *conn, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
176 struct director_host *host) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
177 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
178 const char *connect_str; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
179 |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
180 if (conn->to_disconnect != NULL) |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
181 return; |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
182 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
183 connect_str = t_strdup_printf("CONNECT\t%s\t%u\n", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
184 net_ip2addr(&host->ip), host->port); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
185 director_connection_send(conn, connect_str); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
186 (void)o_stream_flush(conn->output); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
187 o_stream_uncork(conn->output); |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
188 |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
189 conn->to_disconnect = |
14575
dbe6d05fd595
director: When we find unwanted connection, wait for 10s for it to disconnect us, not 10ms.
Timo Sirainen <tss@iki.fi>
parents:
14571
diff
changeset
|
190 timeout_add(DIRECTOR_WAIT_DISCONNECT_SECS*1000, |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
191 director_connection_wait_timeout, conn); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
192 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
193 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
194 static void director_connection_assigned(struct director_connection *conn) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
195 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
196 struct director *dir = conn->dir; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
197 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
198 if (dir->left != NULL && dir->right != NULL) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
199 /* we're connected to both directors. see if the ring is |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
200 finished by sending a SYNC. if we get it back, it's done. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
201 dir->sync_seq++; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
202 director_set_ring_unsynced(dir); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
203 director_sync_send(dir, dir->self_host, dir->sync_seq, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
204 DIRECTOR_VERSION_MINOR); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
205 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
206 director_connection_set_ping_timeout(conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
207 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
208 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
209 static bool director_connection_assign_left(struct director_connection *conn) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
210 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
211 struct director *dir = conn->dir; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
212 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
213 i_assert(conn->in); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
214 i_assert(dir->left != conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
215 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
216 /* make sure this is the correct incoming connection */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
217 if (conn->host->self) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
218 i_error("Connection from self, dropping"); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
219 return FALSE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
220 } else if (dir->left == NULL) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
221 /* no conflicts yet */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
222 } else if (dir->left->host == conn->host) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
223 i_info("Dropping existing connection %s " |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
224 "in favor of its new connection %s", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
225 dir->left->host->name, conn->host->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
226 director_connection_deinit(&dir->left); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
227 } else if (dir->left->verifying_left) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
228 /* we're waiting to verify if our current left is still |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
229 working. if we don't receive a PONG, the current left |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
230 gets disconnected and a new left gets assigned. if we do |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
231 receive a PONG, we'll wait until the current left |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
232 disconnects us and then reassign the new left. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
233 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
234 } else if (director_host_cmp_to_self(dir->left->host, conn->host, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
235 dir->self_host) < 0) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
236 /* the old connection is the correct one. |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
237 refer the client there (FIXME: do we ever get here?) */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
238 i_warning("Director connection %s tried to connect to " |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
239 "us, should use %s instead", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
240 conn->name, dir->left->host->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
241 director_connection_send_connect(conn, dir->left->host); |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
242 return TRUE; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
243 } else { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
244 /* this new connection is the correct one, but wait until the |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
245 old connection gets disconnected before using this one. |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
246 that guarantees that the director inserting itself into |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
247 the ring has finished handshaking its left side, so the |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
248 switch will be fast. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
249 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
250 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
251 dir->left = conn; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
252 i_free(conn->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
253 conn->name = i_strdup_printf("%s/left", conn->host->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
254 director_connection_assigned(conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
255 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
256 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
257 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
258 static void director_assign_left(struct director *dir) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
259 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
260 struct director_connection *conn, *const *connp; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
261 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
262 array_foreach(&dir->connections, connp) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
263 conn = *connp; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
264 |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
265 if (conn->in && conn->handshake_received && |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
266 conn->to_disconnect == NULL && conn != dir->left) { |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
267 /* either use this or disconnect it */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
268 if (!director_connection_assign_left(conn)) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
269 /* we don't want this */ |
14437
3771ff9c04d2
director: Fixed disconnecting unwanted connection.
Timo Sirainen <tss@iki.fi>
parents:
14432
diff
changeset
|
270 director_connection_deinit(&conn); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
271 director_assign_left(dir); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
272 break; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
273 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
274 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
275 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
276 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
277 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
278 static bool director_has_outgoing_connections(struct director *dir) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
279 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
280 struct director_connection *const *connp; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
281 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
282 array_foreach(&dir->connections, connp) { |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
283 if (!(*connp)->in && (*connp)->to_disconnect == NULL) |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
284 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
285 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
286 return FALSE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
287 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
288 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
289 static bool director_connection_assign_right(struct director_connection *conn) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
290 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
291 struct director *dir = conn->dir; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
292 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
293 i_assert(!conn->in); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
294 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
295 if (dir->right != NULL) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
296 /* see if we should disconnect or keep the existing |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
297 connection. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
298 if (director_host_cmp_to_self(conn->host, dir->right->host, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
299 dir->self_host) <= 0) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
300 /* the old connection is the correct one */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
301 i_warning("Aborting incorrect outgoing connection to %s " |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
302 "(already connected to correct one: %s)", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
303 conn->host->name, dir->right->host->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
304 conn->wrong_host = TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
305 return FALSE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
306 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
307 i_info("Replacing right director connection %s with %s", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
308 dir->right->host->name, conn->host->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
309 director_connection_deinit(&dir->right); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
310 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
311 dir->right = conn; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
312 i_free(conn->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
313 conn->name = i_strdup_printf("%s/right", conn->host->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
314 director_connection_assigned(conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
315 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
316 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
317 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 static bool |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 director_args_parse_ip_port(struct director_connection *conn, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 const char *const *args, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 struct ip_addr *ip_r, unsigned int *port_r) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
323 if (args[0] == NULL || args[1] == NULL) { |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
324 director_cmd_error(conn, "Missing IP+port parameters"); |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
325 return FALSE; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
326 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 if (net_addr2ip(args[0], ip_r) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
328 director_cmd_error(conn, "Invalid IP address: %s", args[0]); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 if (str_to_uint(args[1], port_r) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
332 director_cmd_error(conn, "Invalid port: %s", args[1]); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 static bool director_cmd_me(struct director_connection *conn, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 const char *const *args) |
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 struct director *dir = conn->dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 const char *connect_str; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 struct ip_addr ip; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 unsigned int port; |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
345 time_t next_comm_attempt; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 if (!director_args_parse_ip_port(conn, args, &ip, &port)) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 return FALSE; |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
349 if (conn->me_received) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
350 director_cmd_error(conn, "Duplicate ME"); |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
351 return FALSE; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
352 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 if (!conn->in && (!net_ip_compare(&conn->host->ip, &ip) || |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 conn->host->port != port)) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 i_error("Remote director thinks it's someone else " |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
357 "(connected to %s:%u, remote says it's %s:%u)", |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 net_ip2addr(&conn->host->ip), conn->host->port, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 net_ip2addr(&ip), port); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 conn->me_received = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
364 timeout_remove(&conn->to_ping); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
365 conn->to_ping = timeout_add(DIRECTOR_CONNECTION_DONE_TIMEOUT_MSECS, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
366 director_connection_init_timeout, conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
367 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 if (!conn->in) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
370 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
371 /* Incoming connection: |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
372 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
373 a) we don't have an established ring yet. make sure we're connecting |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
374 to our right side (which might become our left side). |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
375 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
376 b) it's our current "left" connection. the previous connection |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
377 is most likely dead. |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
378 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
379 c) we have an existing ring. tell our current "left" to connect to |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
380 it with CONNECT command. |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
381 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
382 d) the incoming connection doesn't belong to us at all, refer it |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
383 elsewhere with CONNECT. however, before disconnecting it verify |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
384 first that our left side is actually still functional. |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
385 */ |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
386 i_assert(conn->host == NULL); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
387 conn->host = director_host_get(dir, &ip, port); |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
388 /* the host shouldn't be removed at this point, but if for some |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
389 reason it is we don't want to crash */ |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
390 conn->host->removed = FALSE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
391 director_host_ref(conn->host); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
392 /* make sure we don't keep old sequence values across restarts */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
393 conn->host->last_seq = 0; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
394 |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
395 next_comm_attempt = conn->host->last_protocol_failure + |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
396 DIRECTOR_PROTOCOL_FAILURE_RETRY_SECS; |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
397 if (next_comm_attempt > ioloop_time) { |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
398 /* the director recently sent invalid protocol data, |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
399 don't try retrying yet */ |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
400 i_error("director(%s): Remote sent invalid protocol data recently, " |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
401 "waiting %u secs before allowing further communication", |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
402 conn->name, (unsigned int)(next_comm_attempt-ioloop_time)); |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
403 return FALSE; |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
404 } else if (dir->left == NULL) { |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
405 /* a) - just in case the left is also our right side reset |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
406 its failed state, so we can connect to it */ |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
407 conn->host->last_network_failure = 0; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
408 if (!director_has_outgoing_connections(dir)) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
409 director_connect(dir); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
410 } else if (dir->left->host == conn->host) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
411 /* b) */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
412 i_assert(dir->left != conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
413 director_connection_deinit(&dir->left); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
414 } else if (director_host_cmp_to_self(conn->host, dir->left->host, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
415 dir->self_host) < 0) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
416 /* c) */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
417 connect_str = t_strdup_printf("CONNECT\t%s\t%u\n", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
418 net_ip2addr(&conn->host->ip), |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
419 conn->host->port); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
420 director_connection_send(dir->left, connect_str); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
421 } else { |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
422 /* d) */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
423 dir->left->verifying_left = TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
424 director_connection_ping(dir->left); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
425 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
429 static bool |
14303
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
430 director_user_refresh(struct director_connection *conn, |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
431 unsigned int username_hash, struct mail_host *host, |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
432 time_t timestamp, bool weak, struct user **user_r) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 { |
14303
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
434 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
|
435 struct user *user; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
436 bool ret = FALSE, unset_weak_user = FALSE; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
438 user = user_directory_lookup(dir->users, username_hash); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
439 if (user == NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
440 *user_r = user_directory_add(dir->users, username_hash, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
441 host, timestamp); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
442 (*user_r)->weak = weak; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
443 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
444 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
445 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
446 if (user->weak) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
447 if (!weak) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
448 /* removing user's weakness */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
449 unset_weak_user = TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
450 user->weak = FALSE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
451 ret = TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
452 } else { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
453 /* weak user marked again as weak */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
454 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
455 } else if (weak && |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
456 !user_directory_user_is_recently_updated(dir->users, user)) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
457 /* mark the user as weak */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
458 user->weak = TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
459 ret = TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
460 } else if (user->host != host) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
461 /* non-weak user received a non-weak update with |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
462 conflicting host. this shouldn't happen. */ |
14303
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
463 string_t *str = t_str_new(128); |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
464 |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
465 str_printfa(str, "User hash %u " |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
466 "is being redirected to two hosts: %s and %s", |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
467 username_hash, net_ip2addr(&user->host->ip), |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
468 net_ip2addr(&host->ip)); |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
469 str_printfa(str, " (old_ts=%ld", (long)user->timestamp); |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
470 |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
471 if (!conn->handshake_received) { |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
472 str_printfa(str, ",handshaking,recv_ts=%ld", |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
473 (long)timestamp); |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
474 } |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
475 if (user->to_move != NULL) |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
476 str_append(str, ",moving"); |
14486
58286c1e272d
director: Minor error message fix
Timo Sirainen <tss@iki.fi>
parents:
14485
diff
changeset
|
477 if (user->kill_state != USER_KILL_STATE_NONE) |
14303
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
478 str_printfa(str, ",kill_state=%d", user->kill_state); |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
479 str_append_c(str, ')'); |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
480 i_error("%s", str_c(str)); |
11581
ecf195115922
director: If same user gets redirected to two hosts, don't crash later.
Timo Sirainen <tss@iki.fi>
parents:
11579
diff
changeset
|
481 |
11585 | 482 /* we want all the directors to redirect the user to same |
483 server, but we don't want two directors fighting over which | |
484 server it belongs to, so always use the lower IP address */ | |
485 if (net_ip_cmp(&user->host->ip, &host->ip) > 0) { | |
486 /* change the host. we'll also need to remove the user | |
487 from the old host's user_count, because we can't | |
488 keep track of the user for more than one host */ | |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
489 } else { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
490 /* keep the host */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
491 host = user->host; |
11585 | 492 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
493 ret = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
494 } |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
495 if (user->host != host) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
496 user->host->user_count--; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
497 user->host = host; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
498 user->host->user_count++; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
499 ret = TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
500 } |
14303
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
501 if (timestamp == ioloop_time && (time_t)user->timestamp != timestamp) { |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
502 user_directory_refresh(dir->users, user); |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
503 ret = TRUE; |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
504 } |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
505 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
506 if (unset_weak_user) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
507 /* user is no longer weak. handle pending requests for |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
508 this user if there are any */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
509 director_set_state_changed(conn->dir); |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
510 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
511 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 *user_r = user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
513 return ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
514 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
515 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
516 static bool |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
517 director_handshake_cmd_user(struct director_connection *conn, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
518 const char *const *args) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
520 unsigned int username_hash, timestamp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
521 struct ip_addr ip; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
522 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
523 struct user *user; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
524 bool weak; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
525 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
526 if (str_array_length(args) < 3 || |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
527 str_to_uint(args[0], &username_hash) < 0 || |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
528 net_addr2ip(args[1], &ip) < 0 || |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
529 str_to_uint(args[2], ×tamp) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
530 director_cmd_error(conn, "Invalid parameters"); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
531 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
532 } |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
533 weak = args[3] != NULL && args[3][0] == 'w'; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11350
diff
changeset
|
535 host = mail_host_lookup(conn->dir->mail_hosts, &ip); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
536 if (host == NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
537 i_error("director(%s): USER used unknown host %s in handshake", |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
538 conn->name, args[1]); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
539 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
540 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
541 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
542 director_user_refresh(conn, username_hash, host, timestamp, weak, &user); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
543 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
544 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
545 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
546 static bool |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
547 director_cmd_user(struct director_connection *conn, |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
548 const char *const *args) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
549 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
550 unsigned int username_hash; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
551 struct ip_addr ip; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
552 struct mail_host *host; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
553 struct user *user; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
554 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
555 /* NOTE: if more parameters are added, update also |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
556 CMD_IS_USER_HANDHAKE() macro */ |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
557 if (str_array_length(args) != 2 || |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
558 str_to_uint(args[0], &username_hash) < 0 || |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
559 net_addr2ip(args[1], &ip) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
560 director_cmd_error(conn, "Invalid parameters"); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
561 return FALSE; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
562 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
563 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
564 host = mail_host_lookup(conn->dir->mail_hosts, &ip); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
565 if (host == NULL) { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
566 /* we probably just removed this host. */ |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
567 return TRUE; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
568 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
569 |
14303
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
570 if (director_user_refresh(conn, username_hash, |
14487
45be27ff3414
director: Removed special (time_t)-1 code, it's not actually needed.
Timo Sirainen <tss@iki.fi>
parents:
14486
diff
changeset
|
571 host, ioloop_time, FALSE, &user)) { |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
572 i_assert(!user->weak); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
573 director_update_user(conn->dir, conn->host, user); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
574 } |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
575 return TRUE; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
576 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
577 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
578 static bool director_cmd_director(struct director_connection *conn, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
579 const char *const *args) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
580 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
581 struct director_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
582 struct ip_addr ip; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
583 unsigned int port; |
14493
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
584 bool forward = FALSE; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
585 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
586 if (!director_args_parse_ip_port(conn, args, &ip, &port)) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
587 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
588 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
589 host = director_host_lookup(conn->dir, &ip, port); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
590 if (host != NULL) { |
14493
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
591 if (host == conn->dir->self_host) { |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
592 /* ignore updates to ourself */ |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
593 return TRUE; |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
594 } |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
595 if (host->removed) { |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
596 /* ignore re-adds of removed directors */ |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
597 return TRUE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
598 } |
14493
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
599 |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
600 /* already have this. just reset its last_network_failure |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
601 timestamp, since it might be up now. */ |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
602 host->last_network_failure = 0; |
14493
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
603 if (host->last_seq != 0) { |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
604 /* it also may have been restarted, reset last_seq */ |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
605 host->last_seq = 0; |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
606 forward = TRUE; |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
607 } |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
608 } else { |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
609 /* save the director and forward it */ |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
610 host = director_host_add(conn->dir, &ip, port); |
14493
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
611 forward = TRUE; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
612 } |
14493
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
613 if (forward) { |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
614 director_notify_ring_added(host, |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
615 director_connection_get_host(conn)); |
14493
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
616 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
617 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
618 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
619 |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
620 static bool director_cmd_director_remove(struct director_connection *conn, |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
621 const char *const *args) |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
622 { |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
623 struct director_host *host; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
624 struct ip_addr ip; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
625 unsigned int port; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
626 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
627 if (!director_args_parse_ip_port(conn, args, &ip, &port)) |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
628 return FALSE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
629 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
630 host = director_host_lookup(conn->dir, &ip, port); |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
631 if (host != NULL && !host->removed) |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
632 director_ring_remove(host, director_connection_get_host(conn)); |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
633 return TRUE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
634 } |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
635 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
636 static bool |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
637 director_cmd_host_hand_start(struct director_connection *conn, |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
638 const char *const *args) |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
639 { |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
640 const ARRAY_TYPE(mail_host) *hosts; |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
641 struct mail_host *const *hostp; |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
642 unsigned int remote_ring_completed; |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
643 |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
644 if (args[0] == NULL || |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
645 str_to_uint(args[0], &remote_ring_completed) < 0) { |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
646 director_cmd_error(conn, "Invalid parameters"); |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
647 return FALSE; |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
648 } |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
649 |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
650 if (remote_ring_completed && !conn->dir->ring_handshaked) { |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
651 /* clear everything we have and use only what remote sends us */ |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11350
diff
changeset
|
652 hosts = mail_hosts_get(conn->dir->mail_hosts); |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
653 while (array_count(hosts) > 0) { |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
654 hostp = array_idx(hosts, 0); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
655 director_remove_host(conn->dir, NULL, NULL, *hostp); |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
656 } |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
657 } else if (!remote_ring_completed && conn->dir->ring_handshaked) { |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
658 /* ignore whatever remote sends */ |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
659 conn->ignore_host_events = TRUE; |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
660 } |
11585 | 661 conn->handshake_sending_hosts = TRUE; |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
662 return TRUE; |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
663 } |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
664 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
665 static int |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
666 director_cmd_is_seen(struct director_connection *conn, |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
667 const char *const **_args, |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
668 struct director_host **host_r) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
669 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
670 const char *const *args = *_args; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
671 struct ip_addr ip; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
672 unsigned int port, seq; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
673 struct director_host *host; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
674 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
675 if (str_array_length(args) < 3 || |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
676 net_addr2ip(args[0], &ip) < 0 || |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
677 str_to_uint(args[1], &port) < 0 || |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
678 str_to_uint(args[2], &seq) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
679 director_cmd_error(conn, "Invalid parameters"); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
680 return -1; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
681 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
682 *_args = args + 3; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
683 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
684 host = director_host_lookup(conn->dir, &ip, port); |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
685 if (host == NULL || host->removed) { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
686 /* director is already gone, but we can't be sure if this |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
687 command was sent everywhere. re-send it as if it was from |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
688 ourself. */ |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
689 *host_r = NULL; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
690 } else { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
691 if (seq <= host->last_seq) { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
692 /* already seen this */ |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
693 return 1; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
694 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
695 *host_r = host; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
696 host->last_seq = seq; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
697 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
698 return 0; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
699 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
700 |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
701 static bool |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
702 director_cmd_user_weak(struct director_connection *conn, |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
703 const char *const *args) |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
704 { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
705 struct director_host *dir_host; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
706 struct ip_addr ip; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
707 unsigned int username_hash; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
708 struct mail_host *host; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
709 struct user *user; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
710 struct director_host *src_host = conn->host; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
711 bool weak = TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
712 int ret; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
713 |
14671
7be9411da17b
director: Fix to handling duplicate USER-WEAK event.
Timo Sirainen <tss@iki.fi>
parents:
14575
diff
changeset
|
714 if ((ret = director_cmd_is_seen(conn, &args, &dir_host)) != 0) |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
715 return FALSE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
716 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
717 if (str_array_length(args) != 2 || |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
718 str_to_uint(args[0], &username_hash) < 0 || |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
719 net_addr2ip(args[1], &ip) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
720 director_cmd_error(conn, "Invalid parameters"); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
721 return FALSE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
722 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
723 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
724 host = mail_host_lookup(conn->dir->mail_hosts, &ip); |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
725 if (host == NULL) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
726 /* we probably just removed this host. */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
727 return TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
728 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
729 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
730 if (ret > 0) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
731 /* The entire ring has seen this USER-WEAK. |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
732 make it non-weak now. */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
733 weak = FALSE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
734 src_host = conn->dir->self_host; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
735 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
736 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
737 if (director_user_refresh(conn, username_hash, |
14487
45be27ff3414
director: Removed special (time_t)-1 code, it's not actually needed.
Timo Sirainen <tss@iki.fi>
parents:
14486
diff
changeset
|
738 host, ioloop_time, weak, &user)) { |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
739 if (!user->weak) |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
740 director_update_user(conn->dir, src_host, user); |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
741 else { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
742 director_update_user_weak(conn->dir, src_host, |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
743 dir_host, user); |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
744 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
745 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
746 return TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
747 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
748 |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14575
diff
changeset
|
749 static bool ATTR_NULL(3) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
750 director_cmd_host_int(struct director_connection *conn, const char *const *args, |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
751 struct director_host *dir_host) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
752 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
753 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
754 struct ip_addr ip; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
755 unsigned int vhost_count; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
756 bool update; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
757 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
758 if (str_array_length(args) != 2 || |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
759 net_addr2ip(args[0], &ip) < 0 || |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
760 str_to_uint(args[1], &vhost_count) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
761 director_cmd_error(conn, "Invalid parameters"); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
762 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
763 } |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
764 if (conn->ignore_host_events) { |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
765 /* remote is sending hosts in a handshake, but it doesn't have |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
766 a completed ring and we do. */ |
11585 | 767 i_assert(conn->handshake_sending_hosts); |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
768 return TRUE; |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
769 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
770 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11350
diff
changeset
|
771 host = mail_host_lookup(conn->dir->mail_hosts, &ip); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
772 if (host == NULL) { |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11350
diff
changeset
|
773 host = mail_host_add_ip(conn->dir->mail_hosts, &ip); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
774 update = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
775 } else { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
776 update = host->vhost_count != vhost_count; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
777 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
778 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
779 if (update) { |
11585 | 780 mail_host_set_vhost_count(conn->dir->mail_hosts, |
781 host, vhost_count); | |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
782 director_update_host(conn->dir, conn->host, dir_host, host); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
783 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
784 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
785 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
786 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
787 static bool |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
788 director_cmd_host_handshake(struct director_connection *conn, |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
789 const char *const *args) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
790 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
791 return director_cmd_host_int(conn, args, NULL); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
792 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
793 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
794 static bool |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
795 director_cmd_host(struct director_connection *conn, const char *const *args) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
796 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
797 struct director_host *dir_host; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
798 int ret; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
799 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
800 if ((ret = director_cmd_is_seen(conn, &args, &dir_host)) != 0) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
801 return ret > 0; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
802 return director_cmd_host_int(conn, args, dir_host); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
803 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
804 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
805 static bool |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
806 director_cmd_host_remove(struct director_connection *conn, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
807 const char *const *args) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
808 { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
809 struct director_host *dir_host; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
810 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
811 struct ip_addr ip; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
812 int ret; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
813 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
814 if ((ret = director_cmd_is_seen(conn, &args, &dir_host)) != 0) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
815 return ret > 0; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
816 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
817 if (str_array_length(args) != 1 || |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
818 net_addr2ip(args[0], &ip) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
819 director_cmd_error(conn, "Invalid parameters"); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
820 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
821 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
822 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11350
diff
changeset
|
823 host = mail_host_lookup(conn->dir->mail_hosts, &ip); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
824 if (host != NULL) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
825 director_remove_host(conn->dir, conn->host, dir_host, host); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
826 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
827 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
828 |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
829 static bool |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
830 director_cmd_host_flush(struct director_connection *conn, |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
831 const char *const *args) |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
832 { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
833 struct director_host *dir_host; |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
834 struct mail_host *host; |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
835 struct ip_addr ip; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
836 int ret; |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
837 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
838 if ((ret = director_cmd_is_seen(conn, &args, &dir_host)) != 0) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
839 return ret > 0; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
840 |
11816
9e41df232dd6
director: Fixed handling HOST-FLUSH commands.
Timo Sirainen <tss@iki.fi>
parents:
11758
diff
changeset
|
841 if (str_array_length(args) != 1 || |
9e41df232dd6
director: Fixed handling HOST-FLUSH commands.
Timo Sirainen <tss@iki.fi>
parents:
11758
diff
changeset
|
842 net_addr2ip(args[0], &ip) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
843 director_cmd_error(conn, "Invalid parameters"); |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
844 return FALSE; |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
845 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
846 |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
847 host = mail_host_lookup(conn->dir->mail_hosts, &ip); |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
848 if (host != NULL) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
849 director_flush_host(conn->dir, conn->host, dir_host, host); |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
850 return TRUE; |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
851 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
852 |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
853 static bool |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
854 director_cmd_user_move(struct director_connection *conn, |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
855 const char *const *args) |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
856 { |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
857 struct director_host *dir_host; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
858 struct mail_host *host; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
859 struct ip_addr ip; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
860 unsigned int username_hash; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
861 int ret; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
862 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
863 if ((ret = director_cmd_is_seen(conn, &args, &dir_host)) != 0) |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
864 return ret > 0; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
865 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
866 if (str_array_length(args) != 2 || |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
867 str_to_uint(args[0], &username_hash) < 0 || |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
868 net_addr2ip(args[1], &ip) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
869 director_cmd_error(conn, "Invalid parameters"); |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
870 return FALSE; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
871 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
872 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
873 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:
12935
diff
changeset
|
874 if (host != NULL) { |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
875 director_move_user(conn->dir, conn->host, dir_host, |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
876 username_hash, host); |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
877 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
878 return TRUE; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
879 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
880 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
881 static bool |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
882 director_cmd_user_killed(struct director_connection *conn, |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
883 const char *const *args) |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
884 { |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
885 unsigned int username_hash; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
886 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
887 if (str_array_length(args) != 1 || |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
888 str_to_uint(args[0], &username_hash) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
889 director_cmd_error(conn, "Invalid parameters"); |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
890 return FALSE; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
891 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
892 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
893 director_user_killed(conn->dir, username_hash); |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
894 return TRUE; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
895 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
896 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
897 static bool |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
898 director_cmd_user_killed_everywhere(struct director_connection *conn, |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
899 const char *const *args) |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
900 { |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
901 struct director_host *dir_host; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
902 unsigned int username_hash; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
903 int ret; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
904 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
905 if ((ret = director_cmd_is_seen(conn, &args, &dir_host)) != 0) |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
906 return ret > 0; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
907 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
908 if (str_array_length(args) != 1 || |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
909 str_to_uint(args[0], &username_hash) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
910 director_cmd_error(conn, "Invalid parameters"); |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
911 return FALSE; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
912 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
913 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
914 director_user_killed_everywhere(conn->dir, conn->host, |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
915 dir_host, username_hash); |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
916 return TRUE; |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
917 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
918 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
919 static bool director_handshake_cmd_done(struct director_connection *conn) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
920 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
921 struct director *dir = conn->dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
922 |
14478
ee169584bc44
director: Improved debug handshake message.
Timo Sirainen <tss@iki.fi>
parents:
14477
diff
changeset
|
923 if (dir->debug) { |
ee169584bc44
director: Improved debug handshake message.
Timo Sirainen <tss@iki.fi>
parents:
14477
diff
changeset
|
924 unsigned int secs = time(NULL)-conn->created; |
ee169584bc44
director: Improved debug handshake message.
Timo Sirainen <tss@iki.fi>
parents:
14477
diff
changeset
|
925 |
ee169584bc44
director: Improved debug handshake message.
Timo Sirainen <tss@iki.fi>
parents:
14477
diff
changeset
|
926 i_debug("director(%s): Handshake took %u secs, " |
ee169584bc44
director: Improved debug handshake message.
Timo Sirainen <tss@iki.fi>
parents:
14477
diff
changeset
|
927 "bytes in=%"PRIuUOFF_T" out=%"PRIuUOFF_T, |
ee169584bc44
director: Improved debug handshake message.
Timo Sirainen <tss@iki.fi>
parents:
14477
diff
changeset
|
928 conn->name, secs, conn->input->v_offset, |
ee169584bc44
director: Improved debug handshake message.
Timo Sirainen <tss@iki.fi>
parents:
14477
diff
changeset
|
929 conn->output->offset); |
ee169584bc44
director: Improved debug handshake message.
Timo Sirainen <tss@iki.fi>
parents:
14477
diff
changeset
|
930 } |
11579
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
931 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
932 /* the host is up now, make sure we can connect to it immediately |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
933 if needed */ |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
934 conn->host->last_network_failure = 0; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
935 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
936 conn->handshake_received = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
937 if (conn->in) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
938 /* handshaked to left side. tell it we've received the |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
939 whole handshake. */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
940 director_connection_send(conn, "DONE\n"); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
941 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
942 /* tell the "right" director about the "left" one */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
943 director_update_send(dir, director_connection_get_host(conn), |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
944 t_strdup_printf("DIRECTOR\t%s\t%u\n", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
945 net_ip2addr(&conn->host->ip), |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
946 conn->host->port)); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
947 /* this is our "left" side. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
948 return director_connection_assign_left(conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
949 } else { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
950 /* handshaked to "right" side. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
951 return director_connection_assign_right(conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
952 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
953 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
954 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
955 static int |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
956 director_connection_handle_handshake(struct director_connection *conn, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
957 const char *cmd, const char *const *args) |
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 /* both incoming and outgoing connections get VERSION and ME */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
960 if (strcmp(cmd, "VERSION") == 0 && str_array_length(args) >= 3) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
961 if (strcmp(args[0], DIRECTOR_VERSION_NAME) != 0) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
962 i_error("director(%s): Wrong protocol in socket " |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
963 "(%s vs %s)", |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
964 conn->name, args[0], DIRECTOR_VERSION_NAME); |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
965 return -1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
966 } else if (atoi(args[1]) != DIRECTOR_VERSION_MAJOR) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
967 i_error("director(%s): Incompatible protocol version: " |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
968 "%u vs %u", conn->name, atoi(args[1]), |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
969 DIRECTOR_VERSION_MAJOR); |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
970 return -1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
971 } |
14431
084064444f89
director: Don't try to send the new SYNC parameter to old director versions.
Timo Sirainen <tss@iki.fi>
parents:
14409
diff
changeset
|
972 conn->minor_version = atoi(args[2]); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
973 conn->version_received = TRUE; |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
974 return 1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
975 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
976 if (!conn->version_received) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
977 director_cmd_error(conn, "Incompatible protocol"); |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
978 return -1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
979 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
980 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
981 if (strcmp(cmd, "ME") == 0) |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
982 return director_cmd_me(conn, args) ? 1 : -1; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
983 if (!conn->me_received) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
984 director_cmd_error(conn, "Expecting ME command first"); |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
985 return -1; |
11585 | 986 } |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
987 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
988 /* incoming connections get a HOST list */ |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
989 if (conn->handshake_sending_hosts) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
990 if (strcmp(cmd, "HOST") == 0) |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
991 return director_cmd_host_handshake(conn, args) ? 1 : -1; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
992 if (strcmp(cmd, "HOST-HAND-END") == 0) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
993 conn->ignore_host_events = FALSE; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
994 conn->handshake_sending_hosts = FALSE; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
995 return 1; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
996 } |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
997 director_cmd_error(conn, "Unexpected command during host list"); |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
998 return -1; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
999 } |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1000 if (strcmp(cmd, "HOST-HAND-START") == 0) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1001 if (!conn->in) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1002 director_cmd_error(conn, |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1003 "Host list is only for incoming connections"); |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1004 return -1; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1005 } |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1006 return director_cmd_host_hand_start(conn, args) ? 1 : -1; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1007 } |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1008 |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1009 if (conn->in && strcmp(cmd, "USER") == 0 && CMD_IS_USER_HANDHAKE(args)) |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1010 return director_handshake_cmd_user(conn, args) ? 1 : -1; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1011 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1012 /* both get DONE */ |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1013 if (strcmp(cmd, "DONE") == 0) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1014 return director_handshake_cmd_done(conn) ? 1 : -1; |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1015 return 0; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1016 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1017 |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1018 static void |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1019 director_connection_sync_host(struct director_connection *conn, |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1020 struct director_host *host, |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1021 uint32_t seq, unsigned int minor_version) |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1022 { |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1023 struct director *dir = conn->dir; |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1024 |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1025 if (minor_version > DIRECTOR_VERSION_MINOR) { |
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1026 /* we're not up to date */ |
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1027 minor_version = DIRECTOR_VERSION_MINOR; |
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1028 } |
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1029 |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1030 if (host->self) { |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1031 if (dir->sync_seq != seq) { |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1032 /* stale SYNC event */ |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1033 return; |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1034 } |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1035 /* sync_seq increases when we get disconnected, so we must be |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1036 successfully connected to both directions */ |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1037 i_assert(dir->left != NULL && dir->right != NULL); |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1038 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1039 dir->ring_min_version = minor_version; |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1040 if (!dir->ring_handshaked) { |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1041 /* the ring is handshaked */ |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1042 director_set_ring_handshaked(dir); |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1043 } else if (dir->ring_synced) { |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1044 /* duplicate SYNC (which was sent just in case the |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1045 previous one got lost) */ |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1046 } else { |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1047 if (dir->debug) { |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1048 i_debug("Ring is synced (%s sent seq=%u)", |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1049 conn->name, seq); |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1050 } |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1051 director_set_ring_synced(dir); |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1052 } |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1053 } else if (dir->right != NULL) { |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1054 /* forward it to the connection on right */ |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1055 director_sync_send(dir, host, seq, minor_version); |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1056 } |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1057 } |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1058 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1059 static bool director_connection_sync(struct director_connection *conn, |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1060 const char *const *args) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1061 { |
11585 | 1062 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
|
1063 struct director_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1064 struct ip_addr ip; |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1065 unsigned int port, seq, minor_version = 0; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1066 |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1067 if (str_array_length(args) < 3 || |
12208
a224997afefd
director: Properly detect invalid command parameters in director<->director connections.
Timo Sirainen <tss@iki.fi>
parents:
12065
diff
changeset
|
1068 !director_args_parse_ip_port(conn, args, &ip, &port) || |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1069 str_to_uint(args[2], &seq) < 0) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1070 director_cmd_error(conn, "Invalid parameters"); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1071 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1072 } |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1073 if (args[3] != NULL) |
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1074 minor_version = atoi(args[3]); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1075 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1076 /* find the originating director. if we don't see it, it was already |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1077 removed and we can ignore this sync. */ |
11585 | 1078 host = director_host_lookup(dir, &ip, port); |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1079 if (host != NULL) { |
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1080 director_connection_sync_host(conn, host, seq, |
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1081 minor_version); |
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1082 } |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1083 |
13941
493ebb2cfc73
director: Added timeout to syncing to make sure we don't hang if it somehow gets lost.
Timo Sirainen <tss@iki.fi>
parents:
13940
diff
changeset
|
1084 if (host == NULL || !host->self) |
493ebb2cfc73
director: Added timeout to syncing to make sure we don't hang if it somehow gets lost.
Timo Sirainen <tss@iki.fi>
parents:
13940
diff
changeset
|
1085 director_resend_sync(dir); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1086 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1087 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1088 |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1089 static bool director_cmd_connect(struct director_connection *conn, |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1090 const char *const *args) |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1091 { |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1092 struct director *dir = conn->dir; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1093 struct director_host *host; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1094 struct ip_addr ip; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1095 unsigned int port; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1096 |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1097 if (str_array_length(args) != 2 || |
12208
a224997afefd
director: Properly detect invalid command parameters in director<->director connections.
Timo Sirainen <tss@iki.fi>
parents:
12065
diff
changeset
|
1098 !director_args_parse_ip_port(conn, args, &ip, &port)) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1099 director_cmd_error(conn, "Invalid parameters"); |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1100 return FALSE; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1101 } |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1102 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1103 host = director_host_get(conn->dir, &ip, port); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1104 /* reset failure timestamp so we'll actually try to connect there. */ |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1105 host->last_network_failure = 0; |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1106 |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1107 /* remote suggests us to connect elsewhere */ |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1108 if (dir->right != NULL && |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1109 director_host_cmp_to_self(host, dir->right->host, |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1110 dir->self_host) <= 0) { |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1111 /* the old connection is the correct one */ |
11579
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1112 if (dir->debug) { |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1113 i_debug("Ignoring CONNECT request to %s " |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1114 "(current right is %s)", |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1115 host->name, dir->right->name); |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1116 } |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1117 return TRUE; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1118 } |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1119 |
11579
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1120 if (dir->debug) { |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1121 if (dir->right == NULL) { |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1122 i_debug("Received CONNECT request to %s, " |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1123 "initializing right", host->name); |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1124 } else { |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1125 i_debug("Received CONNECT request to %s, " |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1126 "replacing current right %s", |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1127 host->name, dir->right->name); |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1128 } |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1129 } |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1130 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1131 /* connect here */ |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1132 (void)director_connect_host(dir, host); |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1133 return TRUE; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1134 } |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1135 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1136 static void director_disconnect_wrong_lefts(struct director *dir) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1137 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1138 struct director_connection *const *connp, *conn; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1139 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1140 array_foreach(&dir->connections, connp) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1141 conn = *connp; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1142 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1143 if (conn->in && conn != dir->left && conn->me_received && |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1144 conn->to_disconnect == NULL && |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1145 director_host_cmp_to_self(dir->left->host, conn->host, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1146 dir->self_host) < 0) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1147 i_warning("Director connection %s tried to connect to " |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1148 "us, should use %s instead", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1149 conn->name, dir->left->host->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1150 director_connection_send_connect(conn, dir->left->host); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1151 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1152 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1153 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1154 |
11586
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1155 static bool director_cmd_pong(struct director_connection *conn) |
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1156 { |
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1157 if (!conn->ping_waiting) |
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1158 return TRUE; |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1159 conn->ping_waiting = FALSE; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1160 timeout_remove(&conn->to_pong); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1161 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1162 if (conn->verifying_left) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1163 conn->verifying_left = FALSE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1164 if (conn == conn->dir->left) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1165 /* our left side is functional. tell all the wrong |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1166 incoming connections to connect to it instead. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1167 director_disconnect_wrong_lefts(conn->dir); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1168 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1169 } |
11586
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1170 |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1171 director_connection_set_ping_timeout(conn); |
11586
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1172 return TRUE; |
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1173 } |
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1174 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1175 static bool |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1176 director_connection_handle_cmd(struct director_connection *conn, |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1177 const char *cmd, const char *const *args) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1178 { |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1179 int ret; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1180 |
11327
9d886ae434c3
director: If connecting to director fails, try connecting to next one.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
1181 if (!conn->handshake_received) { |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1182 ret = director_connection_handle_handshake(conn, cmd, args); |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1183 if (ret > 0) |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1184 return TRUE; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1185 if (ret < 0) { |
11327
9d886ae434c3
director: If connecting to director fails, try connecting to next one.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
1186 /* invalid commands during handshake, |
9d886ae434c3
director: If connecting to director fails, try connecting to next one.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
1187 we probably don't want to reconnect here */ |
9d886ae434c3
director: If connecting to director fails, try connecting to next one.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
1188 return FALSE; |
9d886ae434c3
director: If connecting to director fails, try connecting to next one.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
1189 } |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1190 /* allow also other commands during handshake */ |
11327
9d886ae434c3
director: If connecting to director fails, try connecting to next one.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
1191 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1192 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1193 if (strcmp(cmd, "PING") == 0) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1194 director_connection_send(conn, "PONG\n"); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1195 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1196 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1197 if (strcmp(cmd, "PONG") == 0) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1198 return director_cmd_pong(conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1199 if (strcmp(cmd, "USER") == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1200 return director_cmd_user(conn, args); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1201 if (strcmp(cmd, "USER-WEAK") == 0) |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1202 return director_cmd_user_weak(conn, args); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1203 if (strcmp(cmd, "HOST") == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1204 return director_cmd_host(conn, args); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1205 if (strcmp(cmd, "HOST-REMOVE") == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1206 return director_cmd_host_remove(conn, args); |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
1207 if (strcmp(cmd, "HOST-FLUSH") == 0) |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
1208 return director_cmd_host_flush(conn, args); |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1209 if (strcmp(cmd, "USER-MOVE") == 0) |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1210 return director_cmd_user_move(conn, args); |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1211 if (strcmp(cmd, "USER-KILLED") == 0) |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1212 return director_cmd_user_killed(conn, args); |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1213 if (strcmp(cmd, "USER-KILLED-EVERYWHERE") == 0) |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1214 return director_cmd_user_killed_everywhere(conn, args); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1215 if (strcmp(cmd, "DIRECTOR") == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1216 return director_cmd_director(conn, args); |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
1217 if (strcmp(cmd, "DIRECTOR-REMOVE") == 0) |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
1218 return director_cmd_director_remove(conn, args); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1219 if (strcmp(cmd, "SYNC") == 0) |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1220 return director_connection_sync(conn, args); |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1221 if (strcmp(cmd, "CONNECT") == 0) |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1222 return director_cmd_connect(conn, args); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1223 |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1224 director_cmd_error(conn, "Unknown command %s", cmd); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1225 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1226 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1227 |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1228 static bool |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1229 director_connection_handle_line(struct director_connection *conn, |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1230 const char *line) |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1231 { |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1232 const char *cmd, *const *args; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1233 bool ret; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1234 |
14471
fc8031c5e691
Use t_strsplit_tab() wherever possible
Timo Sirainen <tss@iki.fi>
parents:
14468
diff
changeset
|
1235 args = t_strsplit_tab(line); |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1236 cmd = args[0]; args++; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1237 if (cmd == NULL) { |
14479
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
1238 director_cmd_error(conn, "Received empty line"); |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1239 return FALSE; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1240 } |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1241 |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1242 conn->cur_cmd = cmd; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1243 conn->cur_line = line; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1244 ret = director_connection_handle_cmd(conn, cmd, args); |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1245 conn->cur_cmd = NULL; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1246 conn->cur_line = NULL; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1247 return ret; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1248 } |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1249 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1250 static void director_connection_input(struct director_connection *conn) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1251 { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1252 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
|
1253 char *line; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1254 bool ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1255 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1256 switch (i_stream_read(conn->input)) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1257 case 0: |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1258 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1259 case -1: |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1260 /* disconnected */ |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1261 i_error("Director %s disconnected%s", conn->name, |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1262 conn->handshake_received ? "" : |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1263 " before handshake finished"); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1264 director_connection_disconnected(&conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1265 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1266 case -2: |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1267 /* buffer full */ |
14479
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
1268 director_cmd_error(conn, "Director sent us more than %d bytes", |
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
1269 MAX_INBUF_SIZE); |
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
1270 director_connection_reconnect(&conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1271 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1272 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1273 |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1274 if (conn->to_disconnect != NULL) { |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1275 /* just read everything the remote sends, and wait for it |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1276 to disconnect. we mainly just want the remote to read the |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1277 CONNECT we sent it. */ |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1278 size_t size; |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1279 |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1280 (void)i_stream_get_data(conn->input, &size); |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1281 i_stream_skip(conn->input, size); |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1282 return; |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1283 } |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1284 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1285 director_sync_freeze(dir); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1286 while ((line = i_stream_next_line(conn->input)) != NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1287 T_BEGIN { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1288 ret = director_connection_handle_line(conn, line); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1289 } T_END; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1290 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1291 if (!ret) { |
14479
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
1292 director_connection_reconnect(&conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1293 break; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1294 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1295 } |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1296 director_sync_thaw(dir); |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1297 if (conn != NULL) |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1298 timeout_reset(conn->to_ping); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1299 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1300 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1301 static void director_connection_send_directors(struct director_connection *conn, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1302 string_t *str) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1303 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1304 struct director_host *const *hostp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1305 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1306 array_foreach(&conn->dir->dir_hosts, hostp) { |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
1307 if ((*hostp)->removed) |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
1308 continue; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1309 str_printfa(str, "DIRECTOR\t%s\t%u\n", |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1310 net_ip2addr(&(*hostp)->ip), (*hostp)->port); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1311 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1312 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1313 |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
1314 static void |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
1315 director_connection_send_hosts(struct director_connection *conn, string_t *str) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1316 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1317 struct mail_host *const *hostp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1318 |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
1319 str_printfa(str, "HOST-HAND-START\t%u\n", conn->dir->ring_handshaked); |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11350
diff
changeset
|
1320 array_foreach(mail_hosts_get(conn->dir->mail_hosts), hostp) { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1321 str_printfa(str, "HOST\t%s\t%u\n", |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1322 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
|
1323 } |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
1324 str_printfa(str, "HOST-HAND-END\t%u\n", conn->dir->ring_handshaked); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1325 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1326 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1327 static int director_connection_send_users(struct director_connection *conn) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1328 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1329 struct user *user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1330 int ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1331 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1332 while ((user = user_directory_iter_next(conn->user_iter)) != NULL) { |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1333 T_BEGIN { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1334 string_t *str = t_str_new(128); |
11598
d3dfe9c271bc
director: Don't send expired user records to remote servers.
Timo Sirainen <tss@iki.fi>
parents:
11586
diff
changeset
|
1335 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1336 str_printfa(str, "USER\t%u\t%s\t%u", |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1337 user->username_hash, |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1338 net_ip2addr(&user->host->ip), |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1339 user->timestamp); |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1340 if (user->weak) |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1341 str_append(str, "\tw"); |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1342 str_append_c(str, '\n'); |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1343 director_connection_send(conn, str_c(str)); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1344 } T_END; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1345 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1346 if (o_stream_get_buffer_used_size(conn->output) >= OUTBUF_FLUSH_THRESHOLD) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1347 if ((ret = o_stream_flush(conn->output)) <= 0) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1348 /* continue later */ |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1349 timeout_reset(conn->to_ping); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1350 return ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1351 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1352 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1353 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1354 user_directory_iter_deinit(&conn->user_iter); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1355 director_connection_send(conn, "DONE\n"); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1356 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1357 ret = o_stream_flush(conn->output); |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1358 timeout_reset(conn->to_ping); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1359 return ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1360 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1361 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1362 static int director_connection_output(struct director_connection *conn) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1363 { |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1364 int ret; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1365 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1366 if (conn->user_iter != NULL) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1367 /* still handshaking USER list */ |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1368 o_stream_cork(conn->output); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1369 ret = director_connection_send_users(conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1370 o_stream_uncork(conn->output); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1371 if (ret < 0) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1372 director_connection_disconnected(&conn); |
14480
d9f33d78fa3d
director: Make sure handshaking doesn't get stuck sending USERs.
Timo Sirainen <tss@iki.fi>
parents:
14479
diff
changeset
|
1373 else |
d9f33d78fa3d
director: Make sure handshaking doesn't get stuck sending USERs.
Timo Sirainen <tss@iki.fi>
parents:
14479
diff
changeset
|
1374 o_stream_set_flush_pending(conn->output, TRUE); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1375 return ret; |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1376 } |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1377 return o_stream_flush(conn->output); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1378 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1379 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1380 static struct director_connection * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1381 director_connection_init_common(struct director *dir, int fd) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1382 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1383 struct director_connection *conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1384 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1385 conn = i_new(struct director_connection, 1); |
12065
ff5a47012287
director: If outgoing connection dies soon, mark the host as failed to avoid immediate reconnect.
Timo Sirainen <tss@iki.fi>
parents:
11816
diff
changeset
|
1386 conn->created = ioloop_time; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1387 conn->fd = fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1388 conn->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1389 conn->input = i_stream_create_fd(conn->fd, MAX_INBUF_SIZE, FALSE); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1390 conn->output = o_stream_create_fd(conn->fd, MAX_OUTBUF_SIZE, FALSE); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1391 conn->to_ping = timeout_add(DIRECTOR_CONNECTION_ME_TIMEOUT_MSECS, |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1392 director_connection_init_timeout, conn); |
14406
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1393 array_append(&dir->connections, &conn, 1); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1394 return conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1395 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1396 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1397 static void director_connection_send_handshake(struct director_connection *conn) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1398 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1399 director_connection_send(conn, t_strdup_printf( |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1400 "VERSION\t"DIRECTOR_VERSION_NAME"\t%u\t%u\n" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1401 "ME\t%s\t%u\n", |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1402 DIRECTOR_VERSION_MAJOR, DIRECTOR_VERSION_MINOR, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1403 net_ip2addr(&conn->dir->self_ip), conn->dir->self_port)); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1404 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1405 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1406 struct director_connection * |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1407 director_connection_init_in(struct director *dir, int fd, |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1408 const struct ip_addr *ip) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1409 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1410 struct director_connection *conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1411 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1412 conn = director_connection_init_common(dir, fd); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1413 conn->in = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1414 conn->connected = TRUE; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1415 conn->name = i_strdup_printf("%s/in", net_ip2addr(ip)); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1416 conn->io = io_add(conn->fd, IO_READ, director_connection_input, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1417 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1418 director_connection_send_handshake(conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1419 return conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1420 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1421 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1422 static void director_connection_connected(struct director_connection *conn) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1423 { |
11327
9d886ae434c3
director: If connecting to director fails, try connecting to next one.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
1424 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
|
1425 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
|
1426 int err; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1427 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1428 if ((err = net_geterror(conn->fd)) != 0) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1429 i_error("director(%s): connect() failed: %s", conn->name, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1430 strerror(err)); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1431 director_connection_disconnected(&conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1432 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1433 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1434 conn->connected = TRUE; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1435 o_stream_set_flush_callback(conn->output, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1436 director_connection_output, conn); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1437 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1438 io_remove(&conn->io); |
14484
25ca6b6d754a
director: Adding 25c941423e42 patch yet again, now it seems to work right.
Timo Sirainen <tss@iki.fi>
parents:
14483
diff
changeset
|
1439 conn->io = io_add(conn->fd, IO_READ, director_connection_input, conn); |
25ca6b6d754a
director: Adding 25c941423e42 patch yet again, now it seems to work right.
Timo Sirainen <tss@iki.fi>
parents:
14483
diff
changeset
|
1440 |
14477
ea5b949a623b
director: Increased timeout for sending USER data in handshake.
Timo Sirainen <tss@iki.fi>
parents:
14476
diff
changeset
|
1441 timeout_remove(&conn->to_ping); |
ea5b949a623b
director: Increased timeout for sending USER data in handshake.
Timo Sirainen <tss@iki.fi>
parents:
14476
diff
changeset
|
1442 conn->to_ping = timeout_add(DIRECTOR_CONNECTION_SEND_USERS_TIMEOUT_MSECS, |
ea5b949a623b
director: Increased timeout for sending USER data in handshake.
Timo Sirainen <tss@iki.fi>
parents:
14476
diff
changeset
|
1443 director_connection_init_timeout, conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1444 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1445 o_stream_cork(conn->output); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1446 director_connection_send_handshake(conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1447 director_connection_send_directors(conn, str); |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
1448 director_connection_send_hosts(conn, str); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1449 director_connection_send(conn, str_c(str)); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1450 |
11327
9d886ae434c3
director: If connecting to director fails, try connecting to next one.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
1451 conn->user_iter = user_directory_iter_init(dir->users); |
14481
ce4e1bf7262d
director: Another fix for stuck handshake.
Timo Sirainen <tss@iki.fi>
parents:
14480
diff
changeset
|
1452 if (director_connection_send_users(conn) == 0) |
ce4e1bf7262d
director: Another fix for stuck handshake.
Timo Sirainen <tss@iki.fi>
parents:
14480
diff
changeset
|
1453 o_stream_set_flush_pending(conn->output, TRUE); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1454 o_stream_uncork(conn->output); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1455 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1456 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1457 struct director_connection * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1458 director_connection_init_out(struct director *dir, int fd, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1459 struct director_host *host) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1460 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1461 struct director_connection *conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1462 |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
1463 i_assert(!host->removed); |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
1464 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1465 /* make sure we don't keep old sequence values across restarts */ |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1466 host->last_seq = 0; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1467 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1468 conn = director_connection_init_common(dir, fd); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1469 conn->name = i_strdup_printf("%s/out", host->name); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1470 conn->host = host; |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
1471 director_host_ref(host); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1472 conn->io = io_add(conn->fd, IO_WRITE, |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1473 director_connection_connected, conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1474 return conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1475 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1476 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1477 void director_connection_deinit(struct director_connection **_conn) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1478 { |
14406
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1479 struct director_connection *const *conns, *conn = *_conn; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1480 struct director *dir = conn->dir; |
14406
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1481 unsigned int i, count; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1482 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1483 *_conn = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1484 |
12935
e9139f74c451
director: Improved debug/error logging.
Timo Sirainen <tss@iki.fi>
parents:
12934
diff
changeset
|
1485 if (dir->debug && conn->host != NULL) |
e9139f74c451
director: Improved debug/error logging.
Timo Sirainen <tss@iki.fi>
parents:
12934
diff
changeset
|
1486 i_debug("Disconnecting from %s", conn->host->name); |
e9139f74c451
director: Improved debug/error logging.
Timo Sirainen <tss@iki.fi>
parents:
12934
diff
changeset
|
1487 |
14406
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1488 conns = array_get(&dir->connections, &count); |
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1489 for (i = 0; i < count; i++) { |
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1490 if (conns[i] == conn) { |
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1491 array_delete(&dir->connections, i, 1); |
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1492 break; |
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1493 } |
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1494 } |
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1495 i_assert(i < count); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1496 if (dir->left == conn) { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1497 dir->left = NULL; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1498 /* if there is already another handshaked incoming connection, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1499 use it as the new "left" */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1500 director_assign_left(dir); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1501 } |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1502 if (dir->right == conn) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1503 dir->right = NULL; |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
1504 if (conn->host != NULL) |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
1505 director_host_unref(conn->host); |
11572
659bb1a26da4
director: Added initial testing framework and some debugging output.
Timo Sirainen <tss@iki.fi>
parents:
11571
diff
changeset
|
1506 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1507 if (conn->user_iter != NULL) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1508 user_directory_iter_deinit(&conn->user_iter); |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1509 if (conn->to_disconnect != NULL) |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1510 timeout_remove(&conn->to_disconnect); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1511 if (conn->to_pong != NULL) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1512 timeout_remove(&conn->to_pong); |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1513 timeout_remove(&conn->to_ping); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1514 if (conn->io != NULL) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1515 io_remove(&conn->io); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1516 i_stream_unref(&conn->input); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1517 o_stream_unref(&conn->output); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1518 if (close(conn->fd) < 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1519 i_error("close(director connection) failed: %m"); |
11569
467ca06a7dbe
director: Outgoing director connections shouldn't be counted as master clients.
Timo Sirainen <tss@iki.fi>
parents:
11373
diff
changeset
|
1520 |
467ca06a7dbe
director: Outgoing director connections shouldn't be counted as master clients.
Timo Sirainen <tss@iki.fi>
parents:
11373
diff
changeset
|
1521 if (conn->in) |
467ca06a7dbe
director: Outgoing director connections shouldn't be counted as master clients.
Timo Sirainen <tss@iki.fi>
parents:
11373
diff
changeset
|
1522 master_service_client_connection_destroyed(master_service); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1523 i_free(conn->name); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1524 i_free(conn); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1525 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1526 if (dir->left == NULL || dir->right == NULL) { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1527 /* we aren't synced until we're again connected to a ring */ |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1528 dir->sync_seq++; |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13053
diff
changeset
|
1529 director_set_ring_unsynced(dir); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1530 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1531 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1532 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1533 void director_connection_disconnected(struct director_connection **_conn) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1534 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1535 struct director_connection *conn = *_conn; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1536 struct director *dir = conn->dir; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1537 |
14570
40f958c7643b
director: Don't crash with quickly disconnecting incoming director connections.
Timo Sirainen <tss@iki.fi>
parents:
14494
diff
changeset
|
1538 if (conn->created + DIRECTOR_SUCCESS_MIN_CONNECT_SECS > ioloop_time && |
40f958c7643b
director: Don't crash with quickly disconnecting incoming director connections.
Timo Sirainen <tss@iki.fi>
parents:
14494
diff
changeset
|
1539 conn->host != NULL) { |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1540 /* connection didn't exist for very long, assume it has a |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1541 network problem */ |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1542 conn->host->last_network_failure = ioloop_time; |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1543 } |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1544 |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1545 director_connection_deinit(_conn); |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1546 if (dir->right == NULL) |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1547 director_connect(dir); |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1548 } |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1549 |
14479
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
1550 void director_connection_reconnect(struct director_connection **_conn) |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1551 { |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1552 struct director_connection *conn = *_conn; |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1553 struct director *dir = conn->dir; |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1554 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1555 director_connection_deinit(_conn); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1556 if (dir->right == NULL) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1557 director_connect(dir); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1558 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1559 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1560 void director_connection_send(struct director_connection *conn, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1561 const char *data) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1562 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1563 unsigned int len = strlen(data); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1564 off_t ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1565 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1566 if (conn->output->closed || !conn->connected) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1567 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1568 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1569 ret = o_stream_send(conn->output, data, len); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1570 if (ret != (off_t)len) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1571 if (ret < 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1572 i_error("director(%s): write() failed: %m", conn->name); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1573 else { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1574 i_error("director(%s): Output buffer full, " |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1575 "disconnecting", conn->name); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1576 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1577 o_stream_close(conn->output); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1578 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1579 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1580 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1581 static void |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1582 director_connection_ping_idle_timeout(struct director_connection *conn) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1583 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1584 i_error("director(%s): Ping timed out, disconnecting", conn->name); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1585 director_connection_disconnected(&conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1586 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1587 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1588 static void director_connection_pong_timeout(struct director_connection *conn) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1589 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1590 i_error("director(%s): PONG reply not received although other " |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1591 "input keeps coming, disconnecting", conn->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1592 director_connection_disconnected(&conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1593 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1594 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1595 void director_connection_ping(struct director_connection *conn) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1596 { |
11586
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1597 if (conn->ping_waiting) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1598 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1599 |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1600 timeout_remove(&conn->to_ping); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1601 conn->to_ping = timeout_add(DIRECTOR_CONNECTION_PING_IDLE_TIMEOUT_MSECS, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1602 director_connection_ping_idle_timeout, conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1603 conn->to_pong = timeout_add(DIRECTOR_CONNECTION_PONG_TIMEOUT_MSECS, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1604 director_connection_pong_timeout, conn); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1605 director_connection_send(conn, "PING\n"); |
11586
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1606 conn->ping_waiting = TRUE; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1607 } |
11585 | 1608 |
1609 const char *director_connection_get_name(struct director_connection *conn) | |
1610 { | |
1611 return conn->name; | |
1612 } | |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1613 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1614 struct director_host * |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1615 director_connection_get_host(struct director_connection *conn) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1616 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1617 return conn->host; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1618 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1619 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1620 bool director_connection_is_handshaked(struct director_connection *conn) |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1621 { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1622 return conn->handshake_received; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1623 } |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1624 |
14406
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1625 bool director_connection_is_incoming(struct director_connection *conn) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1626 { |
14406
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
1627 return conn->in; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1628 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1629 |
14431
084064444f89
director: Don't try to send the new SYNC parameter to old director versions.
Timo Sirainen <tss@iki.fi>
parents:
14409
diff
changeset
|
1630 unsigned int |
084064444f89
director: Don't try to send the new SYNC parameter to old director versions.
Timo Sirainen <tss@iki.fi>
parents:
14409
diff
changeset
|
1631 director_connection_get_minor_version(struct director_connection *conn) |
084064444f89
director: Don't try to send the new SYNC parameter to old director versions.
Timo Sirainen <tss@iki.fi>
parents:
14409
diff
changeset
|
1632 { |
084064444f89
director: Don't try to send the new SYNC parameter to old director versions.
Timo Sirainen <tss@iki.fi>
parents:
14409
diff
changeset
|
1633 return conn->minor_version; |
084064444f89
director: Don't try to send the new SYNC parameter to old director versions.
Timo Sirainen <tss@iki.fi>
parents:
14409
diff
changeset
|
1634 } |
084064444f89
director: Don't try to send the new SYNC parameter to old director versions.
Timo Sirainen <tss@iki.fi>
parents:
14409
diff
changeset
|
1635 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1636 void director_connection_cork(struct director_connection *conn) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1637 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1638 o_stream_cork(conn->output); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1639 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1640 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1641 void director_connection_uncork(struct director_connection *conn) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1642 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1643 o_stream_uncork(conn->output); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1644 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1645 |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1646 void director_connection_set_synced(struct director_connection *conn, |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1647 bool synced) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1648 { |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1649 if (conn->synced == synced) |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1650 return; |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1651 conn->synced = synced; |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1652 |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1653 /* switch ping timeout, unless we're already waiting for PONG */ |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1654 if (conn->ping_waiting) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1655 return; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1656 |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1657 director_connection_set_ping_timeout(conn); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1658 } |