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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 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
f0fb8151c6b4 director: A lot of fixes.
Timo Sirainen <tss@iki.fi>
parents: 11352
diff changeset
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 }