Mercurial > dovecot > core-2.2
annotate src/director/director-request.c @ 22633:9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Recreate it only when the timeout should change.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sat, 04 Nov 2017 01:34:02 +0200 |
parents | 2e2563132d5f |
children | 2ed6735ffc7a |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21079
diff
changeset
|
1 /* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */ |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "array.h" |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
6 #include "str.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "mail-host.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "director.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "director-request.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #define DIRECTOR_REQUEST_TIMEOUT_SECS 30 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
12 #define RING_NOCONN_WARNING_DELAY_MSECS (2*1000) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
14 enum director_request_delay_reason { |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
15 REQUEST_DELAY_NONE = 0, |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
16 REQUEST_DELAY_RINGNOTHANDSHAKED, |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
17 REQUEST_DELAY_RINGNOTSYNCED, |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
18 REQUEST_DELAY_NOHOSTS, |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
19 REQUEST_DELAY_WEAK, |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
20 REQUEST_DELAY_KILL |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
21 }; |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
22 |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
23 static const char *delay_reason_strings[] = { |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
24 "unknown", |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
25 "ring not handshaked", |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
26 "ring not synced", |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
27 "no hosts", |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
28 "weak user", |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
29 "kill waiting" |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
30 }; |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
31 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 struct director_request { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 struct director *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 time_t create_time; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 unsigned int username_hash; |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
37 enum director_request_delay_reason delay_reason; |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
38 char *username_tag; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 director_request_callback *callback; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 void *context; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
44 static void director_request_free(struct director_request *request) |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
45 { |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
46 i_free(request->username_tag); |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
47 i_free(request); |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
48 } |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
49 |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
50 static const char * |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
51 director_request_get_timeout_error(struct director_request *request, |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
52 struct user *user, string_t *str) |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
53 { |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
54 unsigned int secs; |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
55 |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
56 str_truncate(str, 0); |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
57 str_printfa(str, "Timeout because %s - queued for %u secs (", |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
58 delay_reason_strings[request->delay_reason], |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
59 (unsigned int)(ioloop_time - request->create_time)); |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
60 |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
61 if (request->dir->ring_last_sync_time == 0) |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
62 str_append(str, "Ring has never been synced"); |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
63 else { |
14326
d27b6724db32
director: Improved request timeout error more.
Timo Sirainen <tss@iki.fi>
parents:
14325
diff
changeset
|
64 secs = ioloop_time - request->dir->ring_last_sync_time; |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
65 if (request->dir->ring_synced) |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
66 str_printfa(str, "Ring synced for %u secs", secs); |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
67 else |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
68 str_printfa(str, "Ring not synced for %u secs", secs); |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
69 } |
14325
1b37d6422905
director: If request times out, log more information.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
70 |
1b37d6422905
director: If request times out, log more information.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
71 if (user != NULL) { |
1b37d6422905
director: If request times out, log more information.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
72 if (user->weak) |
1b37d6422905
director: If request times out, log more information.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
73 str_append(str, ", weak user"); |
14326
d27b6724db32
director: Improved request timeout error more.
Timo Sirainen <tss@iki.fi>
parents:
14325
diff
changeset
|
74 str_printfa(str, ", user refreshed %u secs ago", |
14330
b1c21492f8c9
director: Compiler warning fix
Timo Sirainen <tss@iki.fi>
parents:
14326
diff
changeset
|
75 (unsigned int)(ioloop_time - user->timestamp)); |
14325
1b37d6422905
director: If request times out, log more information.
Timo Sirainen <tss@iki.fi>
parents:
14310
diff
changeset
|
76 } |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
77 str_printfa(str, ", hash=%u", request->username_hash); |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
78 if (request->username_tag != NULL) |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
79 str_printfa(str, ", tag=%s", request->username_tag); |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
80 str_append_c(str, ')'); |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
81 return str_c(str); |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
82 } |
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
83 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 static void director_request_timeout(struct director *dir) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 struct director_request **requestp, *request; |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
87 struct user *user; |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
88 const char *errormsg; |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
89 string_t *str = t_str_new(128); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 while (array_count(&dir->pending_requests) > 0) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 requestp = array_idx_modifiable(&dir->pending_requests, 0); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 request = *requestp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 if (request->create_time + |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 DIRECTOR_REQUEST_TIMEOUT_SECS > ioloop_time) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 break; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
99 const char *tag_name = request->username_tag == NULL ? "" : |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
100 request->username_tag; |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
101 struct mail_tag *tag = mail_tag_find(dir->mail_hosts, tag_name); |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
102 user = tag == NULL ? NULL : |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
103 user_directory_lookup(tag->users, request->username_hash); |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
104 |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
105 errormsg = director_request_get_timeout_error(request, |
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
106 user, str); |
15323
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
15322
diff
changeset
|
107 if (user != NULL && |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
15322
diff
changeset
|
108 request->delay_reason == REQUEST_DELAY_WEAK) { |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
15322
diff
changeset
|
109 /* weakness appears to have gotten stuck. this is a |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
15322
diff
changeset
|
110 bug, but try to fix it for future requests by |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
15322
diff
changeset
|
111 removing the weakness. */ |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
15322
diff
changeset
|
112 user->weak = FALSE; |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
15322
diff
changeset
|
113 } |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
114 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 array_delete(&dir->pending_requests, 0, 1); |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
116 T_BEGIN { |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
117 request->callback(NULL, NULL, errormsg, request->context); |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
118 } T_END; |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
119 director_request_free(request); |
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 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 if (array_count(&dir->pending_requests) == 0 && dir->to_request != NULL) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 timeout_remove(&dir->to_request); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 void director_request(struct director *dir, const char *username, |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
127 const char *tag, |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 director_request_callback *callback, void *context) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 struct director_request *request; |
14292
817ef4c9f1f3
Added director_username_hash setting to specify what part of the username is hashed.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
131 unsigned int username_hash = |
21076
ef9d8f4c6c67
director: Code cleanup - moved username_hash generation to director.h
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21074
diff
changeset
|
132 director_get_username_hash(dir, username); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 |
18664
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
134 dir->num_requests++; |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
135 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 request = i_new(struct director_request, 1); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 request->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 request->create_time = ioloop_time; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 request->username_hash = username_hash; |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
140 request->username_tag = tag[0] == '\0' ? NULL : i_strdup(tag); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 request->callback = callback; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 request->context = context; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 if (director_request_continue(request)) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 return; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 /* need to queue it */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 if (dir->to_request == NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 dir->to_request = |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 timeout_add(DIRECTOR_REQUEST_TIMEOUT_SECS * 1000, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 director_request_timeout, dir); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 array_append(&dir->pending_requests, &request, 1); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
156 static void ring_noconn_warning(struct director *dir) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
157 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
158 if (!dir->ring_handshaked) { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
159 i_warning("Delaying all requests " |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
160 "until all directors have connected"); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
161 } else { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
162 i_warning("Delaying new user requests until ring is synced"); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
163 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
164 dir->ring_handshake_warning_sent = TRUE; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
165 timeout_remove(&dir->to_handshake_warning); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
166 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
167 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
168 static void ring_log_delayed_warning(struct director *dir) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
169 { |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
170 if (dir->ring_handshake_warning_sent || |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
171 dir->to_handshake_warning != NULL) |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
172 return; |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
173 |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
174 dir->to_handshake_warning = timeout_add(RING_NOCONN_WARNING_DELAY_MSECS, |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
175 ring_noconn_warning, dir); |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
176 } |
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
177 |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
178 static bool |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
179 director_request_existing(struct director_request *request, struct user *user) |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
180 { |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
181 struct director *dir = request->dir; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
182 struct mail_host *host; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
183 |
20986
410eacd7ad40
director: Code cleanup - added USER_IS_BEING_KILLED() macro
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
184 if (USER_IS_BEING_KILLED(user)) { |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
185 /* delay processing this user's connections until |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
186 its existing connections have been killed */ |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
187 request->delay_reason = REQUEST_DELAY_KILL; |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
188 dir_debug("request: %u waiting for kill to finish", |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
189 user->username_hash); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
190 return FALSE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
191 } |
15143
f9424b066dcb
director: Fixed weak-user handling when there is only one director.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
192 if (dir->right == NULL && dir->ring_synced) { |
f9424b066dcb
director: Fixed weak-user handling when there is only one director.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
193 /* looks like all the other directors have died. we can do |
f9424b066dcb
director: Fixed weak-user handling when there is only one director.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
194 whatever we want without breaking anything. remove the |
f9424b066dcb
director: Fixed weak-user handling when there is only one director.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
195 user's weakness just in case it was set to TRUE when we |
f9424b066dcb
director: Fixed weak-user handling when there is only one director.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
196 had more directors. */ |
f9424b066dcb
director: Fixed weak-user handling when there is only one director.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
197 user->weak = FALSE; |
f9424b066dcb
director: Fixed weak-user handling when there is only one director.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
198 return TRUE; |
f9424b066dcb
director: Fixed weak-user handling when there is only one director.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
199 } |
f9424b066dcb
director: Fixed weak-user handling when there is only one director.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
200 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
201 if (user->weak) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
202 /* wait for user to become non-weak */ |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
203 request->delay_reason = REQUEST_DELAY_WEAK; |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
204 dir_debug("request: %u waiting for weakness", |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
205 request->username_hash); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
206 return FALSE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
207 } |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
208 if (!user_directory_user_is_near_expiring(user->host->tag->users, user)) |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
209 return TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
210 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
211 /* user is close to being expired. another director may have |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
212 already expired it. */ |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
213 host = mail_host_get_by_hash(dir->mail_hosts, user->username_hash, |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
214 user->host->tag->name); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
215 if (!dir->ring_synced) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
216 /* try again later once ring is synced */ |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
217 request->delay_reason = REQUEST_DELAY_RINGNOTSYNCED; |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
218 dir_debug("request: %u waiting for sync for making weak", |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
219 request->username_hash); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
220 return FALSE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
221 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
222 if (user->host == host) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
223 /* doesn't matter, other directors would |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
224 assign the user the same way regardless */ |
19290
c4fa1bf6da57
director: Added another debug log message.
Timo Sirainen <tss@iki.fi>
parents:
18664
diff
changeset
|
225 dir_debug("request: %u would be weak, but host doesn't change", request->username_hash); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
226 return TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
227 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
228 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
229 /* We have to worry about two separate timepoints in here: |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
230 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
231 a) some directors think the user isn't expiring, and |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
232 others think the user is near expiring |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
233 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
234 b) some directors think the user is near expiring, and |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
235 others think the user has already expired |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
236 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
237 What we don't have to worry about is: |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
238 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
239 !c) some directors think the user isn't expiring, and |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
240 others think the user has already expired |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
241 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
242 If !c) happens, the user might get redirected to different backends. |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
243 We'll use a large enough timeout between a) and b) states, so that |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
244 !c) should never happen. |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
245 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
246 So what we'll do here is: |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
247 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
248 1. Send a USER-WEAK notification to all directors with the new host. |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
249 2. Each director receiving USER-WEAK refreshes the user's timestamp |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
250 and host, but marks the user as being weak. |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
251 3. Once USER-WEAK has reached all directors, a real USER update is |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
252 sent, which removes the weak-flag. |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
253 4. If a director ever receives a USER update for a weak user, the |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
254 USER update overrides the host and removes the weak-flag. |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
255 5. Director doesn't let any weak user log in, until the weak-flag |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
256 gets removed. |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
257 */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
258 if (dir->ring_min_version < DIRECTOR_VERSION_WEAK_USERS) { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
259 /* weak users not supported by ring currently */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
260 return TRUE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
261 } else { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
262 user->weak = TRUE; |
17259
6269063f8408
director: Fixed handling weak users when there were exactly 2 director servers in the ring.
Timo Sirainen <tss@iki.fi>
parents:
17255
diff
changeset
|
263 director_update_user_weak(dir, dir->self_host, NULL, NULL, user); |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
264 request->delay_reason = REQUEST_DELAY_WEAK; |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
265 dir_debug("request: %u set to weak", request->username_hash); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
266 return FALSE; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
267 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
268 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
269 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 bool director_request_continue(struct director_request *request) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 struct director *dir = request->dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 struct user *user; |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
275 const char *tag; |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
276 struct mail_tag *mail_tag; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 if (!dir->ring_handshaked) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 /* delay requests until ring handshaking is complete */ |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
280 dir_debug("request: %u waiting for handshake", |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
281 request->username_hash); |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
282 ring_log_delayed_warning(dir); |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
283 request->delay_reason = REQUEST_DELAY_RINGNOTHANDSHAKED; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
287 tag = request->username_tag == NULL ? "" : request->username_tag; |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
288 mail_tag = mail_tag_find(dir->mail_hosts, tag); |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
289 user = mail_tag == NULL ? NULL : |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
290 user_directory_lookup(mail_tag->users, request->username_hash); |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
291 |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
292 if (user != NULL) { |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
293 i_assert(user->host->tag == mail_tag); |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
294 if (!director_request_existing(request, user)) |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
295 return FALSE; |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
296 user_directory_refresh(mail_tag->users, user); |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
297 dir_debug("request: %u refreshed timeout to %u", |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
298 request->username_hash, user->timestamp); |
13045
79f9dce5d5fd
director: Added support for moving user to another server with "doveadm director move".
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
299 } else { |
11585 | 300 if (!dir->ring_synced) { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 /* delay adding new users until ring is again synced */ |
11629
a07aa85f68c9
director: Lots of fixes. It should be pretty stable now.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
302 ring_log_delayed_warning(dir); |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
303 request->delay_reason = REQUEST_DELAY_RINGNOTSYNCED; |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
304 dir_debug("request: %u waiting for sync for adding", |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
305 request->username_hash); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 } |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
308 host = mail_host_get_by_hash(dir->mail_hosts, |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
309 request->username_hash, tag); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 if (host == NULL) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 /* all hosts have been removed */ |
15322
10fae591707c
director: Log more clearly why a request timeouts.
Timo Sirainen <tss@iki.fi>
parents:
15143
diff
changeset
|
312 request->delay_reason = REQUEST_DELAY_NOHOSTS; |
15326
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
313 dir_debug("request: %u waiting for hosts", |
48af47f2eb9c
director: -D parameter now enables extensive debug logging.
Timo Sirainen <tss@iki.fi>
parents:
15323
diff
changeset
|
314 request->username_hash); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 return FALSE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 } |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
317 user = user_directory_add(host->tag->users, |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
318 request->username_hash, |
14487
45be27ff3414
director: Removed special (time_t)-1 code, it's not actually needed.
Timo Sirainen <tss@iki.fi>
parents:
14468
diff
changeset
|
319 host, ioloop_time); |
19292
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19290
diff
changeset
|
320 dir_debug("request: %u added timeout to %u (hosts_hash=%u)", |
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19290
diff
changeset
|
321 request->username_hash, user->timestamp, |
bae8efd8b5b3
director: Use mail_hosts_hash() to improve debug log messages.
Timo Sirainen <tss@iki.fi>
parents:
19290
diff
changeset
|
322 mail_hosts_hash(dir->mail_hosts)); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
325 i_assert(!user->weak); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 director_update_user(dir, dir->self_host, user); |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
327 T_BEGIN { |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
328 request->callback(&user->host->ip, user->host->hostname, |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19292
diff
changeset
|
329 NULL, request->context); |
13921
c70965e8b27d
director: If request is timed out, log an error.
Timo Sirainen <tss@iki.fi>
parents:
13045
diff
changeset
|
330 } T_END; |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
17259
diff
changeset
|
331 director_request_free(request); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 return TRUE; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 } |