Mercurial > dovecot > core-2.2
annotate src/director/user-directory.c @ 22675:d689d7d99b4f
director: Delay sorting users until there are no more user iterators
This shouldn't have normally happened. Only when an outgoing handshake was
going on at the same time as a) another outgoing handshake was going on, or
b) doveadm was doing HOST-RESET-USERS
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sat, 25 Nov 2017 10:05:27 +0200 |
parents | a96fa917ced1 |
children | c9549bea9106 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21078
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" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "hash.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "llist.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "mail-host.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
10 /* n% of timeout_secs */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
11 #define USER_NEAR_EXPIRING_PERCENTAGE 10 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
12 /* but min/max. of this many secs */ |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
13 #define USER_NEAR_EXPIRING_MIN 3 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
14 #define USER_NEAR_EXPIRING_MAX 30 |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
15 /* This shouldn't matter what it is exactly, just try it sometimes later. */ |
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
16 #define USER_BEING_KILLED_EXPIRE_RETRY_SECS 60 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 struct user_directory_iter { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 struct user_directory *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 struct user *pos; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 struct user_directory { |
14923
96fd2c3bf932
Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
24 /* unsigned int username_hash => user */ |
96fd2c3bf932
Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
25 HASH_TABLE(void *, struct user *) hash; |
22670
a96fa917ced1
director: Keep users unsorted during handshake and sort them at the end
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22633
diff
changeset
|
26 /* sorted by time. may be unsorted while handshakes are going on. */ |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct user *head, *tail; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
29 ARRAY(struct user_directory_iter *) iters; |
21078
6d37f4dd198d
director: Code cleanup - typedef user_free_hook
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
30 user_free_hook_t *user_free_hook; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 unsigned int timeout_secs; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
33 /* If user's expire time is less than this many seconds away, |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
34 don't assume that other directors haven't yet expired it */ |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
35 unsigned int user_near_expiring_secs; |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
36 struct timeout *to_expire; |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
37 time_t to_expire_timestamp; |
22675
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
38 |
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
39 bool sort_pending; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 static void user_move_iters(struct user_directory *dir, struct user *user) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 struct user_directory_iter *const *iterp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 array_foreach(&dir->iters, iterp) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 if ((*iterp)->pos == user) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 (*iterp)->pos = user->next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 static void user_free(struct user_directory *dir, struct user *user) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 i_assert(user->host->user_count > 0); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 user->host->user_count--; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
57 if (dir->user_free_hook != NULL) |
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
58 dir->user_free_hook(user); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 user_move_iters(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 hash_table_remove(dir->hash, POINTER_CAST(user->username_hash)); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 DLLIST2_REMOVE(&dir->head, &dir->tail, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 i_free(user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
66 static bool user_directory_user_has_connections(struct user_directory *dir, |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
67 struct user *user, |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
68 time_t *expire_timestamp_r) |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
69 { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
70 time_t expire_timestamp = user->timestamp + dir->timeout_secs; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
71 |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
72 if (expire_timestamp > ioloop_time) { |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
73 *expire_timestamp_r = expire_timestamp; |
15323
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
74 return TRUE; |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
75 } |
15323
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
76 |
20986
410eacd7ad40
director: Code cleanup - added USER_IS_BEING_KILLED() macro
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20985
diff
changeset
|
77 if (USER_IS_BEING_KILLED(user)) { |
15323
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
78 /* don't free this user until the kill is finished */ |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
79 *expire_timestamp_r = ioloop_time + |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
80 USER_BEING_KILLED_EXPIRE_RETRY_SECS; |
15323
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
81 return TRUE; |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
82 } |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
83 |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
84 if (user->weak) { |
22632
fd12e91c6718
director: Fix off-by-one when checking if user weakness is stuck
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22492
diff
changeset
|
85 if (expire_timestamp + USER_NEAR_EXPIRING_MAX > ioloop_time) { |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
86 *expire_timestamp_r = expire_timestamp + |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
87 USER_NEAR_EXPIRING_MAX; |
15323
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
88 return TRUE; |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
89 } |
15323
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
90 |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
91 i_warning("User %u weakness appears to be stuck, removing it", |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
92 user->username_hash); |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
93 } |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
94 return FALSE; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
95 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
96 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 static void user_directory_drop_expired(struct user_directory *dir) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 { |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
99 time_t expire_timestamp = 0; |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
100 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 while (dir->head != NULL && |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
102 !user_directory_user_has_connections(dir, dir->head, &expire_timestamp)) { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 user_free(dir, dir->head); |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
104 expire_timestamp = 0; |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
105 } |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
106 i_assert(expire_timestamp > ioloop_time || expire_timestamp == 0); |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
107 |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
108 if (expire_timestamp != dir->to_expire_timestamp) { |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
109 if (dir->to_expire != NULL) |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
110 timeout_remove(&dir->to_expire); |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
111 if (expire_timestamp != 0) { |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
112 struct timeval tv = { .tv_sec = expire_timestamp }; |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
113 dir->to_expire_timestamp = tv.tv_sec; |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
114 dir->to_expire = timeout_add_absolute(&tv, |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
115 user_directory_drop_expired, dir); |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
116 } |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
117 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 |
18664
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
120 unsigned int user_directory_count(struct user_directory *dir) |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
121 { |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
122 return hash_table_count(dir->hash); |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
123 } |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
124 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 struct user *user_directory_lookup(struct user_directory *dir, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 unsigned int username_hash) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 { |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
128 struct user *user; |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
129 time_t expire_timestamp; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
131 user_directory_drop_expired(dir); |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
132 user = hash_table_lookup(dir->hash, POINTER_CAST(username_hash)); |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
133 if (user != NULL && !user_directory_user_has_connections(dir, user, &expire_timestamp)) { |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
134 user_free(dir, user); |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
135 user = NULL; |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
136 } |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
137 return user; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 struct user * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 user_directory_add(struct user_directory *dir, unsigned int username_hash, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 struct mail_host *host, time_t timestamp) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 { |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
144 struct user *user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
145 |
14487
45be27ff3414
director: Removed special (time_t)-1 code, it's not actually needed.
Timo Sirainen <tss@iki.fi>
parents:
14469
diff
changeset
|
146 /* make sure we don't add timestamps higher than ioloop time */ |
45be27ff3414
director: Removed special (time_t)-1 code, it's not actually needed.
Timo Sirainen <tss@iki.fi>
parents:
14469
diff
changeset
|
147 if (timestamp > ioloop_time) |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
148 timestamp = ioloop_time; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 user = i_new(struct user, 1); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 user->username_hash = username_hash; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 user->host = host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 user->host->user_count++; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 user->timestamp = timestamp; |
22670
a96fa917ced1
director: Keep users unsorted during handshake and sort them at the end
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22633
diff
changeset
|
155 DLLIST2_APPEND(&dir->head, &dir->tail, user); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
157 if (dir->to_expire == NULL) { |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
158 struct timeval tv = { .tv_sec = ioloop_time + dir->timeout_secs }; |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
159 dir->to_expire_timestamp = tv.tv_sec; |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
160 dir->to_expire = timeout_add_absolute(&tv, user_directory_drop_expired, dir); |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
161 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 hash_table_insert(dir->hash, POINTER_CAST(user->username_hash), user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 return user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 void user_directory_refresh(struct user_directory *dir, struct user *user) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 user_move_iters(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 user->timestamp = ioloop_time; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 DLLIST2_REMOVE(&dir->head, &dir->tail, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 DLLIST2_APPEND(&dir->head, &dir->tail, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 void user_directory_remove_host(struct user_directory *dir, |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 struct mail_host *host) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 struct user *user, *next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 for (user = dir->head; user != NULL; user = next) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 next = user->next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 if (user->host == host) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 user_free(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
188 static int user_timestamp_cmp(struct user *const *user1, |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
189 struct user *const *user2) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
190 { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
191 if ((*user1)->timestamp < (*user2)->timestamp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
192 return -1; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
193 if ((*user1)->timestamp > (*user2)->timestamp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
194 return 1; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
195 return 0; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
196 } |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
197 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
198 void user_directory_sort(struct user_directory *dir) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
199 { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
200 ARRAY(struct user *) users; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
201 struct user *user, *const *userp; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
202 unsigned int i, users_count = hash_table_count(dir->hash); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
203 |
22675
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
204 dir->sort_pending = FALSE; |
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
205 |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
206 if (users_count == 0) { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
207 i_assert(dir->head == NULL); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
208 return; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
209 } |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
210 |
22675
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
211 if (array_count(&dir->iters) > 0) { |
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
212 /* We can't sort the directory while there are iterators |
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
213 or they'll skip users. Do the sort after there are no more |
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
214 iterators. */ |
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
215 dir->sort_pending = TRUE; |
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
216 return; |
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
217 } |
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
218 |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
219 /* place all users into array and sort it */ |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
220 i_array_init(&users, users_count); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
221 user = dir->head; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
222 for (i = 0; i < users_count; i++, user = user->next) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
223 array_append(&users, &user, 1); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
224 i_assert(user == NULL); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
225 array_sort(&users, user_timestamp_cmp); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
226 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
227 /* recreate the linked list */ |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
228 dir->head = dir->tail = NULL; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
229 array_foreach(&users, userp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
230 DLLIST2_APPEND(&dir->head, &dir->tail, *userp); |
16658 | 231 i_assert(dir->head != NULL && |
232 dir->head->timestamp <= dir->tail->timestamp); | |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
233 array_free(&users); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
234 } |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
235 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
236 bool user_directory_user_is_recently_updated(struct user_directory *dir, |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
237 struct user *user) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 { |
14355 | 239 return (time_t)(user->timestamp + dir->timeout_secs/2) >= ioloop_time; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
240 } |
11334 | 241 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
242 bool user_directory_user_is_near_expiring(struct user_directory *dir, |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
243 struct user *user) |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
244 { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
245 time_t expire_timestamp; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
246 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
247 expire_timestamp = user->timestamp + |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
248 (dir->timeout_secs - dir->user_near_expiring_secs); |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
249 return expire_timestamp < ioloop_time; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 |
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
|
252 struct user_directory * |
21076
ef9d8f4c6c67
director: Code cleanup - moved username_hash generation to director.h
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20988
diff
changeset
|
253 user_directory_init(unsigned int timeout_secs, |
21078
6d37f4dd198d
director: Code cleanup - typedef user_free_hook
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21077
diff
changeset
|
254 user_free_hook_t *user_free_hook) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 struct user_directory *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
258 i_assert(timeout_secs > USER_NEAR_EXPIRING_MIN); |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
259 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 dir = i_new(struct user_directory, 1); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 dir->timeout_secs = timeout_secs; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
262 dir->user_near_expiring_secs = |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
263 timeout_secs * USER_NEAR_EXPIRING_PERCENTAGE / 100; |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
264 dir->user_near_expiring_secs = |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
265 I_MIN(dir->user_near_expiring_secs, USER_NEAR_EXPIRING_MAX); |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
266 dir->user_near_expiring_secs = |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
267 I_MAX(dir->user_near_expiring_secs, USER_NEAR_EXPIRING_MIN); |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
268 i_assert(dir->timeout_secs/2 > dir->user_near_expiring_secs); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
269 |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
270 dir->user_free_hook = user_free_hook; |
14918
8eae4e205c82
Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents:
14917
diff
changeset
|
271 hash_table_create_direct(&dir->hash, default_pool, 0); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 i_array_init(&dir->iters, 8); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 return dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 void user_directory_deinit(struct user_directory **_dir) |
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 struct user_directory *dir = *_dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 *_dir = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 i_assert(array_count(&dir->iters) == 0); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 while (dir->head != NULL) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 user_free(dir, dir->head); |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
286 if (dir->to_expire != NULL) |
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
287 timeout_remove(&dir->to_expire); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 hash_table_destroy(&dir->hash); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 array_free(&dir->iters); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 i_free(dir); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 struct user_directory_iter * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 user_directory_iter_init(struct user_directory *dir) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 struct user_directory_iter *iter; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 iter = i_new(struct user_directory_iter, 1); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 iter->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 iter->pos = dir->head; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 array_append(&dir->iters, &iter, 1); |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
302 user_directory_drop_expired(dir); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 return iter; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 struct user *user_directory_iter_next(struct user_directory_iter *iter) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 struct user *user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 user = iter->pos; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 if (user == NULL) |
17398
552cab8feb5f
various - trivial NULL-related sparse cleanups
Phil Carmody <phil@dovecot.fi>
parents:
17130
diff
changeset
|
312 return NULL; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 iter->pos = user->next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 return user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 void user_directory_iter_deinit(struct user_directory_iter **_iter) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 struct user_directory_iter *iter = *_iter; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 struct user_directory_iter *const *iters; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 unsigned int i, count; |
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 *_iter = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 iters = array_get(&iter->dir->iters, &count); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 for (i = 0; i < count; i++) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 if (iters[i] == iter) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 array_delete(&iter->dir->iters, i, 1); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 break; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 } |
22675
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
333 if (array_count(&iter->dir->iters) == 0 && iter->dir->sort_pending) |
d689d7d99b4f
director: Delay sorting users until there are no more user iterators
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22670
diff
changeset
|
334 user_directory_sort(iter->dir); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 i_free(iter); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 } |