Mercurial > dovecot > core-2.2
annotate src/director/director-connection.c @ 22649:bb7c452e3662
director: Include peak output buffer size in director connection log messages
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sun, 05 Nov 2017 22:27:41 +0200 |
parents | 6bd018a94a57 |
children | e010a312c871 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21322
diff
changeset
|
1 /* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */ |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
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" |
15187
02451e967a06
Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents:
15162
diff
changeset
|
34 #include "net.h" |
11321
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" |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
38 #include "strescape.h" |
20575
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
39 #include "time-util.h" |
11373
26cfc1c3a4b1
director: Update connection count when client disconnects.
Timo Sirainen <tss@iki.fi>
parents:
11355
diff
changeset
|
40 #include "master-service.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 #include "mail-host.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 #include "director.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 #include "director-host.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 #include "director-request.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 #include "director-connection.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
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 OUTBUF_FLUSH_THRESHOLD (1024*128) |
22250
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
51 /* Max time to wait for connect() to finish before aborting */ |
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
52 #define DIRECTOR_CONNECTION_CONNECT_TIMEOUT_MSECS (10*1000) |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
53 /* 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
|
54 or we'll disconnect. */ |
14467 | 55 #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
|
56 /* 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
|
57 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
|
58 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
|
59 #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
|
60 /* Max idling time before "DONE" command must have been received, |
22254
58ffaff6f714
director: Use longer timeout for receiving user list in handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22253
diff
changeset
|
61 or we'll disconnect. Use a slightly larger value than for _SEND_USERS_ so |
58ffaff6f714
director: Use longer timeout for receiving user list in handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22253
diff
changeset
|
62 that we'll get a better error if the sender decides to disconnect. */ |
58ffaff6f714
director: Use longer timeout for receiving user list in handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22253
diff
changeset
|
63 #define DIRECTOR_CONNECTION_DONE_TIMEOUT_MSECS (40*1000) |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
64 /* How long to wait for PONG for an idling connection */ |
14467 | 65 #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
|
66 /* Maximum time to wait for PONG reply */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
67 #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
|
68 /* 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
|
69 #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
|
70 /* 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
|
71 #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
|
72 /* 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
|
73 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
|
74 #define DIRECTOR_SUCCESS_MIN_CONNECT_SECS 40 |
22567
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
75 #define DIRECTOR_RECONNECT_AFTER_WRONG_CONNECT_MSECS 1000 |
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
|
76 #define DIRECTOR_WAIT_DISCONNECT_SECS 10 |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
77 #define DIRECTOR_HANDSHAKE_WARN_SECS 29 |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
78 #define DIRECTOR_HANDSHAKE_BYTES_LOG_MIN_SECS (60*30) |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
79 #define DIRECTOR_MAX_SYNC_SEQ_DUPLICATES 4 |
16790
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
80 /* If we receive SYNCs with a timestamp this many seconds higher than the last |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
81 valid received SYNC timestamp, assume that we lost the director's restart |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
82 notification and reset the last_sync_seq */ |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
83 #define DIRECTOR_SYNC_STALE_TIMESTAMP_RESET_SECS (60*2) |
19294
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
84 #define DIRECTOR_MAX_CLOCK_DIFF_WARN_SECS 1 |
22648
6bd018a94a57
director: Don't block too long when sending users during director handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22646
diff
changeset
|
85 /* How many USER entries to send during handshake before going back to ioloop |
6bd018a94a57
director: Don't block too long when sending users during director handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22646
diff
changeset
|
86 to see if there's other work to be done as well. */ |
6bd018a94a57
director: Don't block too long when sending users during director handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22646
diff
changeset
|
87 #define DIRECTOR_HANDSHAKE_MAX_USERS_SENT_PER_FLUSH 10000 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
89 #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
|
90 # 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
|
91 #endif |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
92 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
93 #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
|
94 # 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
|
95 #endif |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
96 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
97 #define CMD_IS_USER_HANDHAKE(args) \ |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
98 (str_array_length(args) > 2) |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
99 |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
100 #define DIRECTOR_OPT_CONSISTENT_HASHING "consistent-hashing" |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
101 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 struct director_connection { |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
103 int refcount; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 struct director *dir; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
105 char *name; |
22252
8882a5cbe76d
director: Use more accurate timestamps for handshake timeout logging
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22251
diff
changeset
|
106 struct timeval created, connected_time, me_received_time; |
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
|
107 unsigned int minor_version; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 |
20575
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
109 struct timeval last_input, last_output; |
22627
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
110 size_t peak_bytes_buffered; |
20575
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
111 |
22628
8623737c0129
director: Track connections' last ping time
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22627
diff
changeset
|
112 struct timeval ping_sent_time; |
8623737c0129
director: Track connections' last ping time
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22627
diff
changeset
|
113 unsigned int last_ping_msecs; |
8623737c0129
director: Track connections' last ping time
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22627
diff
changeset
|
114 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 /* 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
|
116 ME-line is received */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 struct director_host *host; |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
118 /* this is set only for wrong connections: */ |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
119 struct director_host *connect_request_to; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 int fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 struct io *io; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 struct istream *input; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 struct ostream *output; |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
125 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
|
126 |
21075
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
127 struct director_user_iter *user_iter; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
129 /* set during command execution */ |
22640
cf23a90cd2ca
director: Use t_strsplit_tabescaped_inplace() for director connection input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22629
diff
changeset
|
130 const char *cur_cmd, *const *cur_args; |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
131 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 unsigned int in:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 unsigned int connected:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 unsigned int version_received:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 unsigned int me_received:1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 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
|
137 unsigned int ignore_host_events:1; |
11585 | 138 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
|
139 unsigned int ping_waiting:1; |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
140 unsigned int synced:1; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
141 unsigned int wrong_host:1; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
142 unsigned int verifying_left:1; |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
143 unsigned int users_unsorted:1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
146 static bool director_connection_unref(struct director_connection *conn); |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
147 static void director_finish_sending_handshake(struct director_connection *conn); |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
148 static void director_connection_disconnected(struct director_connection **conn, |
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
149 const char *reason); |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
150 static void director_connection_reconnect(struct director_connection **conn, |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
151 const char *reason); |
16618
0ad8da149774
director: Log director disconnection errno correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
152 static void |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
153 director_connection_log_disconnect(struct director_connection *conn, int err, |
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
154 const char *errstr); |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
155 static int director_connection_send_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
|
156 |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
157 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
|
158 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
|
159 { |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
160 va_list args; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
161 |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
162 va_start(args, fmt); |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
163 i_error("director(%s): Command %s: %s (input: %s)", conn->name, |
22640
cf23a90cd2ca
director: Use t_strsplit_tabescaped_inplace() for director connection input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22629
diff
changeset
|
164 conn->cur_cmd, t_strdup_vprintf(fmt, args), |
cf23a90cd2ca
director: Use t_strsplit_tabescaped_inplace() for director connection input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22629
diff
changeset
|
165 t_strarray_join(conn->cur_args, "\t")); |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
166 va_end(args); |
14479
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
167 |
18663
1c268a7cc74a
director: Fixed crash if director sent invalid data too early.
Timo Sirainen <tss@iki.fi>
parents:
18662
diff
changeset
|
168 if (conn->host != NULL) |
1c268a7cc74a
director: Fixed crash if director sent invalid data too early.
Timo Sirainen <tss@iki.fi>
parents:
18662
diff
changeset
|
169 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
|
170 } |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
171 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
172 static void |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
173 director_connection_append_stats(struct director_connection *conn, string_t *str) |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
174 { |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
175 int input_msecs = timeval_diff_msecs(&ioloop_timeval, &conn->last_input); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
176 int output_msecs = timeval_diff_msecs(&ioloop_timeval, &conn->last_output); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
177 int connected_msecs = timeval_diff_msecs(&ioloop_timeval, &conn->connected_time); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
178 |
22256
29ae473d0b7c
director: Fix logging last input/output time when there was no input/output
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22255
diff
changeset
|
179 str_printfa(str, "bytes in=%"PRIuUOFF_T", bytes out=%"PRIuUOFF_T, |
29ae473d0b7c
director: Fix logging last input/output time when there was no input/output
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22255
diff
changeset
|
180 conn->input->v_offset, conn->output->offset); |
29ae473d0b7c
director: Fix logging last input/output time when there was no input/output
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22255
diff
changeset
|
181 if (conn->last_input.tv_sec > 0) { |
29ae473d0b7c
director: Fix logging last input/output time when there was no input/output
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22255
diff
changeset
|
182 str_printfa(str, ", last input %u.%03u s ago", |
29ae473d0b7c
director: Fix logging last input/output time when there was no input/output
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22255
diff
changeset
|
183 input_msecs/1000, input_msecs%1000); |
29ae473d0b7c
director: Fix logging last input/output time when there was no input/output
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22255
diff
changeset
|
184 } |
29ae473d0b7c
director: Fix logging last input/output time when there was no input/output
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22255
diff
changeset
|
185 if (conn->last_output.tv_sec > 0) { |
29ae473d0b7c
director: Fix logging last input/output time when there was no input/output
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22255
diff
changeset
|
186 str_printfa(str, ", last output %u.%03u s ago", |
29ae473d0b7c
director: Fix logging last input/output time when there was no input/output
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22255
diff
changeset
|
187 output_msecs/1000, output_msecs%1000); |
29ae473d0b7c
director: Fix logging last input/output time when there was no input/output
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22255
diff
changeset
|
188 } |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
189 if (conn->connected) { |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
190 str_printfa(str, ", connected %u.%03u s ago", |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
191 connected_msecs/1000, connected_msecs%1000); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
192 } |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
193 if (o_stream_get_buffer_used_size(conn->output) > 0) { |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
194 str_printfa(str, ", %"PRIuSIZE_T" bytes in output buffer", |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
195 o_stream_get_buffer_used_size(conn->output)); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
196 } |
22649
bb7c452e3662
director: Include peak output buffer size in director connection log messages
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22648
diff
changeset
|
197 str_printfa(str, ", %zu peak output buffer size", |
bb7c452e3662
director: Include peak output buffer size in director connection log messages
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22648
diff
changeset
|
198 conn->peak_bytes_buffered); |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
199 } |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
200 |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
201 static void |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
202 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
|
203 { |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
204 struct timeval start_time; |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
205 string_t *reason = t_str_new(128); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
206 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
207 if (!conn->connected) { |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
208 start_time = conn->created; |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
209 str_append(reason, "Connect timed out"); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
210 } else if (!conn->me_received) { |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
211 start_time = conn->connected_time; |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
212 str_append(reason, "Handshaking ME timed out"); |
22251
dce18ed41532
director: Fix "sending handshake timed out" error to be actually logged
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22250
diff
changeset
|
213 } else if (!conn->in) { |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
214 start_time = conn->me_received_time; |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
215 str_append(reason, "Sending handshake timed out"); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
216 } else { |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
217 start_time = conn->me_received_time; |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
218 str_append(reason, "Handshaking DONE timed out"); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
219 } |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
220 int msecs = timeval_diff_msecs(&ioloop_timeval, &start_time); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
221 str_printfa(reason, " (%u.%03u secs, ", msecs/1000, msecs%1000); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
222 director_connection_append_stats(conn, reason); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
223 str_append_c(reason, ')'); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
224 |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
225 i_error("director(%s): %s", conn->name, str_c(reason)); |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
226 director_connection_disconnected(&conn, "Handshake timeout"); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
227 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
228 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
229 static void |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
230 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
|
231 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
232 unsigned int msecs; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
233 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
234 msecs = conn->synced || !conn->handshake_received ? |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
235 DIRECTOR_CONNECTION_PING_INTERVAL_MSECS : |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
236 DIRECTOR_CONNECTION_PING_SYNC_INTERVAL_MSECS; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
237 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
238 timeout_remove(&conn->to_ping); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
239 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
|
240 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
241 |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
242 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
|
243 { |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
244 director_connection_log_disconnect(conn, ETIMEDOUT, ""); |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
245 director_connection_deinit(&conn, |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
246 "Timeout waiting for disconnect after CONNECT"); |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
247 } |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
248 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
249 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
|
250 struct director_host *host) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
251 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
252 const char *connect_str; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
253 |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
254 if (conn->to_disconnect != NULL) |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
255 return; |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
256 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
257 connect_str = t_strdup_printf("CONNECT\t%s\t%u\n", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
258 host->ip_str, host->port); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
259 director_connection_send(conn, connect_str); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
260 o_stream_uncork(conn->output); |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
261 |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
262 /* wait for a while for the remote to disconnect, so it will hopefully |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
263 see our CONNECT command. we'll also log the warning later to avoid |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
264 multiple log lines about it. */ |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
265 conn->connect_request_to = host; |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
266 director_host_ref(conn->connect_request_to); |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
267 |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
268 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
|
269 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
|
270 director_connection_wait_timeout, conn); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
271 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
272 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
273 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
|
274 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
275 struct director *dir = conn->dir; |
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 if (dir->left != NULL && dir->right != NULL) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
278 /* 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
|
279 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
|
280 dir->sync_seq++; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
281 director_set_ring_unsynced(dir); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
282 director_sync_send(dir, dir->self_host, dir->sync_seq, |
19293
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
283 DIRECTOR_VERSION_MINOR, ioloop_time, |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
284 mail_hosts_hash(dir->mail_hosts)); |
14409
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 director_connection_set_ping_timeout(conn); |
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_left(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 i_assert(dir->left != conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
295 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
296 /* 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
|
297 if (conn->host->self) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
298 i_error("Connection from self, dropping"); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
299 return FALSE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
300 } else if (dir->left == NULL) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
301 /* no conflicts yet */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
302 } else if (dir->left->host == conn->host) { |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
303 i_warning("Replacing left director connection %s with %s", |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
304 dir->left->host->name, conn->host->name); |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
305 director_connection_deinit(&dir->left, t_strdup_printf( |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
306 "Replacing with %s", conn->host->name)); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
307 } else if (dir->left->verifying_left) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
308 /* 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
|
309 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
|
310 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
|
311 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
|
312 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
|
313 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
314 } 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
|
315 dir->self_host) < 0) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
316 /* the old connection is the correct one. |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
317 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
|
318 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
|
319 return TRUE; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
320 } else { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
321 /* 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
|
322 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
|
323 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
|
324 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
|
325 switch will be fast. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
326 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
327 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
328 dir->left = conn; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
329 i_free(conn->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
330 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
|
331 director_connection_assigned(conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
332 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
333 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
334 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
335 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
|
336 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
337 struct director_connection *conn, *const *connp; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
338 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
339 array_foreach(&dir->connections, connp) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
340 conn = *connp; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
341 |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
342 if (conn->in && conn->handshake_received && |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
343 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
|
344 /* either use this or disconnect it */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
345 if (!director_connection_assign_left(conn)) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
346 /* we don't want this */ |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
347 director_connection_deinit(&conn, |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
348 "Unwanted incoming connection"); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
349 director_assign_left(dir); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
350 break; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
351 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
352 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
353 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
354 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
355 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
356 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
|
357 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
358 struct director_connection *const *connp; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
359 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
360 array_foreach(&dir->connections, connp) { |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
361 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
|
362 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
363 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
364 return FALSE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
365 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
366 |
20971
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
367 static void director_send_delayed_syncs(struct director *dir) |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
368 { |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
369 struct director_host *const *hostp; |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
370 |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
371 i_assert(dir->right != NULL); |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
372 |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
373 dir_debug("director(%s): Sending delayed SYNCs", dir->right->name); |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
374 array_foreach(&dir->dir_hosts, hostp) { |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
375 if ((*hostp)->delayed_sync_seq == 0) |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
376 continue; |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
377 |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
378 director_sync_send(dir, *hostp, (*hostp)->delayed_sync_seq, |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
379 (*hostp)->delayed_sync_minor_version, |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
380 (*hostp)->delayed_sync_timestamp, |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
381 (*hostp)->delayed_sync_hosts_hash); |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
382 (*hostp)->delayed_sync_seq = 0; |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
383 } |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
384 } |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
385 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
386 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
|
387 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
388 struct director *dir = conn->dir; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
389 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
390 i_assert(!conn->in); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
391 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
392 if (dir->right != NULL) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
393 /* 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
|
394 connection. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
395 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
|
396 dir->self_host) <= 0) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
397 /* the old connection is the correct one */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
398 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
|
399 "(already connected to correct one: %s)", |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
400 conn->host->name, dir->right->host->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
401 conn->wrong_host = TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
402 return FALSE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
403 } |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
404 i_warning("Replacing right director connection %s with %s", |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
405 dir->right->host->name, conn->host->name); |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
406 director_connection_deinit(&dir->right, t_strdup_printf( |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
407 "Replacing with %s", conn->host->name)); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
408 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
409 dir->right = conn; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
410 i_free(conn->name); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
411 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
|
412 director_connection_assigned(conn); |
20971
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
413 director_send_delayed_syncs(dir); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
414 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
415 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
416 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 static bool |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 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
|
419 const char *const *args, |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18858
diff
changeset
|
420 struct ip_addr *ip_r, in_port_t *port_r) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
421 { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
422 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
|
423 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
|
424 return FALSE; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
425 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 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
|
427 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
|
428 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
429 } |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18858
diff
changeset
|
430 if (net_str2port(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
|
431 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
|
432 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
434 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
435 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
436 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 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
|
438 const char *const *args) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
439 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
440 struct director *dir = conn->dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
441 const char *connect_str; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
442 struct ip_addr ip; |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18858
diff
changeset
|
443 in_port_t port; |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
444 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
|
445 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
446 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
|
447 return FALSE; |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
448 if (conn->me_received) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
449 director_cmd_error(conn, "Duplicate ME"); |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
450 return FALSE; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
451 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
452 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
453 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
|
454 conn->host->port != port)) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
455 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
|
456 "(connected to %s:%u, remote says it's %s:%u)", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
457 conn->host->ip_str, conn->host->port, |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
458 net_ip2addr(&ip), port); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
459 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
460 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
461 conn->me_received = TRUE; |
22252
8882a5cbe76d
director: Use more accurate timestamps for handshake timeout logging
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22251
diff
changeset
|
462 conn->me_received_time = ioloop_timeval; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
463 |
19294
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
464 if (args[2] != NULL) { |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
465 time_t remote_time; |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
466 int diff; |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
467 |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
468 if (str_to_time(args[2], &remote_time) < 0) { |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
469 director_cmd_error(conn, "Invalid ME timestamp"); |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
470 return FALSE; |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
471 } |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
472 diff = ioloop_time - remote_time; |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
473 if (diff > DIRECTOR_MAX_CLOCK_DIFF_WARN_SECS || |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
474 (diff < 0 && -diff > DIRECTOR_MAX_CLOCK_DIFF_WARN_SECS)) { |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
475 i_warning("Director %s clock differs from ours by %d secs", |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
476 conn->name, diff); |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
477 } |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
478 } |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
479 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
480 timeout_remove(&conn->to_ping); |
22250
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
481 if (conn->in) { |
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
482 conn->to_ping = timeout_add(DIRECTOR_CONNECTION_DONE_TIMEOUT_MSECS, |
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
483 director_connection_init_timeout, conn); |
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
484 } else { |
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
485 conn->to_ping = timeout_add(DIRECTOR_CONNECTION_SEND_USERS_TIMEOUT_MSECS, |
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
486 director_connection_init_timeout, conn); |
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
487 } |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
488 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
489 if (!conn->in) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
490 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
491 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
492 /* Incoming connection: |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
493 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
494 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
|
495 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
|
496 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
497 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
|
498 is most likely dead. |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
499 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
500 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
|
501 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
|
502 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
503 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
|
504 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
|
505 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
|
506 */ |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
507 i_assert(conn->host == NULL); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
508 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
|
509 /* 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
|
510 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
|
511 conn->host->removed = FALSE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
512 director_host_ref(conn->host); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
513 /* make sure we don't keep old sequence values across restarts */ |
16699
9531ec8afe8b
director: Reset last-seen-sync-sequence after remote director restarts.
Timo Sirainen <tss@iki.fi>
parents:
16695
diff
changeset
|
514 director_host_restarted(conn->host); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
515 |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
516 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
|
517 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
|
518 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
|
519 /* 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
|
520 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
|
521 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
|
522 "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
|
523 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
|
524 return FALSE; |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
525 } else if (dir->left == NULL) { |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
526 /* 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
|
527 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
|
528 conn->host->last_network_failure = 0; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
529 if (!director_has_outgoing_connections(dir)) |
22564
17b1e65e6d70
director: Log info line for every incoming/outgoing connection
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22562
diff
changeset
|
530 director_connect(dir, "Connecting to left"); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
531 } else if (dir->left->host == conn->host) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
532 /* b) */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
533 i_assert(dir->left != conn); |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
534 director_connection_deinit(&dir->left, |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
535 "Replacing with new incoming connection"); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
536 } 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
|
537 dir->self_host) < 0) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
538 /* c) */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
539 connect_str = t_strdup_printf("CONNECT\t%s\t%u\n", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
540 conn->host->ip_str, |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
541 conn->host->port); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
542 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
|
543 } else { |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
544 /* d) */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
545 dir->left->verifying_left = TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
546 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
|
547 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
548 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
549 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
550 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
551 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
|
552 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
|
553 unsigned int username_hash, struct mail_host *host, |
20978
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
554 time_t timestamp, bool weak, bool *forced_r, |
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
555 struct user **user_r) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
556 { |
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
|
557 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
|
558 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
|
559 bool ret = FALSE, unset_weak_user = FALSE; |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
560 struct user_directory *users = host->tag->users; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
561 |
20978
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
562 *forced_r = FALSE; |
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
563 |
21074
6543f5b25252
director: Code cleanup - use temporary users variables
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20988
diff
changeset
|
564 user = user_directory_lookup(users, username_hash); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
565 if (user == NULL) { |
21074
6543f5b25252
director: Code cleanup - use temporary users variables
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20988
diff
changeset
|
566 *user_r = user_directory_add(users, username_hash, |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
567 host, timestamp); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
568 (*user_r)->weak = weak; |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
569 dir_debug("user refresh: %u added", username_hash); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
570 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
571 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
572 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
573 if (user->weak) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
574 if (!weak) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
575 /* removing user's weakness */ |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
576 dir_debug("user refresh: %u weakness removed", |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
577 username_hash); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
578 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
|
579 user->weak = FALSE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
580 ret = TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
581 } else { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
582 /* 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
|
583 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
584 } else if (weak && |
21074
6543f5b25252
director: Code cleanup - use temporary users variables
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20988
diff
changeset
|
585 !user_directory_user_is_recently_updated(users, user)) { |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
586 /* mark the user as weak */ |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
587 dir_debug("user refresh: %u set weak", username_hash); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
588 user->weak = TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
589 ret = TRUE; |
16619
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
590 } else if (weak) { |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
591 dir_debug("user refresh: %u weak update to %s ignored, " |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
592 "we recently changed it to %s", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
593 username_hash, host->ip_str, |
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
594 user->host->ip_str); |
16619
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
595 host = user->host; |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
596 ret = TRUE; |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
597 } else if (user->host == host) { |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
598 /* update to the same host */ |
21074
6543f5b25252
director: Code cleanup - use temporary users variables
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20988
diff
changeset
|
599 } else if (user_directory_user_is_near_expiring(users, user)) { |
16619
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
600 /* host conflict for a user that is already near expiring. we can |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
601 assume that the other director had already dropped this user |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
602 and we should have as well. use the new host. */ |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
603 dir_debug("user refresh: %u is nearly expired, " |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
604 "replacing host %s with %s", username_hash, |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
605 user->host->ip_str, host->ip_str); |
16619
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
606 ret = TRUE; |
20986
410eacd7ad40
director: Code cleanup - added USER_IS_BEING_KILLED() macro
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20981
diff
changeset
|
607 } else if (USER_IS_BEING_KILLED(user)) { |
18708
51ee438392c7
director: Moving a user to another host sometimes caused the move to fail.
Timo Sirainen <tss@iki.fi>
parents:
18665
diff
changeset
|
608 /* user is still being moved - ignore conflicting host updates |
51ee438392c7
director: Moving a user to another host sometimes caused the move to fail.
Timo Sirainen <tss@iki.fi>
parents:
18665
diff
changeset
|
609 from other directors who don't yet know about the move. */ |
51ee438392c7
director: Moving a user to another host sometimes caused the move to fail.
Timo Sirainen <tss@iki.fi>
parents:
18665
diff
changeset
|
610 dir_debug("user refresh: %u is being moved, " |
51ee438392c7
director: Moving a user to another host sometimes caused the move to fail.
Timo Sirainen <tss@iki.fi>
parents:
18665
diff
changeset
|
611 "preserve its host %s instead of replacing with %s", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
612 username_hash, user->host->ip_str, host->ip_str); |
18708
51ee438392c7
director: Moving a user to another host sometimes caused the move to fail.
Timo Sirainen <tss@iki.fi>
parents:
18665
diff
changeset
|
613 host = user->host; |
16619
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
614 } else { |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
615 /* 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
|
616 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
|
617 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
|
618 |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
619 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
|
620 "is being redirected to two hosts: %s and %s", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
621 username_hash, user->host->ip_str, host->ip_str); |
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
|
622 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
|
623 |
d048cebc1fd4
director: Add more info to "User hash .. is being redirected to two hosts" error.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
624 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
|
625 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
|
626 (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
|
627 } |
20986
410eacd7ad40
director: Code cleanup - added USER_IS_BEING_KILLED() macro
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20981
diff
changeset
|
628 if (USER_IS_BEING_KILLED(user)) { |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
629 if (user->kill_ctx->to_move != NULL) |
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
630 str_append(str, ",moving"); |
20974
7ea3a96eea43
director: Log user's kill_state with a human-readable string.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20972
diff
changeset
|
631 str_printfa(str, ",kill_state=%s", |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
632 user_kill_state_names[user->kill_ctx->kill_state]); |
20974
7ea3a96eea43
director: Log user's kill_state with a human-readable string.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20972
diff
changeset
|
633 } |
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
|
634 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
|
635 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
|
636 |
11585 | 637 /* we want all the directors to redirect the user to same |
638 server, but we don't want two directors fighting over which | |
639 server it belongs to, so always use the lower IP address */ | |
640 if (net_ip_cmp(&user->host->ip, &host->ip) > 0) { | |
641 /* change the host. we'll also need to remove the user | |
642 from the old host's user_count, because we can't | |
20978
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
643 keep track of the user for more than one host. |
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
644 |
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
645 send the updated USER back to the sender as well. */ |
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
646 *forced_r = TRUE; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
647 } else { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
648 /* keep the host */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
649 host = user->host; |
11585 | 650 } |
17419
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
651 /* especially IMAP connections can take a long time to die. |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
652 make sure we kill off the connections in the wrong |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
653 backends. */ |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
654 director_kick_user_hash(dir, dir->self_host, NULL, |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
655 username_hash, &host->ip); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
656 ret = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
657 } |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
658 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
|
659 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
|
660 user->host = host; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
661 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
|
662 ret = TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
663 } |
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
|
664 if (timestamp == ioloop_time && (time_t)user->timestamp != timestamp) { |
21074
6543f5b25252
director: Code cleanup - use temporary users variables
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20988
diff
changeset
|
665 user_directory_refresh(users, user); |
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
|
666 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
|
667 } |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
668 dir_debug("user refresh: %u refreshed timeout to %ld", |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
669 username_hash, (long)user->timestamp); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
670 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
671 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
|
672 /* 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
|
673 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
|
674 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
|
675 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
676 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
677 *user_r = user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
678 return ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
679 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
680 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
681 static bool |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
682 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
|
683 const char *const *args) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
684 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
685 unsigned int username_hash, timestamp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
686 struct ip_addr ip; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
687 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
688 struct user *user; |
20978
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
689 bool weak, forced; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
690 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
691 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
|
692 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
|
693 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
|
694 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
|
695 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
|
696 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
697 } |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
698 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
|
699 |
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
|
700 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
|
701 if (host == NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
702 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
|
703 conn->name, args[1]); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
704 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
705 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
706 |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
707 (void)director_user_refresh(conn, username_hash, host, |
20978
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
708 timestamp, weak, &forced, &user); |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
709 if (user->timestamp < timestamp) { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
710 conn->users_unsorted = TRUE; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
711 user->timestamp = timestamp; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
712 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
713 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
714 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
715 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
716 static bool |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
717 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
|
718 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
|
719 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
720 unsigned int username_hash; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
721 struct ip_addr ip; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
722 struct mail_host *host; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
723 struct user *user; |
20978
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
724 bool forced; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
725 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
726 /* NOTE: if more parameters are added, update also |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
727 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
|
728 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
|
729 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
|
730 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
|
731 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
|
732 return FALSE; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
733 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
734 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
735 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
|
736 if (host == NULL) { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
737 /* 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
|
738 return TRUE; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
739 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
740 |
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
|
741 if (director_user_refresh(conn, username_hash, |
20978
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
742 host, ioloop_time, FALSE, &forced, &user)) { |
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
743 struct director_host *src_host = |
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
744 forced ? conn->dir->self_host : conn->host; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
745 i_assert(!user->weak); |
20978
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
746 director_update_user(conn->dir, src_host, user); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
747 } |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
748 return TRUE; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
749 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
750 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
751 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
|
752 const char *const *args) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
753 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
754 struct director_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
755 struct ip_addr ip; |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18858
diff
changeset
|
756 in_port_t port; |
22562
3af1ba6b5248
director: Log info line whenever a director is added/removed from ring
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22446
diff
changeset
|
757 bool log_add = FALSE; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
758 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
759 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
|
760 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
761 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
762 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
|
763 if (host != NULL) { |
14493
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
764 if (host == conn->dir->self_host) { |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
765 /* ignore updates to ourself */ |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
766 return TRUE; |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
767 } |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
768 if (host->removed) { |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
769 /* 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
|
770 return TRUE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
771 } |
14493
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
772 |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
773 /* already have this. just reset its last_network_failure |
22565
ad4d877d655b
director: Don't reset directors' last_network_failure while handshaking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22564
diff
changeset
|
774 timestamp, since it might be up now, but only if this |
ad4d877d655b
director: Don't reset directors' last_network_failure while handshaking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22564
diff
changeset
|
775 isn't part of the handshake. (if it was, reseting the |
ad4d877d655b
director: Don't reset directors' last_network_failure while handshaking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22564
diff
changeset
|
776 timestamp could cause us to rapidly keep trying to connect |
ad4d877d655b
director: Don't reset directors' last_network_failure while handshaking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22564
diff
changeset
|
777 to it) */ |
ad4d877d655b
director: Don't reset directors' last_network_failure while handshaking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22564
diff
changeset
|
778 if (conn->handshake_received) |
ad4d877d655b
director: Don't reset directors' last_network_failure while handshaking
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22564
diff
changeset
|
779 host->last_network_failure = 0; |
16789
5d43c926eb97
director: Make sure director restart notifications go to everyone in the ring.
Timo Sirainen <tss@iki.fi>
parents:
16788
diff
changeset
|
780 /* it also may have been restarted, reset its state */ |
5d43c926eb97
director: Make sure director restart notifications go to everyone in the ring.
Timo Sirainen <tss@iki.fi>
parents:
16788
diff
changeset
|
781 director_host_restarted(host); |
14493
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
782 } else { |
1856e9085f94
director: Forward DIRECTOR commands to other connected directors.
Timo Sirainen <tss@iki.fi>
parents:
14488
diff
changeset
|
783 /* 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
|
784 host = director_host_add(conn->dir, &ip, port); |
22562
3af1ba6b5248
director: Log info line whenever a director is added/removed from ring
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22446
diff
changeset
|
785 log_add = TRUE; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
786 } |
16789
5d43c926eb97
director: Make sure director restart notifications go to everyone in the ring.
Timo Sirainen <tss@iki.fi>
parents:
16788
diff
changeset
|
787 /* just forward this to the entire ring until it reaches back to |
5d43c926eb97
director: Make sure director restart notifications go to everyone in the ring.
Timo Sirainen <tss@iki.fi>
parents:
16788
diff
changeset
|
788 itself. some hosts may see this twice, but that's the only way to |
5d43c926eb97
director: Make sure director restart notifications go to everyone in the ring.
Timo Sirainen <tss@iki.fi>
parents:
16788
diff
changeset
|
789 guarantee that it gets seen by everyone. reseting the host multiple |
5d43c926eb97
director: Make sure director restart notifications go to everyone in the ring.
Timo Sirainen <tss@iki.fi>
parents:
16788
diff
changeset
|
790 times may cause us to handle its commands multiple times, but the |
18665
b7aed6290e7e
director: Don't send DIRECTOR command infinitely in loop if that director got disconnected.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
791 commands can handle that. however, we need to also handle a |
b7aed6290e7e
director: Don't send DIRECTOR command infinitely in loop if that director got disconnected.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
792 situation where the added director never comes back - we don't want |
b7aed6290e7e
director: Don't send DIRECTOR command infinitely in loop if that director got disconnected.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
793 to send the director information in a loop forever. */ |
b7aed6290e7e
director: Don't send DIRECTOR command infinitely in loop if that director got disconnected.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
794 if (conn->dir->right != NULL && |
b7aed6290e7e
director: Don't send DIRECTOR command infinitely in loop if that director got disconnected.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
795 director_host_cmp_to_self(host, conn->dir->right->host, |
b7aed6290e7e
director: Don't send DIRECTOR command infinitely in loop if that director got disconnected.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
796 conn->dir->self_host) > 0) { |
b7aed6290e7e
director: Don't send DIRECTOR command infinitely in loop if that director got disconnected.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
797 dir_debug("Received DIRECTOR update for a host where we should be connected to. " |
b7aed6290e7e
director: Don't send DIRECTOR command infinitely in loop if that director got disconnected.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
798 "Not forwarding it since it's probably crashed."); |
b7aed6290e7e
director: Don't send DIRECTOR command infinitely in loop if that director got disconnected.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
799 } else { |
b7aed6290e7e
director: Don't send DIRECTOR command infinitely in loop if that director got disconnected.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
800 director_notify_ring_added(host, |
22562
3af1ba6b5248
director: Log info line whenever a director is added/removed from ring
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22446
diff
changeset
|
801 director_connection_get_host(conn), log_add); |
18665
b7aed6290e7e
director: Don't send DIRECTOR command infinitely in loop if that director got disconnected.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
802 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
803 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
804 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
805 |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
806 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
|
807 const char *const *args) |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
808 { |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
809 struct director_host *host; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
810 struct ip_addr ip; |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18858
diff
changeset
|
811 in_port_t port; |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
812 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
813 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
|
814 return FALSE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
815 |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
816 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
|
817 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
|
818 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
|
819 return TRUE; |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
820 } |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
821 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
822 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
|
823 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
|
824 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
|
825 { |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
826 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
|
827 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
|
828 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
|
829 |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
830 if (args[0] == NULL || |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
831 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
|
832 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
|
833 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
|
834 } |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
835 |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
836 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
|
837 /* clear everything we have and use only what remote sends us */ |
20981
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
838 dir_debug("%s: We're joining a ring - replace all hosts", |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
839 conn->name); |
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
|
840 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
|
841 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
|
842 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
|
843 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
|
844 } |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
845 } 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
|
846 /* ignore whatever remote sends */ |
20981
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
847 dir_debug("%s: Remote is joining our ring - " |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
848 "ignore all remote HOSTs", conn->name); |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
849 conn->ignore_host_events = TRUE; |
20981
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
850 } else { |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
851 dir_debug("%s: Merge rings' hosts", conn->name); |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
852 } |
11585 | 853 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
|
854 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
|
855 } |
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
856 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
857 static int |
20981
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
858 director_cmd_is_seen_full(struct director_connection *conn, |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
859 const char *const **_args, unsigned int *seq_r, |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
860 struct director_host **host_r) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
861 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
862 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
|
863 struct ip_addr ip; |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18858
diff
changeset
|
864 in_port_t port; |
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18858
diff
changeset
|
865 unsigned int seq; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
866 struct director_host *host; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
867 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
868 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
|
869 net_addr2ip(args[0], &ip) < 0 || |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18858
diff
changeset
|
870 net_str2port(args[1], &port) < 0 || |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
871 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
|
872 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
|
873 return -1; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
874 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
875 *_args = args + 3; |
20981
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
876 *seq_r = seq; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
877 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
878 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
|
879 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
|
880 /* 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
|
881 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
|
882 ourself. */ |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
883 *host_r = NULL; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
884 } else { |
15350 | 885 *host_r = host; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
886 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
|
887 /* already seen this */ |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
888 return 1; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
889 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
890 host->last_seq = seq; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
891 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
892 return 0; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
893 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
894 |
20981
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
895 static int |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
896 director_cmd_is_seen(struct director_connection *conn, |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
897 const char *const **_args, |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
898 struct director_host **host_r) |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
899 { |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
900 unsigned int seq; |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
901 |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
902 return director_cmd_is_seen_full(conn, _args, &seq, host_r); |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
903 } |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
904 |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
905 static bool |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
906 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
|
907 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
|
908 { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
909 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
|
910 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
|
911 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
|
912 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
|
913 struct user *user; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
914 struct director_host *src_host = conn->host; |
20978
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
915 bool weak = TRUE, weak_forward = FALSE, forced; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
916 int ret; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
917 |
15320
e4c337f38ed6
director: Fixed previous broken change for handling USER-WEAK commands.
Timo Sirainen <tss@iki.fi>
parents:
15132
diff
changeset
|
918 /* note that unlike other commands we don't want to just ignore |
e4c337f38ed6
director: Fixed previous broken change for handling USER-WEAK commands.
Timo Sirainen <tss@iki.fi>
parents:
15132
diff
changeset
|
919 duplicate commands */ |
e4c337f38ed6
director: Fixed previous broken change for handling USER-WEAK commands.
Timo Sirainen <tss@iki.fi>
parents:
15132
diff
changeset
|
920 if ((ret = director_cmd_is_seen(conn, &args, &dir_host)) < 0) |
15324 | 921 return FALSE; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
922 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
923 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
|
924 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
|
925 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
|
926 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
|
927 return FALSE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
928 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
929 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
930 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
|
931 if (host == NULL) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
932 /* 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
|
933 return TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
934 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
935 |
19953
a502d38e7b70
director: Fixed user weakness getting stuck if multiple directors set user weak simultaneously
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19608
diff
changeset
|
936 if (ret == 0) { |
a502d38e7b70
director: Fixed user weakness getting stuck if multiple directors set user weak simultaneously
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19608
diff
changeset
|
937 /* First time we're seeing this - forward it to others also. |
a502d38e7b70
director: Fixed user weakness getting stuck if multiple directors set user weak simultaneously
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19608
diff
changeset
|
938 We'll want to do it even if the user was already marked as |
a502d38e7b70
director: Fixed user weakness getting stuck if multiple directors set user weak simultaneously
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19608
diff
changeset
|
939 weak, because otherwise if two directors mark the user weak |
a502d38e7b70
director: Fixed user weakness getting stuck if multiple directors set user weak simultaneously
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19608
diff
changeset
|
940 at the same time both the USER-WEAK notifications reach |
a502d38e7b70
director: Fixed user weakness getting stuck if multiple directors set user weak simultaneously
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19608
diff
changeset
|
941 only half the directors until they collide and neither one |
a502d38e7b70
director: Fixed user weakness getting stuck if multiple directors set user weak simultaneously
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19608
diff
changeset
|
942 finishes going through the whole ring marking the user |
a502d38e7b70
director: Fixed user weakness getting stuck if multiple directors set user weak simultaneously
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19608
diff
changeset
|
943 non-weak. */ |
a502d38e7b70
director: Fixed user weakness getting stuck if multiple directors set user weak simultaneously
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19608
diff
changeset
|
944 weak_forward = TRUE; |
a502d38e7b70
director: Fixed user weakness getting stuck if multiple directors set user weak simultaneously
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19608
diff
changeset
|
945 } else if (dir_host == conn->dir->self_host) { |
16619
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
946 /* We originated this USER-WEAK request. The entire ring has seen |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
947 it and there weren't any conflicts. Make the user non-weak. */ |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
948 dir_debug("user refresh: %u Our USER-WEAK seen by the entire ring", |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
949 username_hash); |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
950 src_host = conn->dir->self_host; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
951 weak = FALSE; |
16619
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
952 } else { |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
953 /* The original USER-WEAK sender will send a new non-weak USER |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
954 update saying what really happened. We'll still need to forward |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
955 this around the ring to the origin so it also knows it has |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
956 travelled through the ring. */ |
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
957 dir_debug("user refresh: %u Remote USER-WEAK from %s seen by the entire ring, ignoring", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
958 username_hash, dir_host->ip_str); |
16619
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
959 weak_forward = TRUE; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
960 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
961 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
962 if (director_user_refresh(conn, username_hash, |
20978
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
963 host, ioloop_time, weak, &forced, &user) || |
16619
9b8b5ce6ecb0
director: Fixes to handling users near expiration.
Timo Sirainen <tss@iki.fi>
parents:
16618
diff
changeset
|
964 weak_forward) { |
20978
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
965 if (forced) |
7a4fb29a4e52
director: If user host conflict is detected, make sure new host is sent back.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20974
diff
changeset
|
966 src_host = conn->dir->self_host; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
967 if (!user->weak) |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
968 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
|
969 else { |
17259
6269063f8408
director: Fixed handling weak users when there were exactly 2 director servers in the ring.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
970 director_update_user_weak(conn->dir, src_host, conn, |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
971 dir_host, user); |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
972 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
973 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
974 return TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
975 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
976 |
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
|
977 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
|
978 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
|
979 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
|
980 { |
19287
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
19036
diff
changeset
|
981 struct director_host *src_host = conn->host; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
982 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
983 struct ip_addr ip; |
19408
7e47f561ad49
director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents:
19407
diff
changeset
|
984 const char *tag = "", *host_tag, *hostname = NULL; |
19309
8e9cada0c8fc
director: Small code cleanup - make it easier to add parameters to HOST
Timo Sirainen <tss@iki.fi>
parents:
19294
diff
changeset
|
985 unsigned int arg_count, vhost_count; |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
986 bool update, down = FALSE; |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
987 time_t last_updown_change = 0; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
988 |
19309
8e9cada0c8fc
director: Small code cleanup - make it easier to add parameters to HOST
Timo Sirainen <tss@iki.fi>
parents:
19294
diff
changeset
|
989 arg_count = str_array_length(args); |
8e9cada0c8fc
director: Small code cleanup - make it easier to add parameters to HOST
Timo Sirainen <tss@iki.fi>
parents:
19294
diff
changeset
|
990 if (arg_count < 2 || |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
991 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
|
992 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
|
993 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
|
994 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
995 } |
19309
8e9cada0c8fc
director: Small code cleanup - make it easier to add parameters to HOST
Timo Sirainen <tss@iki.fi>
parents:
19294
diff
changeset
|
996 if (arg_count >= 3) |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
997 tag = args[2]; |
19309
8e9cada0c8fc
director: Small code cleanup - make it easier to add parameters to HOST
Timo Sirainen <tss@iki.fi>
parents:
19294
diff
changeset
|
998 if (arg_count >= 4) { |
8e9cada0c8fc
director: Small code cleanup - make it easier to add parameters to HOST
Timo Sirainen <tss@iki.fi>
parents:
19294
diff
changeset
|
999 if ((args[3][0] != 'D' && args[3][0] != 'U') || |
8e9cada0c8fc
director: Small code cleanup - make it easier to add parameters to HOST
Timo Sirainen <tss@iki.fi>
parents:
19294
diff
changeset
|
1000 str_to_time(args[3]+1, &last_updown_change) < 0) { |
8e9cada0c8fc
director: Small code cleanup - make it easier to add parameters to HOST
Timo Sirainen <tss@iki.fi>
parents:
19294
diff
changeset
|
1001 director_cmd_error(conn, "Invalid updown parameters"); |
8e9cada0c8fc
director: Small code cleanup - make it easier to add parameters to HOST
Timo Sirainen <tss@iki.fi>
parents:
19294
diff
changeset
|
1002 return FALSE; |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
1003 } |
19309
8e9cada0c8fc
director: Small code cleanup - make it easier to add parameters to HOST
Timo Sirainen <tss@iki.fi>
parents:
19294
diff
changeset
|
1004 down = args[3][0] == 'D'; |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
1005 } |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19309
diff
changeset
|
1006 if (arg_count >= 5) |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19309
diff
changeset
|
1007 hostname = args[4]; |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
1008 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
|
1009 /* 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
|
1010 a completed ring and we do. */ |
11585 | 1011 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
|
1012 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
|
1013 } |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
1014 if (tag[0] != '\0' && conn->minor_version < DIRECTOR_VERSION_TAGS_V2) { |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
1015 director_cmd_error(conn, "Received a host tag from older director version with incompatible tagging support"); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
1016 return FALSE; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
1017 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1018 |
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
|
1019 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
|
1020 if (host == NULL) { |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19309
diff
changeset
|
1021 host = mail_host_add_hostname(conn->dir->mail_hosts, |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19309
diff
changeset
|
1022 hostname, &ip, tag); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1023 update = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1024 } else { |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
1025 update = host->vhost_count != vhost_count || |
19506
e6aa0aa3d599
director: Don't trigger a ring resync if only last_updown_change has changed.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19411
diff
changeset
|
1026 host->down != down; |
19292
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19289
diff
changeset
|
1027 |
19408
7e47f561ad49
director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents:
19407
diff
changeset
|
1028 host_tag = mail_host_get_tag(host); |
7e47f561ad49
director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents:
19407
diff
changeset
|
1029 if (strcmp(tag, host_tag) != 0) { |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
1030 i_error("director(%s): Host %s changed tag from '%s' to '%s'", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
1031 conn->name, host->ip_str, |
19408
7e47f561ad49
director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents:
19407
diff
changeset
|
1032 host_tag, tag); |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
1033 mail_host_set_tag(host, tag); |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
1034 update = TRUE; |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
1035 } |
19287
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
19036
diff
changeset
|
1036 if (update && host->desynced) { |
19608
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1037 string_t *str = t_str_new(128); |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1038 |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1039 str_printfa(str, "director(%s): Host %s is being updated before previous update had finished (", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
1040 conn->name, host->ip_str); |
20286
4d926d1e9164
director: Fixed ignoring an obsolete up/down change while host is desynced.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20264
diff
changeset
|
1041 if (host->down != down && |
4d926d1e9164
director: Fixed ignoring an obsolete up/down change while host is desynced.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20264
diff
changeset
|
1042 host->last_updown_change > last_updown_change) { |
4d926d1e9164
director: Fixed ignoring an obsolete up/down change while host is desynced.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20264
diff
changeset
|
1043 /* our host has a newer change. preserve it. */ |
4d926d1e9164
director: Fixed ignoring an obsolete up/down change while host is desynced.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20264
diff
changeset
|
1044 down = host->down; |
4d926d1e9164
director: Fixed ignoring an obsolete up/down change while host is desynced.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20264
diff
changeset
|
1045 } |
19608
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1046 if (host->down != down) { |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1047 if (host->down) |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1048 str_append(str, "down -> up"); |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1049 else |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1050 str_append(str, "up -> down"); |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1051 } |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1052 if (host->vhost_count != vhost_count) { |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1053 if (host->down != down) |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1054 str_append(str, ", "); |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1055 str_printfa(str, "vhosts %u -> %u", |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1056 host->vhost_count, vhost_count); |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1057 } |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1058 str_append(str, ") - "); |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1059 |
19287
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
19036
diff
changeset
|
1060 vhost_count = I_MIN(vhost_count, host->vhost_count); |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
19036
diff
changeset
|
1061 last_updown_change = I_MAX(last_updown_change, |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
19036
diff
changeset
|
1062 host->last_updown_change); |
19608
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1063 str_printfa(str, "setting to state=%s vhosts=%u", |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1064 down ? "down" : "up", vhost_count); |
01e33753b08e
director: "Host is being updated before previous update had finished" logs now details.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
1065 i_warning("%s", str_c(str)); |
19287
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
19036
diff
changeset
|
1066 /* make the change appear to come from us, so it |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
19036
diff
changeset
|
1067 reaches the full ring */ |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
19036
diff
changeset
|
1068 dir_host = NULL; |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
19036
diff
changeset
|
1069 src_host = conn->dir->self_host; |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
19036
diff
changeset
|
1070 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1071 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1072 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1073 if (update) { |
21842
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
1074 const char *log_prefix = t_strdup_printf("director(%s): ", |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
1075 conn->name); |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
1076 mail_host_set_down(host, down, last_updown_change, log_prefix); |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
1077 mail_host_set_vhost_count(host, vhost_count, log_prefix); |
19287
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
19036
diff
changeset
|
1078 director_update_host(conn->dir, src_host, dir_host, host); |
19292
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19289
diff
changeset
|
1079 } else { |
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19289
diff
changeset
|
1080 dir_debug("Ignoring host %s update vhost_count=%u " |
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19289
diff
changeset
|
1081 "down=%d last_updown_change=%ld (hosts_hash=%u)", |
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19289
diff
changeset
|
1082 net_ip2addr(&ip), vhost_count, down, |
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19289
diff
changeset
|
1083 (long)last_updown_change, |
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19289
diff
changeset
|
1084 mail_hosts_hash(conn->dir->mail_hosts)); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1085 } |
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 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1089 static bool |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1090 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
|
1091 const char *const *args) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1092 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1093 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
|
1094 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1095 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1096 static bool |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1097 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
|
1098 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1099 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
|
1100 int ret; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1101 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1102 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
|
1103 return ret > 0; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1104 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
|
1105 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1106 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1107 static bool |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1108 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
|
1109 const char *const *args) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1110 { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1111 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
|
1112 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1113 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
|
1114 int ret; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1115 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1116 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
|
1117 return ret > 0; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1118 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1119 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
|
1120 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
|
1121 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
|
1122 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1123 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1124 |
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
|
1125 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
|
1126 if (host != NULL) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1127 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
|
1128 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1129 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1130 |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
1131 static bool |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
1132 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
|
1133 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
|
1134 { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1135 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
|
1136 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
|
1137 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
|
1138 int ret; |
11355
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
1139 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1140 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
|
1141 return ret > 0; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1142 |
11816
9e41df232dd6
director: Fixed handling HOST-FLUSH commands.
Timo Sirainen <tss@iki.fi>
parents:
11758
diff
changeset
|
1143 if (str_array_length(args) != 1 || |
9e41df232dd6
director: Fixed handling HOST-FLUSH commands.
Timo Sirainen <tss@iki.fi>
parents:
11758
diff
changeset
|
1144 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
|
1145 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
|
1146 return FALSE; |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
1147 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
1148 |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
1149 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
|
1150 if (host != NULL) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1151 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
|
1152 return TRUE; |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
1153 } |
ef1de95396d4
Added doveadm director flush command for dropping user associations from memory.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
1154 |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1155 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
|
1156 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
|
1157 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
|
1158 { |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1159 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
|
1160 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
|
1161 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
|
1162 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
|
1163 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
|
1164 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1165 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
|
1166 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
|
1167 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1168 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
|
1169 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
|
1170 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
|
1171 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
|
1172 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
|
1173 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1174 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1175 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
|
1176 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
|
1177 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
|
1178 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
|
1179 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1180 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
|
1181 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1182 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1183 static bool |
17418
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1184 director_cmd_user_kick(struct director_connection *conn, |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1185 const char *const *args) |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1186 { |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1187 struct director_host *dir_host; |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1188 int ret; |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1189 |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1190 if ((ret = director_cmd_is_seen(conn, &args, &dir_host)) != 0) |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1191 return ret > 0; |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1192 |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1193 if (str_array_length(args) != 1) { |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1194 director_cmd_error(conn, "Invalid parameters"); |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1195 return FALSE; |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1196 } |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1197 |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1198 director_kick_user(conn->dir, conn->host, dir_host, args[0]); |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1199 return TRUE; |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1200 } |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1201 |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1202 static bool |
20846
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1203 director_cmd_user_kick_alt(struct director_connection *conn, |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1204 const char *const *args) |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1205 { |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1206 struct director_host *dir_host; |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1207 int ret; |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1208 |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1209 if ((ret = director_cmd_is_seen(conn, &args, &dir_host)) != 0) |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1210 return ret > 0; |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1211 |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1212 if (str_array_length(args) != 2) { |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1213 director_cmd_error(conn, "Invalid parameters"); |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1214 return FALSE; |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1215 } |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1216 |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1217 director_kick_user_alt(conn->dir, conn->host, dir_host, args[0], args[1]); |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1218 return TRUE; |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1219 } |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1220 |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1221 static bool |
17419
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1222 director_cmd_user_kick_hash(struct director_connection *conn, |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1223 const char *const *args) |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1224 { |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1225 struct director_host *dir_host; |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1226 unsigned int username_hash; |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1227 struct ip_addr except_ip; |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1228 int ret; |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1229 |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1230 if ((ret = director_cmd_is_seen(conn, &args, &dir_host)) != 0) |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1231 return ret > 0; |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1232 |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1233 if (str_array_length(args) != 2 || |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1234 str_to_uint(args[0], &username_hash) < 0 || |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1235 net_addr2ip(args[1], &except_ip) < 0) { |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1236 director_cmd_error(conn, "Invalid parameters"); |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1237 return FALSE; |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1238 } |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1239 |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1240 director_kick_user_hash(conn->dir, conn->host, dir_host, |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1241 username_hash, &except_ip); |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1242 return TRUE; |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1243 } |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1244 |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1245 static bool |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1246 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
|
1247 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
|
1248 { |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1249 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
|
1250 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1251 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
|
1252 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
|
1253 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
|
1254 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
|
1255 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1256 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1257 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
|
1258 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
|
1259 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1260 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1261 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
|
1262 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
|
1263 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
|
1264 { |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1265 struct director_host *dir_host; |
20981
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
1266 unsigned int seq, username_hash; |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1267 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
|
1268 |
20981
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
1269 if ((ret = director_cmd_is_seen_full(conn, &args, &seq, &dir_host)) < 0) |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
1270 return FALSE; |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1271 |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1272 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
|
1273 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
|
1274 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
|
1275 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
|
1276 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1277 |
20981
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
1278 if (ret > 0) { |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
1279 i_assert(dir_host != NULL); |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
1280 dir_debug("User %u - ignoring already seen USER-KILLED-EVERYWHERE " |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
1281 "with seq=%u <= %s.last_seq=%u", username_hash, |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
1282 seq, dir_host->name, dir_host->last_seq); |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
1283 return TRUE; |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
1284 } |
699e305f6a39
director: Improve debug logging output.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20980
diff
changeset
|
1285 |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1286 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
|
1287 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
|
1288 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
|
1289 } |
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12935
diff
changeset
|
1290 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1291 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
|
1292 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1293 struct director *dir = conn->dir; |
22252
8882a5cbe76d
director: Use more accurate timestamps for handshake timeout logging
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22251
diff
changeset
|
1294 int handshake_msecs = timeval_diff_msecs(&ioloop_timeval, &conn->connected_time); |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1295 string_t *str; |
14478
ee169584bc44
director: Improved debug handshake message.
Timo Sirainen <tss@iki.fi>
parents:
14477
diff
changeset
|
1296 |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
1297 if (conn->users_unsorted && conn->user_iter == NULL) { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
1298 /* we sent our user list before receiving remote's */ |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
1299 conn->users_unsorted = FALSE; |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
1300 mail_hosts_sort_users(conn->dir->mail_hosts); |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
1301 } |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
1302 |
18063
91c525000811
director: Always log a message when director handshake finishes.
Timo Sirainen <tss@iki.fi>
parents:
18062
diff
changeset
|
1303 str = t_str_new(128); |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
1304 str_printfa(str, "director(%s): Handshake finished in %u.%03u secs (", |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
1305 conn->name, handshake_msecs/1000, handshake_msecs%1000); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
1306 director_connection_append_stats(conn, str); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
1307 str_append_c(str, ')'); |
22252
8882a5cbe76d
director: Use more accurate timestamps for handshake timeout logging
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22251
diff
changeset
|
1308 if (handshake_msecs >= DIRECTOR_HANDSHAKE_WARN_SECS*1000) |
18063
91c525000811
director: Always log a message when director handshake finishes.
Timo Sirainen <tss@iki.fi>
parents:
18062
diff
changeset
|
1309 i_warning("%s", str_c(str)); |
91c525000811
director: Always log a message when director handshake finishes.
Timo Sirainen <tss@iki.fi>
parents:
18062
diff
changeset
|
1310 else |
91c525000811
director: Always log a message when director handshake finishes.
Timo Sirainen <tss@iki.fi>
parents:
18062
diff
changeset
|
1311 i_info("%s", str_c(str)); |
11579
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1312 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1313 /* 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
|
1314 if needed */ |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
1315 conn->host->last_network_failure = 0; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1316 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1317 conn->handshake_received = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1318 if (conn->in) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1319 /* 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
|
1320 whole handshake. */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1321 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
|
1322 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1323 /* 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
|
1324 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
|
1325 t_strdup_printf("DIRECTOR\t%s\t%u\n", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
1326 conn->host->ip_str, |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1327 conn->host->port)); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1328 /* this is our "left" side. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1329 return director_connection_assign_left(conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1330 } else { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1331 /* handshaked to "right" side. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1332 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
|
1333 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1334 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1335 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1336 static int |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1337 director_handshake_cmd_options(struct director_connection *conn, |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1338 const char *const *args) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1339 { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1340 bool consistent_hashing = FALSE; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1341 unsigned int i; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1342 |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1343 for (i = 0; args[i] != NULL; i++) { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1344 if (strcmp(args[i], DIRECTOR_OPT_CONSISTENT_HASHING) == 0) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1345 consistent_hashing = TRUE; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1346 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1347 if (consistent_hashing != conn->dir->set->director_consistent_hashing) { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1348 i_error("director(%s): director_consistent_hashing settings differ between directors", |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1349 conn->name); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1350 return -1; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1351 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1352 return 1; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1353 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1354 |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1355 static int |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1356 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
|
1357 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
|
1358 { |
19036
f78e38c7cba2
Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents:
19035
diff
changeset
|
1359 unsigned int major_version; |
f78e38c7cba2
Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents:
19035
diff
changeset
|
1360 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1361 /* 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
|
1362 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
|
1363 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
|
1364 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
|
1365 "(%s vs %s)", |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1366 conn->name, args[0], DIRECTOR_VERSION_NAME); |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1367 return -1; |
19036
f78e38c7cba2
Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents:
19035
diff
changeset
|
1368 } else if (str_to_uint(args[1], &major_version) < 0 || |
f78e38c7cba2
Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents:
19035
diff
changeset
|
1369 str_to_uint(args[2], &conn->minor_version) < 0) { |
f78e38c7cba2
Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents:
19035
diff
changeset
|
1370 i_error("director(%s): Invalid protocol version: " |
f78e38c7cba2
Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents:
19035
diff
changeset
|
1371 "%s.%s", conn->name, args[1], args[2]); |
f78e38c7cba2
Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents:
19035
diff
changeset
|
1372 return -1; |
f78e38c7cba2
Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents:
19035
diff
changeset
|
1373 } else if (major_version != DIRECTOR_VERSION_MAJOR) { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1374 i_error("director(%s): Incompatible protocol version: " |
19036
f78e38c7cba2
Removed all invocations of atoi().
Stephan Bosch <stephan@rename-it.nl>
parents:
19035
diff
changeset
|
1375 "%u vs %u", conn->name, major_version, |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1376 DIRECTOR_VERSION_MAJOR); |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1377 return -1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1378 } |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
1379 if (conn->minor_version < DIRECTOR_VERSION_TAGS_V2 && |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
1380 mail_hosts_have_tags(conn->dir->mail_hosts)) { |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
1381 i_error("director(%s): Director version supports incompatible tags", conn->name); |
20295
4f4e9b238ddc
director: Fixed error handling when directors support incompatible tags
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20286
diff
changeset
|
1382 return -1; |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
1383 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1384 conn->version_received = TRUE; |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1385 director_finish_sending_handshake(conn); |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1386 return 1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1387 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1388 if (!conn->version_received) { |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1389 director_cmd_error(conn, "Incompatible protocol"); |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1390 return -1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1391 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1392 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1393 if (strcmp(cmd, "ME") == 0) |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1394 return director_cmd_me(conn, args) ? 1 : -1; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1395 if (!conn->me_received) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1396 director_cmd_error(conn, "Expecting ME command first"); |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1397 return -1; |
11585 | 1398 } |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
1399 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1400 /* incoming connections get a HOST list */ |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1401 if (conn->handshake_sending_hosts) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1402 if (strcmp(cmd, "HOST") == 0) |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1403 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
|
1404 if (strcmp(cmd, "HOST-HAND-END") == 0) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1405 conn->ignore_host_events = FALSE; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1406 conn->handshake_sending_hosts = FALSE; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1407 return 1; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1408 } |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1409 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
|
1410 return -1; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1411 } |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1412 if (strcmp(cmd, "OPTIONS") == 0) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1413 return director_handshake_cmd_options(conn, args); |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1414 if (strcmp(cmd, "HOST-HAND-START") == 0) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1415 if (!conn->in) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1416 director_cmd_error(conn, |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1417 "Host list is only for incoming connections"); |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1418 return -1; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1419 } |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1420 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
|
1421 } |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1422 |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1423 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
|
1424 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
|
1425 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1426 /* both get DONE */ |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1427 if (strcmp(cmd, "DONE") == 0) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1428 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
|
1429 return 0; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1430 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1431 |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1432 static bool |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1433 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
|
1434 struct director_host *host, |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1435 uint32_t seq, unsigned int minor_version, |
19293
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1436 unsigned int timestamp, unsigned int hosts_hash) |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1437 { |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1438 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
|
1439 |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1440 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
|
1441 /* 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
|
1442 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
|
1443 } |
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1444 |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1445 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
|
1446 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
|
1447 /* stale SYNC event */ |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1448 return FALSE; |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1449 } |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1450 /* 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
|
1451 successfully connected to both directions */ |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1452 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
|
1453 |
19293
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1454 if (hosts_hash != 0 && |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1455 hosts_hash != mail_hosts_hash(conn->dir->mail_hosts)) { |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1456 i_error("director(%s): Hosts unexpectedly changed during SYNC reply - resending" |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1457 "(seq=%u, old hosts_hash=%u, new hosts_hash=%u)", |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1458 conn->name, seq, hosts_hash, |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1459 mail_hosts_hash(dir->mail_hosts)); |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1460 (void)director_resend_sync(dir); |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1461 return FALSE; |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1462 } |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1463 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14306
diff
changeset
|
1464 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
|
1465 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
|
1466 /* 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
|
1467 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
|
1468 } 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
|
1469 /* 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
|
1470 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
|
1471 } else { |
19292
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19289
diff
changeset
|
1472 dir_debug("Ring is synced (%s sent seq=%u, hosts_hash=%u)", |
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19289
diff
changeset
|
1473 conn->name, seq, |
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19289
diff
changeset
|
1474 mail_hosts_hash(dir->mail_hosts)); |
22629
0281041d5067
director: Track show long the last ring sync took.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22628
diff
changeset
|
1475 int sync_msecs = |
0281041d5067
director: Track show long the last ring sync took.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22628
diff
changeset
|
1476 timeval_diff_msecs(&ioloop_timeval, &dir->last_sync_start_time); |
0281041d5067
director: Track show long the last ring sync took.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22628
diff
changeset
|
1477 if (sync_msecs >= 0) |
0281041d5067
director: Track show long the last ring sync took.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22628
diff
changeset
|
1478 dir->last_sync_msecs = sync_msecs; |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1479 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
|
1480 } |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1481 } else { |
16790
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1482 if (seq < host->last_sync_seq && |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1483 timestamp < host->last_sync_timestamp + |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1484 DIRECTOR_SYNC_STALE_TIMESTAMP_RESET_SECS) { |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1485 /* stale SYNC event */ |
16787
22a3ef9a006d
director: Fix & improvement to debug logging.
Timo Sirainen <tss@iki.fi>
parents:
16786
diff
changeset
|
1486 dir_debug("Ignore stale SYNC event for %s " |
22a3ef9a006d
director: Fix & improvement to debug logging.
Timo Sirainen <tss@iki.fi>
parents:
16786
diff
changeset
|
1487 "(seq %u < %u, timestamp=%u)", |
22a3ef9a006d
director: Fix & improvement to debug logging.
Timo Sirainen <tss@iki.fi>
parents:
16786
diff
changeset
|
1488 host->name, seq, host->last_sync_seq, |
22a3ef9a006d
director: Fix & improvement to debug logging.
Timo Sirainen <tss@iki.fi>
parents:
16786
diff
changeset
|
1489 timestamp); |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1490 return FALSE; |
16790
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1491 } else if (seq < host->last_sync_seq) { |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1492 i_warning("Last SYNC seq for %s appears to be stale, reseting " |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1493 "(seq=%u, timestamp=%u -> seq=%u, timestamp=%u)", |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1494 host->name, host->last_sync_seq, |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1495 host->last_sync_timestamp, seq, timestamp); |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1496 host->last_sync_seq = seq; |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1497 host->last_sync_timestamp = timestamp; |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1498 host->last_sync_seq_counter = 1; |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1499 } else if (seq > host->last_sync_seq || |
16695
f7a37b169f4a
director: Previous change caused legitimate SYNC resends to be ignored.
Timo Sirainen <tss@iki.fi>
parents:
16678
diff
changeset
|
1500 timestamp > host->last_sync_timestamp) { |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1501 host->last_sync_seq = seq; |
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1502 host->last_sync_timestamp = timestamp; |
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1503 host->last_sync_seq_counter = 1; |
16790
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1504 dir_debug("Update SYNC for %s " |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1505 "(seq=%u, timestamp=%u -> seq=%u, timestamp=%u)", |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1506 host->name, host->last_sync_seq, |
c30453a58b4c
director: Detect lost director restarts and reset last_sync_seq.
Timo Sirainen <tss@iki.fi>
parents:
16789
diff
changeset
|
1507 host->last_sync_timestamp, seq, timestamp); |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1508 } else if (++host->last_sync_seq_counter > |
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1509 DIRECTOR_MAX_SYNC_SEQ_DUPLICATES) { |
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1510 /* we've received this too many times already */ |
16786
17389ac3cb66
director: Added more debug logging.
Timo Sirainen <tss@iki.fi>
parents:
16699
diff
changeset
|
1511 dir_debug("Ignore duplicate #%u SYNC event for %s " |
17389ac3cb66
director: Added more debug logging.
Timo Sirainen <tss@iki.fi>
parents:
16699
diff
changeset
|
1512 "(seq=%u, timestamp %u <= %u)", |
16787
22a3ef9a006d
director: Fix & improvement to debug logging.
Timo Sirainen <tss@iki.fi>
parents:
16786
diff
changeset
|
1513 host->last_sync_seq_counter, host->name, seq, |
16786
17389ac3cb66
director: Added more debug logging.
Timo Sirainen <tss@iki.fi>
parents:
16699
diff
changeset
|
1514 timestamp, host->last_sync_timestamp); |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1515 return FALSE; |
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1516 } |
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1517 |
19293
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1518 if (hosts_hash != 0 && |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1519 hosts_hash != mail_hosts_hash(conn->dir->mail_hosts)) { |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1520 if (host->desynced_hosts_hash != hosts_hash) { |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1521 dir_debug("Ignore director %s stale SYNC request whose hosts don't match us " |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1522 "(seq=%u, remote hosts_hash=%u, my hosts_hash=%u)", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
1523 host->ip_str, seq, hosts_hash, |
19293
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1524 mail_hosts_hash(dir->mail_hosts)); |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1525 host->desynced_hosts_hash = hosts_hash; |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1526 return FALSE; |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1527 } |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1528 /* we'll get here only if we received a SYNC twice |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1529 with the same wrong hosts_hash. FIXME: this gets |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1530 triggered unnecessarily sometimes if hosts are |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1531 changing rapidly. */ |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1532 i_error("director(%s): Director %s SYNC request hosts don't match us - resending hosts " |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1533 "(seq=%u, remote hosts_hash=%u, my hosts_hash=%u)", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
1534 conn->name, host->ip_str, seq, |
19293
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1535 hosts_hash, mail_hosts_hash(dir->mail_hosts)); |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1536 director_resend_hosts(dir); |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1537 return FALSE; |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1538 } |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1539 host->desynced_hosts_hash = 0; |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1540 if (dir->right != NULL) { |
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1541 /* forward it to the connection on right */ |
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1542 director_sync_send(dir, host, seq, minor_version, |
19293
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1543 timestamp, hosts_hash); |
20971
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
1544 } else { |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
1545 dir_debug("director(%s): We have no right connection - " |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
1546 "delay replying to SYNC until finished", conn->name); |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
1547 host->delayed_sync_seq = seq; |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
1548 host->delayed_sync_minor_version = minor_version; |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
1549 host->delayed_sync_timestamp = timestamp; |
3e6f922c2322
director: If SYNCs are received during handshake, send them later.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20846
diff
changeset
|
1550 host->delayed_sync_hosts_hash = hosts_hash; |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1551 } |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1552 } |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1553 return TRUE; |
13940
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1554 } |
9e43af01f147
director: Make sure ring syncing doesn't get lost when directors get disconnected.
Timo Sirainen <tss@iki.fi>
parents:
13921
diff
changeset
|
1555 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1556 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
|
1557 const char *const *args) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1558 { |
11585 | 1559 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
|
1560 struct director_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1561 struct ip_addr ip; |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18858
diff
changeset
|
1562 in_port_t port; |
19289
4e0c9df36a78
director: Small code cleanup - make it easier to add parameters to SYNC
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
1563 unsigned int arg_count, seq, minor_version = 0, timestamp = ioloop_time; |
19293
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1564 unsigned int hosts_hash = 0; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1565 |
19289
4e0c9df36a78
director: Small code cleanup - make it easier to add parameters to SYNC
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
1566 arg_count = str_array_length(args); |
4e0c9df36a78
director: Small code cleanup - make it easier to add parameters to SYNC
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
1567 if (arg_count < 3 || |
12208
a224997afefd
director: Properly detect invalid command parameters in director<->director connections.
Timo Sirainen <tss@iki.fi>
parents:
12065
diff
changeset
|
1568 !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
|
1569 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
|
1570 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
|
1571 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1572 } |
19289
4e0c9df36a78
director: Small code cleanup - make it easier to add parameters to SYNC
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
1573 if (arg_count >= 4 && str_to_uint(args[3], &minor_version) < 0) { |
4e0c9df36a78
director: Small code cleanup - make it easier to add parameters to SYNC
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
1574 director_cmd_error(conn, "Invalid parameters"); |
4e0c9df36a78
director: Small code cleanup - make it easier to add parameters to SYNC
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
1575 return FALSE; |
4e0c9df36a78
director: Small code cleanup - make it easier to add parameters to SYNC
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
1576 } |
4e0c9df36a78
director: Small code cleanup - make it easier to add parameters to SYNC
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
1577 if (arg_count >= 5 && str_to_uint(args[4], ×tamp) < 0) { |
4e0c9df36a78
director: Small code cleanup - make it easier to add parameters to SYNC
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
1578 director_cmd_error(conn, "Invalid parameters"); |
4e0c9df36a78
director: Small code cleanup - make it easier to add parameters to SYNC
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
1579 return FALSE; |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1580 } |
19293
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1581 if (arg_count >= 6 && str_to_uint(args[5], &hosts_hash) < 0) { |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1582 director_cmd_error(conn, "Invalid parameters"); |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1583 return FALSE; |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1584 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1585 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1586 /* 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
|
1587 removed and we can ignore this sync. */ |
11585 | 1588 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
|
1589 if (host != NULL) { |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1590 if (!director_connection_sync_host(conn, host, seq, |
19293
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1591 minor_version, timestamp, |
8f225e43e6e3
director: Detect if directors' hosts have become desynced by sending hosts_hash in SYNC parameter.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
1592 hosts_hash)) |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1593 return TRUE; |
14306
334424e7465e
director: Keep track of the highest supported protocol version in the ring.
Timo Sirainen <tss@iki.fi>
parents:
14303
diff
changeset
|
1594 } |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1595 |
19954
82ffadc8c4d7
director: Don't re-send SYNC unnecessarily often.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19953
diff
changeset
|
1596 /* If directors got disconnected while we were waiting a SYNC reply, |
82ffadc8c4d7
director: Don't re-send SYNC unnecessarily often.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19953
diff
changeset
|
1597 it might have gotten lost. If we've received a DIRECTOR update since |
82ffadc8c4d7
director: Don't re-send SYNC unnecessarily often.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19953
diff
changeset
|
1598 the last time we sent a SYNC, retry sending it here to make sure |
82ffadc8c4d7
director: Don't re-send SYNC unnecessarily often.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19953
diff
changeset
|
1599 it doesn't get stuck. We don't want to do this too eagerly because |
82ffadc8c4d7
director: Don't re-send SYNC unnecessarily often.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19953
diff
changeset
|
1600 it may trigger desynced_hosts_hash != hosts_hash mismatch, which |
82ffadc8c4d7
director: Don't re-send SYNC unnecessarily often.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19953
diff
changeset
|
1601 causes unnecessary error logging and hosts-resending. */ |
16622
a6736e42301e
director: Avoid infinite SYNC loops if the originating director goes away for a long time.
Timo Sirainen <tss@iki.fi>
parents:
16621
diff
changeset
|
1602 if ((host == NULL || !host->self) && |
19954
82ffadc8c4d7
director: Don't re-send SYNC unnecessarily often.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19953
diff
changeset
|
1603 dir->last_sync_sent_ring_change_counter != dir->ring_change_counter && |
16678 | 1604 (time_t)dir->self_host->last_sync_timestamp != ioloop_time) |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
1605 (void)director_resend_sync(dir); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1606 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1607 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1608 |
22567
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1609 static void director_disconnect_timeout(struct director_connection *conn) |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1610 { |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1611 director_connection_deinit(&conn, "CONNECT requested"); |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1612 } |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1613 |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1614 static void |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1615 director_reconnect_after_wrong_connect_timeout(struct director_connection *conn) |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1616 { |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1617 struct director *dir = conn->dir; |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1618 |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1619 director_connection_deinit(&conn, "Wrong CONNECT requested"); |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1620 if (dir->right == NULL) |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1621 director_connect(dir, "Reconnecting after wrong CONNECT request"); |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1622 } |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1623 |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1624 static void |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1625 director_reconnect_after_wrong_connect(struct director_connection *conn) |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1626 { |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1627 if (conn->to_disconnect != NULL) |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1628 return; |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1629 conn->to_disconnect = |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1630 timeout_add_short(DIRECTOR_RECONNECT_AFTER_WRONG_CONNECT_MSECS, |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1631 director_reconnect_after_wrong_connect_timeout, conn); |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1632 } |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1633 |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1634 static bool director_cmd_connect(struct director_connection *conn, |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1635 const char *const *args) |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1636 { |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1637 struct director *dir = conn->dir; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1638 struct director_host *host; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1639 struct ip_addr ip; |
19035
aabfe48db1cf
Changed type of internet port values to in_port_t everywhere.
Stephan Bosch <stephan@rename-it.nl>
parents:
18858
diff
changeset
|
1640 in_port_t port; |
22564
17b1e65e6d70
director: Log info line for every incoming/outgoing connection
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22562
diff
changeset
|
1641 const char *right_state; |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1642 |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1643 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
|
1644 !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
|
1645 director_cmd_error(conn, "Invalid parameters"); |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1646 return FALSE; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1647 } |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1648 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1649 host = director_host_get(conn->dir, &ip, port); |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1650 |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1651 /* remote suggests us to connect elsewhere */ |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1652 if (dir->right != NULL && |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1653 director_host_cmp_to_self(host, dir->right->host, |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1654 dir->self_host) <= 0) { |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1655 /* the old connection is the correct one */ |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
1656 dir_debug("Ignoring CONNECT request to %s (current right is %s)", |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
1657 host->name, dir->right->name); |
22567
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1658 director_reconnect_after_wrong_connect(conn); |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1659 return TRUE; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1660 } |
22568
c50f46578b86
director: Ignore CONNECT requests to hosts that have been removed already
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22567
diff
changeset
|
1661 if (host->removed) { |
c50f46578b86
director: Ignore CONNECT requests to hosts that have been removed already
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22567
diff
changeset
|
1662 dir_debug("Ignoring CONNECT request to %s (director is removed)", |
c50f46578b86
director: Ignore CONNECT requests to hosts that have been removed already
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22567
diff
changeset
|
1663 host->name); |
c50f46578b86
director: Ignore CONNECT requests to hosts that have been removed already
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22567
diff
changeset
|
1664 director_reconnect_after_wrong_connect(conn); |
c50f46578b86
director: Ignore CONNECT requests to hosts that have been removed already
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22567
diff
changeset
|
1665 return TRUE; |
c50f46578b86
director: Ignore CONNECT requests to hosts that have been removed already
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22567
diff
changeset
|
1666 } |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1667 |
19973
0b5aeb95924a
director: Avoid a potential assert-crash after removing a director from ring.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19954
diff
changeset
|
1668 /* reset failure timestamp so we'll actually try to connect there. */ |
0b5aeb95924a
director: Avoid a potential assert-crash after removing a director from ring.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19954
diff
changeset
|
1669 host->last_network_failure = 0; |
0b5aeb95924a
director: Avoid a potential assert-crash after removing a director from ring.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19954
diff
changeset
|
1670 /* reset removed-flag, so we don't crash */ |
0b5aeb95924a
director: Avoid a potential assert-crash after removing a director from ring.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19954
diff
changeset
|
1671 host->removed = FALSE; |
0b5aeb95924a
director: Avoid a potential assert-crash after removing a director from ring.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19954
diff
changeset
|
1672 |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
1673 if (dir->right == NULL) { |
22564
17b1e65e6d70
director: Log info line for every incoming/outgoing connection
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22562
diff
changeset
|
1674 right_state = "initializing right"; |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
1675 } else { |
22564
17b1e65e6d70
director: Log info line for every incoming/outgoing connection
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22562
diff
changeset
|
1676 right_state = t_strdup_printf("replacing current right %s", |
17b1e65e6d70
director: Log info line for every incoming/outgoing connection
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22562
diff
changeset
|
1677 dir->right->name); |
22567
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1678 /* disconnect from right side immediately - it's not accepting |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1679 any further commands from us. */ |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1680 if (conn->dir->right != conn) |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1681 director_connection_deinit(&conn->dir->right, "CONNECT requested"); |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1682 else if (conn->to_disconnect == NULL) { |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1683 conn->to_disconnect = |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1684 timeout_add_short(0, director_disconnect_timeout, conn); |
c27c8ce1d534
director: After CONNECT was received, make sure we disconnect
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22565
diff
changeset
|
1685 } |
11579
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1686 } |
61708c33154d
director: Debug message improvements.
Timo Sirainen <tss@iki.fi>
parents:
11572
diff
changeset
|
1687 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1688 /* connect here */ |
22564
17b1e65e6d70
director: Log info line for every incoming/outgoing connection
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22562
diff
changeset
|
1689 (void)director_connect_host(dir, host, t_strdup_printf( |
17b1e65e6d70
director: Log info line for every incoming/outgoing connection
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22562
diff
changeset
|
1690 "Received CONNECT request from %s - %s", |
17b1e65e6d70
director: Log info line for every incoming/outgoing connection
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22562
diff
changeset
|
1691 conn->name, right_state)); |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1692 return TRUE; |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1693 } |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1694 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1695 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
|
1696 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1697 struct director_connection *const *connp, *conn; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1698 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1699 array_foreach(&dir->connections, connp) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1700 conn = *connp; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1701 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1702 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
|
1703 conn->to_disconnect == NULL && |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1704 director_host_cmp_to_self(dir->left->host, conn->host, |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1705 dir->self_host) < 0) |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1706 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
|
1707 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1708 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1709 |
11586
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1710 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
|
1711 { |
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1712 if (!conn->ping_waiting) |
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1713 return TRUE; |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1714 conn->ping_waiting = FALSE; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1715 timeout_remove(&conn->to_pong); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1716 |
22628
8623737c0129
director: Track connections' last ping time
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22627
diff
changeset
|
1717 int ping_msecs = timeval_diff_msecs(&ioloop_timeval, &conn->ping_sent_time); |
8623737c0129
director: Track connections' last ping time
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22627
diff
changeset
|
1718 if (ping_msecs >= 0) |
8623737c0129
director: Track connections' last ping time
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22627
diff
changeset
|
1719 conn->last_ping_msecs = ping_msecs; |
8623737c0129
director: Track connections' last ping time
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22627
diff
changeset
|
1720 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1721 if (conn->verifying_left) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1722 conn->verifying_left = FALSE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1723 if (conn == conn->dir->left) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1724 /* 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
|
1725 incoming connections to connect to it instead. */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1726 director_disconnect_wrong_lefts(conn->dir); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1727 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1728 } |
11586
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1729 |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
1730 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
|
1731 return TRUE; |
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1732 } |
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
1733 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1734 static bool |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1735 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
|
1736 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
|
1737 { |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1738 int ret; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1739 |
11327
9d886ae434c3
director: If connecting to director fails, try connecting to next one.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
1740 if (!conn->handshake_received) { |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1741 ret = director_connection_handle_handshake(conn, cmd, args); |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1742 if (ret > 0) |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1743 return TRUE; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1744 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
|
1745 /* 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
|
1746 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
|
1747 return FALSE; |
9d886ae434c3
director: If connecting to director fails, try connecting to next one.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
1748 } |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
1749 /* 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
|
1750 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1751 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1752 if (strcmp(cmd, "PING") == 0) { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1753 director_connection_send(conn, "PONG\n"); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1754 return TRUE; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1755 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1756 if (strcmp(cmd, "PONG") == 0) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
1757 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
|
1758 if (strcmp(cmd, "USER") == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1759 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
|
1760 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
|
1761 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
|
1762 if (strcmp(cmd, "HOST") == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1763 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
|
1764 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
|
1765 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
|
1766 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
|
1767 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
|
1768 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
|
1769 return director_cmd_user_move(conn, args); |
17418
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1770 if (strcmp(cmd, "USER-KICK") == 0) |
64808a9703db
doveadm director kick command added.
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
1771 return director_cmd_user_kick(conn, args); |
20846
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1772 if (strcmp(cmd, "USER-KICK-ALT") == 0) |
9d70a6f86e24
doveadm director kick: Added -f <passdb field> parameter.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20575
diff
changeset
|
1773 return director_cmd_user_kick_alt(conn, args); |
17419
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1774 if (strcmp(cmd, "USER-KICK-HASH") == 0) |
8aa0cd95d6a8
director: If we detect that a user is being proxied to multiple backends, disconnect wrong connections.
Timo Sirainen <tss@iki.fi>
parents:
17418
diff
changeset
|
1775 return director_cmd_user_kick_hash(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
|
1776 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
|
1777 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
|
1778 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
|
1779 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
|
1780 if (strcmp(cmd, "DIRECTOR") == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1781 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
|
1782 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
|
1783 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
|
1784 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
|
1785 return director_connection_sync(conn, args); |
11571
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1786 if (strcmp(cmd, "CONNECT") == 0) |
75d5e31ea8cc
director: Handle CONNECT commands (properly).
Timo Sirainen <tss@iki.fi>
parents:
11569
diff
changeset
|
1787 return director_cmd_connect(conn, args); |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1788 if (strcmp(cmd, "QUIT") == 0) { |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1789 i_warning("Director %s disconnected us with reason: %s", |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1790 conn->name, t_strarray_join(args, " ")); |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1791 return FALSE; |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1792 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1793 |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1794 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
|
1795 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1796 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1797 |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1798 static bool |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1799 director_connection_handle_line(struct director_connection *conn, |
22640
cf23a90cd2ca
director: Use t_strsplit_tabescaped_inplace() for director connection input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22629
diff
changeset
|
1800 char *line) |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1801 { |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1802 const char *cmd, *const *args; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1803 bool ret; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1804 |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
1805 dir_debug("input: %s: %s", conn->name, line); |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
1806 |
22640
cf23a90cd2ca
director: Use t_strsplit_tabescaped_inplace() for director connection input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22629
diff
changeset
|
1807 args = t_strsplit_tabescaped_inplace(line); |
cf23a90cd2ca
director: Use t_strsplit_tabescaped_inplace() for director connection input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22629
diff
changeset
|
1808 cmd = args[0]; |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1809 if (cmd == NULL) { |
14479
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
1810 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
|
1811 return FALSE; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1812 } |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1813 |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1814 conn->cur_cmd = cmd; |
22640
cf23a90cd2ca
director: Use t_strsplit_tabescaped_inplace() for director connection input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22629
diff
changeset
|
1815 conn->cur_args = args; |
cf23a90cd2ca
director: Use t_strsplit_tabescaped_inplace() for director connection input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22629
diff
changeset
|
1816 ret = director_connection_handle_cmd(conn, cmd, args+1); |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1817 conn->cur_cmd = NULL; |
22640
cf23a90cd2ca
director: Use t_strsplit_tabescaped_inplace() for director connection input
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22629
diff
changeset
|
1818 conn->cur_args = NULL; |
14407
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1819 return ret; |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1820 } |
d6cd93e32b37
director: Improved error logging for handling invalid commands/parameters.
Timo Sirainen <tss@iki.fi>
parents:
14406
diff
changeset
|
1821 |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1822 static void |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
1823 director_connection_log_disconnect(struct director_connection *conn, int err, |
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
1824 const char *errstr) |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1825 { |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1826 string_t *str = t_str_new(128); |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1827 |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1828 i_assert(conn->connected); |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1829 |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1830 if (conn->connect_request_to != NULL) { |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1831 i_warning("Director %s tried to connect to us, " |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1832 "should use %s instead", |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1833 conn->name, conn->connect_request_to->name); |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1834 return; |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1835 } |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1836 |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1837 str_printfa(str, "Director %s disconnected: ", conn->name); |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1838 str_append(str, "Connection closed"); |
16618
0ad8da149774
director: Log director disconnection errno correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
1839 if (err != 0 && err != EPIPE) { |
0ad8da149774
director: Log director disconnection errno correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
1840 errno = err; |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
1841 if (errstr[0] == '\0') |
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
1842 str_printfa(str, ": %m"); |
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
1843 else |
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
1844 str_printfa(str, ": %s", errstr); |
16618
0ad8da149774
director: Log director disconnection errno correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
1845 } |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1846 |
22255
a841e797bac2
director: Fix whitespace position in some log messages
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22254
diff
changeset
|
1847 str_append(str, " ("); |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
1848 director_connection_append_stats(conn, str); |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1849 |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1850 if (!conn->me_received) |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1851 str_append(str, ", handshake ME not received"); |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1852 else if (!conn->handshake_received) |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1853 str_append(str, ", handshake DONE not received"); |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
1854 str_append_c(str, ')'); |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1855 i_error("%s", str_c(str)); |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1856 } |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1857 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1858 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
|
1859 { |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1860 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
|
1861 char *line; |
18664
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18663
diff
changeset
|
1862 uoff_t prev_offset; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1863 bool ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1864 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1865 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
|
1866 case 0: |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1867 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1868 case -1: |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1869 /* disconnected */ |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
1870 director_connection_log_disconnect(conn, conn->input->stream_errno, |
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
1871 i_stream_get_error(conn->input)); |
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
1872 director_connection_disconnected(&conn, i_stream_get_error(conn->input)); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1873 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1874 case -2: |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1875 /* buffer full */ |
14479
293ada796ae6
director: Fixed protocol error detection/handling.
Timo Sirainen <tss@iki.fi>
parents:
14478
diff
changeset
|
1876 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
|
1877 MAX_INBUF_SIZE); |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1878 director_connection_reconnect(&conn, "Too long input line"); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1879 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1880 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1881 |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1882 if (conn->to_disconnect != NULL) { |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1883 /* 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
|
1884 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
|
1885 CONNECT we sent it. */ |
14683
9646f80ac3e9
Added i_stream_get_data_size(). Used it where possible.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
1886 i_stream_skip(conn->input, i_stream_get_data_size(conn->input)); |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1887 return; |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1888 } |
20575
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
1889 conn->last_input = ioloop_timeval; |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
1890 conn->refcount++; |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
1891 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1892 director_sync_freeze(dir); |
18664
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18663
diff
changeset
|
1893 prev_offset = conn->input->v_offset; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1894 while ((line = i_stream_next_line(conn->input)) != NULL) { |
18664
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18663
diff
changeset
|
1895 dir->ring_traffic_input += conn->input->v_offset - prev_offset; |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18663
diff
changeset
|
1896 prev_offset = conn->input->v_offset; |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18663
diff
changeset
|
1897 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1898 T_BEGIN { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1899 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
|
1900 } T_END; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1901 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1902 if (!ret) { |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
1903 if (!director_connection_unref(conn)) |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
1904 break; |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1905 director_connection_reconnect(&conn, t_strdup_printf( |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
1906 "Invalid input: %s", line)); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1907 break; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1908 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1909 } |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
1910 director_sync_thaw(dir); |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
1911 if (conn != NULL) { |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
1912 if (director_connection_unref(conn)) |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
1913 timeout_reset(conn->to_ping); |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
1914 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1915 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1916 |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1917 static void director_connection_send_directors(struct director_connection *conn) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1918 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1919 struct director_host *const *hostp; |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1920 string_t *str = t_str_new(64); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1921 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1922 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
|
1923 if ((*hostp)->removed) |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
1924 continue; |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1925 |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1926 str_truncate(str, 0); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1927 str_printfa(str, "DIRECTOR\t%s\t%u\n", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
1928 (*hostp)->ip_str, (*hostp)->port); |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1929 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
|
1930 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1931 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1932 |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
1933 static void |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1934 director_connection_send_hosts(struct director_connection *conn) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1935 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1936 struct mail_host *const *hostp; |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
1937 bool send_updowns; |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1938 string_t *str = t_str_new(128); |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1939 |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1940 i_assert(conn->version_received); |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
1941 |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
1942 send_updowns = conn->minor_version >= DIRECTOR_VERSION_UPDOWN; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1943 |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
1944 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
|
1945 array_foreach(mail_hosts_get(conn->dir->mail_hosts), hostp) { |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
1946 struct mail_host *host = *hostp; |
19408
7e47f561ad49
director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents:
19407
diff
changeset
|
1947 const char *host_tag = mail_host_get_tag(host); |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
1948 |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
1949 str_printfa(str, "HOST\t%s\t%u", |
22643
6e235143e177
director: Use *_host.ip_str to avoid net_ip2addr() calls
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22640
diff
changeset
|
1950 host->ip_str, host->vhost_count); |
19408
7e47f561ad49
director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents:
19407
diff
changeset
|
1951 if (host_tag[0] != '\0' || send_updowns) { |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
1952 str_append_c(str, '\t'); |
19408
7e47f561ad49
director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents:
19407
diff
changeset
|
1953 str_append_tabescaped(str, host_tag); |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
1954 } |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
1955 if (send_updowns) { |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19309
diff
changeset
|
1956 str_printfa(str, "\t%c%ld\t", host->down ? 'D' : 'U', |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18708
diff
changeset
|
1957 (long)host->last_updown_change); |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19309
diff
changeset
|
1958 if (host->hostname != NULL) |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19309
diff
changeset
|
1959 str_append_tabescaped(str, host->hostname); |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
1960 } |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
1961 str_append_c(str, '\n'); |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1962 director_connection_send(conn, str_c(str)); |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1963 str_truncate(str, 0); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1964 } |
11350
5f77c91f3df0
director: Preserve old mail server state when a new director connects to ring.
Timo Sirainen <tss@iki.fi>
parents:
11349
diff
changeset
|
1965 str_printfa(str, "HOST-HAND-END\t%u\n", conn->dir->ring_handshaked); |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1966 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
|
1967 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1968 |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1969 static int director_connection_send_done(struct director_connection *conn) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1970 { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1971 i_assert(conn->version_received); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1972 |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1973 if (!conn->dir->set->director_consistent_hashing) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1974 ; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1975 else if (conn->minor_version >= DIRECTOR_VERSION_OPTIONS) { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1976 director_connection_send(conn, |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1977 "OPTIONS\t"DIRECTOR_OPT_CONSISTENT_HASHING"\n"); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1978 } else { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1979 i_error("director(%s): Director version is too old for supporting director_consistent_hashing=yes", |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1980 conn->name); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1981 return -1; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1982 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1983 director_connection_send(conn, "DONE\n"); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1984 return 0; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1985 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
18063
diff
changeset
|
1986 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1987 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
|
1988 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1989 struct user *user; |
22646
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
1990 string_t *str = t_str_new(128); |
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
1991 char dec_buf[MAX_INT_STRLEN]; |
22648
6bd018a94a57
director: Don't block too long when sending users during director handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22646
diff
changeset
|
1992 unsigned int sent_count = 0; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1993 int ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1994 |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1995 i_assert(conn->version_received); |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
1996 |
21075
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
1997 while ((user = director_iterate_users_next(conn->user_iter)) != NULL) { |
22646
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
1998 str_truncate(str, 0); |
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
1999 str_append(str, "USER\t"); |
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
2000 str_append(str, dec2str_buf(dec_buf, user->username_hash)); |
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
2001 str_append_c(str, '\t'); |
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
2002 str_append(str, user->host->ip_str); |
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
2003 str_append_c(str, '\t'); |
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
2004 str_append(str, dec2str_buf(dec_buf, user->timestamp)); |
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
2005 if (user->weak) |
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
2006 str_append(str, "\tw"); |
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
2007 str_append_c(str, '\n'); |
340fd327a965
director: Avoid str_printfa() in director_connection_send_users()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22643
diff
changeset
|
2008 director_connection_send(conn, str_c(str)); |
22648
6bd018a94a57
director: Don't block too long when sending users during director handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22646
diff
changeset
|
2009 if (++sent_count >= DIRECTOR_HANDSHAKE_MAX_USERS_SENT_PER_FLUSH) { |
6bd018a94a57
director: Don't block too long when sending users during director handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22646
diff
changeset
|
2010 /* Don't send too much at once to avoid hangs */ |
6bd018a94a57
director: Don't block too long when sending users during director handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22646
diff
changeset
|
2011 timeout_reset(conn->to_ping); |
6bd018a94a57
director: Don't block too long when sending users during director handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22646
diff
changeset
|
2012 return 0; |
6bd018a94a57
director: Don't block too long when sending users during director handshake
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22646
diff
changeset
|
2013 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2014 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2015 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
|
2016 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
|
2017 /* continue later */ |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2018 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
|
2019 return ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2020 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2021 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2022 } |
21075
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
2023 director_iterate_users_deinit(&conn->user_iter); |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2024 if (director_connection_send_done(conn) < 0) |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2025 return -1; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2026 |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
2027 if (conn->users_unsorted && conn->handshake_received) { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
2028 /* we received remote's list of users before sending ours */ |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
2029 conn->users_unsorted = FALSE; |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
2030 mail_hosts_sort_users(conn->dir->mail_hosts); |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
2031 } |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16619
diff
changeset
|
2032 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2033 ret = o_stream_flush(conn->output); |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2034 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
|
2035 return ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2036 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2037 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2038 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
|
2039 { |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2040 int ret; |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2041 |
20575
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
2042 conn->last_output = ioloop_timeval; |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
2043 if (conn->user_iter != NULL) { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
2044 /* still handshaking USER list */ |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2045 o_stream_cork(conn->output); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2046 ret = director_connection_send_users(conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2047 o_stream_uncork(conn->output); |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
2048 if (ret < 0) { |
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
2049 director_connection_disconnected(&conn, |
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
2050 o_stream_get_error(conn->output)); |
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
2051 } else { |
14480
d9f33d78fa3d
director: Make sure handshaking doesn't get stuck sending USERs.
Timo Sirainen <tss@iki.fi>
parents:
14479
diff
changeset
|
2052 o_stream_set_flush_pending(conn->output, TRUE); |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
2053 } |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2054 return ret; |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
2055 } |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
2056 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
|
2057 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2058 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2059 static struct director_connection * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2060 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
|
2061 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2062 struct director_connection *conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2063 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2064 conn = i_new(struct director_connection, 1); |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2065 conn->refcount = 1; |
22252
8882a5cbe76d
director: Use more accurate timestamps for handshake timeout logging
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22251
diff
changeset
|
2066 conn->created = ioloop_timeval; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2067 conn->fd = fd; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2068 conn->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2069 conn->input = i_stream_create_fd(conn->fd, MAX_INBUF_SIZE, FALSE); |
22623
f733d647ff82
director: Add director_output_buffer_size setting
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22570
diff
changeset
|
2070 conn->output = o_stream_create_fd(conn->fd, dir->set->director_output_buffer_size, FALSE); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14674
diff
changeset
|
2071 o_stream_set_no_error_handling(conn->output, TRUE); |
14406
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
2072 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
|
2073 return conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2074 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2075 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2076 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
|
2077 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2078 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
|
2079 "VERSION\t"DIRECTOR_VERSION_NAME"\t%u\t%u\n" |
19294
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
2080 "ME\t%s\t%u\t%lld\n", |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2081 DIRECTOR_VERSION_MAJOR, DIRECTOR_VERSION_MINOR, |
19294
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
2082 net_ip2addr(&conn->dir->self_ip), conn->dir->self_port, |
d96595e2363b
director: Log a warning if directors' clocks are too much out of sync.
Timo Sirainen <tss@iki.fi>
parents:
19293
diff
changeset
|
2083 (long long)time(NULL))); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2084 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2085 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2086 struct director_connection * |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2087 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
|
2088 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
|
2089 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2090 struct director_connection *conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2091 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2092 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
|
2093 conn->in = TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2094 conn->connected = TRUE; |
22252
8882a5cbe76d
director: Use more accurate timestamps for handshake timeout logging
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22251
diff
changeset
|
2095 conn->connected_time = ioloop_timeval; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2096 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
|
2097 conn->io = io_add(conn->fd, IO_READ, director_connection_input, conn); |
22250
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
2098 conn->to_ping = timeout_add(DIRECTOR_CONNECTION_ME_TIMEOUT_MSECS, |
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
2099 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
|
2100 |
22564
17b1e65e6d70
director: Log info line for every incoming/outgoing connection
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22562
diff
changeset
|
2101 i_info("Incoming connection from director %s", conn->name); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2102 director_connection_send_handshake(conn); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2103 return conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2104 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2105 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2106 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
|
2107 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2108 int err; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2109 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2110 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
|
2111 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
|
2112 strerror(err)); |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
2113 director_connection_disconnected(&conn, strerror(err)); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2114 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2115 } |
22252
8882a5cbe76d
director: Use more accurate timestamps for handshake timeout logging
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22251
diff
changeset
|
2116 conn->connected_time = ioloop_timeval; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2117 conn->connected = TRUE; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2118 o_stream_set_flush_callback(conn->output, |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2119 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
|
2120 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2121 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
|
2122 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
|
2123 |
14477
ea5b949a623b
director: Increased timeout for sending USER data in handshake.
Timo Sirainen <tss@iki.fi>
parents:
14476
diff
changeset
|
2124 timeout_remove(&conn->to_ping); |
22250
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
2125 conn->to_ping = timeout_add(DIRECTOR_CONNECTION_ME_TIMEOUT_MSECS, |
14477
ea5b949a623b
director: Increased timeout for sending USER data in handshake.
Timo Sirainen <tss@iki.fi>
parents:
14476
diff
changeset
|
2126 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
|
2127 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2128 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
|
2129 director_connection_send_handshake(conn); |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2130 director_connection_send_directors(conn); |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2131 o_stream_uncork(conn->output); |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2132 /* send the rest of the handshake after we've received the remote's |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2133 version number */ |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2134 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2135 |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2136 static void director_finish_sending_handshake(struct director_connection *conn) |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2137 { |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2138 if ( |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2139 conn->in) { |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2140 /* only outgoing connections send hosts & users */ |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2141 return; |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2142 } |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2143 o_stream_cork(conn->output); |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2144 director_connection_send_hosts(conn); |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2145 |
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2146 i_assert(conn->user_iter == NULL); |
21075
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
2147 conn->user_iter = director_iterate_users_init(conn->dir); |
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
2148 |
14481
ce4e1bf7262d
director: Another fix for stuck handshake.
Timo Sirainen <tss@iki.fi>
parents:
14480
diff
changeset
|
2149 if (director_connection_send_users(conn) == 0) |
ce4e1bf7262d
director: Another fix for stuck handshake.
Timo Sirainen <tss@iki.fi>
parents:
14480
diff
changeset
|
2150 o_stream_set_flush_pending(conn->output, TRUE); |
20972
14f621e65819
director: Fix sending up/down state in handshakes.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20971
diff
changeset
|
2151 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2152 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
|
2153 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2154 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2155 struct director_connection * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2156 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
|
2157 struct director_host *host) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2158 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2159 struct director_connection *conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2160 |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
2161 i_assert(!host->removed); |
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
2162 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2163 /* make sure we don't keep old sequence values across restarts */ |
16699
9531ec8afe8b
director: Reset last-seen-sync-sequence after remote director restarts.
Timo Sirainen <tss@iki.fi>
parents:
16695
diff
changeset
|
2164 director_host_restarted(host); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2165 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2166 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
|
2167 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
|
2168 conn->host = host; |
14571
42cca8a1d179
director: Implemented ability to remove directors from a running ring.
Timo Sirainen <tss@iki.fi>
parents:
14570
diff
changeset
|
2169 director_host_ref(host); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2170 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
|
2171 director_connection_connected, conn); |
22250
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
2172 conn->to_ping = timeout_add(DIRECTOR_CONNECTION_CONNECT_TIMEOUT_MSECS, |
81a74bce2b07
director: Fix handshake timeout lengths
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
2173 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
|
2174 return conn; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2175 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2176 |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2177 void director_connection_deinit(struct director_connection **_conn, |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2178 const char *remote_reason) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2179 { |
14406
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
2180 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
|
2181 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
|
2182 unsigned int i, count; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2183 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2184 *_conn = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2185 |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2186 i_assert(conn->fd != -1); |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2187 |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
2188 if (conn->host != NULL) { |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
2189 dir_debug("Disconnecting from %s: %s", |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
2190 conn->host->name, remote_reason); |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2191 } |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2192 if (*remote_reason != '\0' && |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2193 conn->minor_version >= DIRECTOR_VERSION_QUIT) { |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2194 o_stream_send_str(conn->output, t_strdup_printf( |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2195 "QUIT\t%s\n", remote_reason)); |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2196 } |
12935
e9139f74c451
director: Improved debug/error logging.
Timo Sirainen <tss@iki.fi>
parents:
12934
diff
changeset
|
2197 |
14406
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
2198 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
|
2199 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
|
2200 if (conns[i] == conn) { |
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
2201 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
|
2202 break; |
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
2203 } |
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
2204 } |
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
2205 i_assert(i < count); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2206 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
|
2207 dir->left = NULL; |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2208 /* 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
|
2209 use it as the new "left" */ |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2210 director_assign_left(dir); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2211 } |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2212 if (dir->right == conn) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2213 dir->right = NULL; |
11572
659bb1a26da4
director: Added initial testing framework and some debugging output.
Timo Sirainen <tss@iki.fi>
parents:
11571
diff
changeset
|
2214 |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2215 if (conn->connect_request_to != NULL) { |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2216 director_host_unref(conn->connect_request_to); |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2217 conn->connect_request_to = NULL; |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2218 } |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2219 if (conn->user_iter != NULL) |
21075
6a363cb51d7f
director: Code cleanup - added user director_iterate_users_*() wrappers.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
2220 director_iterate_users_deinit(&conn->user_iter); |
14494
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
2221 if (conn->to_disconnect != NULL) |
d27b743c9921
director: Delay disconnecting director after sending CONNECT command.
Timo Sirainen <tss@iki.fi>
parents:
14493
diff
changeset
|
2222 timeout_remove(&conn->to_disconnect); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2223 if (conn->to_pong != NULL) |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2224 timeout_remove(&conn->to_pong); |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2225 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
|
2226 if (conn->io != NULL) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2227 io_remove(&conn->io); |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2228 i_stream_close(conn->input); |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2229 o_stream_close(conn->output); |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2230 i_close_fd(&conn->fd); |
11569
467ca06a7dbe
director: Outgoing director connections shouldn't be counted as master clients.
Timo Sirainen <tss@iki.fi>
parents:
11373
diff
changeset
|
2231 |
467ca06a7dbe
director: Outgoing director connections shouldn't be counted as master clients.
Timo Sirainen <tss@iki.fi>
parents:
11373
diff
changeset
|
2232 if (conn->in) |
467ca06a7dbe
director: Outgoing director connections shouldn't be counted as master clients.
Timo Sirainen <tss@iki.fi>
parents:
11373
diff
changeset
|
2233 master_service_client_connection_destroyed(master_service); |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2234 director_connection_unref(conn); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2235 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2236 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
|
2237 /* 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
|
2238 dir->sync_seq++; |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13053
diff
changeset
|
2239 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
|
2240 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2241 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2242 |
22570
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2243 static bool director_connection_unref(struct director_connection *conn) |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2244 { |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2245 i_assert(conn->refcount > 0); |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2246 if (--conn->refcount > 0) |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2247 return TRUE; |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2248 |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2249 if (conn->host != NULL) |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2250 director_host_unref(conn->host); |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2251 i_stream_unref(&conn->input); |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2252 o_stream_unref(&conn->output); |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2253 i_free(conn->name); |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2254 i_free(conn); |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2255 return FALSE; |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2256 } |
39b2dd549e8a
director: Don't crash if DIRECTOR-REMOVE is received for itself
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22568
diff
changeset
|
2257 |
18858
8bde19f080ad
director: explicitly mark _disconnect() helper static to match proto
Phil Carmody <phil@dovecot.fi>
parents:
18729
diff
changeset
|
2258 static void director_connection_disconnected(struct director_connection **_conn, |
8bde19f080ad
director: explicitly mark _disconnect() helper static to match proto
Phil Carmody <phil@dovecot.fi>
parents:
18729
diff
changeset
|
2259 const char *reason) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2260 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2261 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
|
2262 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
|
2263 |
22446
8bfe8a2fed69
director: Fix rapid reconnection on failed outgoing connections
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22311
diff
changeset
|
2264 if ((conn->connected_time.tv_sec == 0 || |
8bfe8a2fed69
director: Fix rapid reconnection on failed outgoing connections
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22311
diff
changeset
|
2265 conn->connected_time.tv_sec + DIRECTOR_SUCCESS_MIN_CONNECT_SECS > ioloop_time) && |
14570
40f958c7643b
director: Don't crash with quickly disconnecting incoming director connections.
Timo Sirainen <tss@iki.fi>
parents:
14494
diff
changeset
|
2266 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
|
2267 /* 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
|
2268 network problem */ |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
2269 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
|
2270 } |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
2271 |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
2272 director_connection_deinit(_conn, reason); |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
2273 if (dir->right == NULL) |
22564
17b1e65e6d70
director: Log info line for every incoming/outgoing connection
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22562
diff
changeset
|
2274 director_connect(dir, "Reconnecting after disconnection"); |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
2275 } |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
2276 |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2277 static void director_connection_reconnect(struct director_connection **_conn, |
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2278 const char *reason) |
14432
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
2279 { |
366b9e5fc85c
director: Don't communicate with directors that recently sent invalid input.
Timo Sirainen <tss@iki.fi>
parents:
14431
diff
changeset
|
2280 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
|
2281 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
|
2282 |
15132
27d3289e1f5c
director: Improved logging related to disconnections.
Timo Sirainen <tss@iki.fi>
parents:
15131
diff
changeset
|
2283 director_connection_deinit(_conn, reason); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2284 if (dir->right == NULL) |
22564
17b1e65e6d70
director: Log info line for every incoming/outgoing connection
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22562
diff
changeset
|
2285 director_connect(dir, "Reconnecting after error"); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2286 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2287 |
22624
f7e2f55e6e91
director: Close director connection immediately when output buffer is full
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22623
diff
changeset
|
2288 static void director_disconnect_write_error(struct director_connection *conn) |
f7e2f55e6e91
director: Close director connection immediately when output buffer is full
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22623
diff
changeset
|
2289 { |
f7e2f55e6e91
director: Close director connection immediately when output buffer is full
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22623
diff
changeset
|
2290 director_connection_deinit(&conn, "write failure"); |
f7e2f55e6e91
director: Close director connection immediately when output buffer is full
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22623
diff
changeset
|
2291 } |
f7e2f55e6e91
director: Close director connection immediately when output buffer is full
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22623
diff
changeset
|
2292 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2293 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
|
2294 const char *data) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2295 { |
21322
5ab8dc1a4a6f
global: Change string position/length from unsigned int to size_t
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21079
diff
changeset
|
2296 size_t len = strlen(data); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2297 off_t ret; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2298 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2299 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
|
2300 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2301 |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
2302 if (director_debug) T_BEGIN { |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
2303 const char *const *lines = t_strsplit(data, "\n"); |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
2304 for (; lines[1] != NULL; lines++) |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
2305 dir_debug("output: %s: %s", conn->name, *lines); |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15324
diff
changeset
|
2306 } T_END; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2307 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
|
2308 if (ret != (off_t)len) { |
20264
0fd0fb05e2b3
global: Use [io]_stream_get_error() insted of %m
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19973
diff
changeset
|
2309 if (ret < 0) { |
0fd0fb05e2b3
global: Use [io]_stream_get_error() insted of %m
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19973
diff
changeset
|
2310 i_error("director(%s): write() failed: %s", conn->name, |
0fd0fb05e2b3
global: Use [io]_stream_get_error() insted of %m
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19973
diff
changeset
|
2311 o_stream_get_error(conn->output)); |
0fd0fb05e2b3
global: Use [io]_stream_get_error() insted of %m
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19973
diff
changeset
|
2312 } else { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2313 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
|
2314 "disconnecting", conn->name); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2315 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2316 o_stream_close(conn->output); |
22624
f7e2f55e6e91
director: Close director connection immediately when output buffer is full
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22623
diff
changeset
|
2317 /* closing the stream when output buffer is full doesn't cause |
f7e2f55e6e91
director: Close director connection immediately when output buffer is full
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22623
diff
changeset
|
2318 disconnection itself. */ |
f7e2f55e6e91
director: Close director connection immediately when output buffer is full
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22623
diff
changeset
|
2319 if (conn->to_disconnect != NULL) |
f7e2f55e6e91
director: Close director connection immediately when output buffer is full
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22623
diff
changeset
|
2320 timeout_remove(&conn->to_disconnect); |
f7e2f55e6e91
director: Close director connection immediately when output buffer is full
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22623
diff
changeset
|
2321 conn->to_disconnect = |
f7e2f55e6e91
director: Close director connection immediately when output buffer is full
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22623
diff
changeset
|
2322 timeout_add_short(0, director_disconnect_write_error, conn); |
18664
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18663
diff
changeset
|
2323 } else { |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18663
diff
changeset
|
2324 conn->dir->ring_traffic_output += len; |
22626
989dcf906522
director: Fix updating director connection's last_output timestamp
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22624
diff
changeset
|
2325 conn->last_output = ioloop_timeval; |
22627
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2326 conn->peak_bytes_buffered = |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2327 I_MAX(conn->peak_bytes_buffered, |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2328 o_stream_get_buffer_used_size(conn->output)); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2329 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2330 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2331 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2332 static void |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2333 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
|
2334 { |
20575
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
2335 string_t *str = t_str_new(128); |
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
2336 |
22253
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
2337 str_printfa(str, "Ping timed out in %u secs, disconnecting (", |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
2338 DIRECTOR_CONNECTION_PING_IDLE_TIMEOUT_MSECS/1000); |
9676f01a11df
director: Log more connection state information on handshaking errors
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22252
diff
changeset
|
2339 director_connection_append_stats(conn, str); |
20575
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
2340 if (conn->handshake_received) |
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
2341 str_append(str, ", handshaked"); |
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
2342 if (conn->synced) |
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
2343 str_append(str, ", synced"); |
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
2344 str_append_c(str, ')'); |
bceac5d8ae3b
director: Added more debug information to "Ping timed out" error
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20295
diff
changeset
|
2345 i_error("director(%s): %s", conn->name, str_c(str)); |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
2346 director_connection_disconnected(&conn, "Ping timeout"); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2347 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2348 |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2349 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
|
2350 { |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2351 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
|
2352 "input keeps coming, disconnecting", conn->name); |
18662
27baf04f2b18
director: If we disconnect a director, pass the reason all the way to deinit's debug logging.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
2353 director_connection_disconnected(&conn, "Pong timeout"); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2354 } |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2355 |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2356 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
|
2357 { |
11586
e75dab14bb2f
director: Send PINGs every 15 seconds for idling director connections.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
2358 if (conn->ping_waiting) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2359 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2360 |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2361 timeout_remove(&conn->to_ping); |
14409
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2362 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
|
2363 director_connection_ping_idle_timeout, conn); |
b43ae3805f5f
director: Redesigned connection handling and error handling.
Timo Sirainen <tss@iki.fi>
parents:
14408
diff
changeset
|
2364 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
|
2365 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
|
2366 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
|
2367 conn->ping_waiting = TRUE; |
22628
8623737c0129
director: Track connections' last ping time
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22627
diff
changeset
|
2368 conn->ping_sent_time = ioloop_timeval; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2369 } |
11585 | 2370 |
2371 const char *director_connection_get_name(struct director_connection *conn) | |
2372 { | |
2373 return conn->name; | |
2374 } | |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2375 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2376 struct director_host * |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2377 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
|
2378 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2379 return conn->host; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2380 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2381 |
14408
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
2382 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
|
2383 { |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
2384 return conn->handshake_received; |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
2385 } |
544a8c4705e5
director: Handle all commands during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14407
diff
changeset
|
2386 |
18062
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17419
diff
changeset
|
2387 bool director_connection_is_synced(struct director_connection *conn) |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17419
diff
changeset
|
2388 { |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17419
diff
changeset
|
2389 return conn->synced; |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17419
diff
changeset
|
2390 } |
ade6dcace5cd
doveadm director ring status shows now more information
Timo Sirainen <tss@iki.fi>
parents:
17419
diff
changeset
|
2391 |
14406
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
2392 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
|
2393 { |
14406
c760ac046203
director: List of director connections belongs to struct director.
Timo Sirainen <tss@iki.fi>
parents:
14405
diff
changeset
|
2394 return conn->in; |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2395 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2396 |
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
|
2397 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
|
2398 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
|
2399 { |
084064444f89
director: Don't try to send the new SYNC parameter to old director versions.
Timo Sirainen <tss@iki.fi>
parents:
14409
diff
changeset
|
2400 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
|
2401 } |
084064444f89
director: Don't try to send the new SYNC parameter to old director versions.
Timo Sirainen <tss@iki.fi>
parents:
14409
diff
changeset
|
2402 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2403 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
|
2404 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2405 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
|
2406 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2407 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2408 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
|
2409 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2410 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
|
2411 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2412 |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2413 void director_connection_set_synced(struct director_connection *conn, |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2414 bool synced) |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2415 { |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2416 if (conn->synced == synced) |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2417 return; |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2418 conn->synced = synced; |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2419 |
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2420 /* 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
|
2421 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
|
2422 return; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11598
diff
changeset
|
2423 |
14405
168e3b5cb6e8
director: Changes to PING handling.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
2424 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
|
2425 } |
22627
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2426 |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2427 void director_connection_get_status(struct director_connection *conn, |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2428 struct director_connection_status *status_r) |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2429 { |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2430 i_zero(status_r); |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2431 status_r->bytes_read = conn->input->v_offset; |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2432 status_r->bytes_sent = conn->output->offset; |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2433 status_r->bytes_buffered = o_stream_get_buffer_used_size(conn->output); |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2434 status_r->peak_bytes_buffered = conn->peak_bytes_buffered; |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2435 status_r->last_input = conn->last_input; |
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2436 status_r->last_output = conn->last_output; |
22628
8623737c0129
director: Track connections' last ping time
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22627
diff
changeset
|
2437 status_r->last_ping_msecs = conn->last_ping_msecs; |
22627
bcb064465b54
director: Add director_connection_get_status()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22626
diff
changeset
|
2438 } |