Mercurial > dovecot > core-2.2
annotate src/director/user-directory.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 | fd12e91c6718 |
children | a96fa917ced1 |
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; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 /* sorted by time */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct user *head, *tail; |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
28 struct user *prev_insert_pos; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
30 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
|
31 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
|
32 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 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
|
34 /* 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
|
35 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
|
36 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
|
37 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
|
38 time_t to_expire_timestamp; |
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 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 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
|
42 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 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
|
44 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 array_foreach(&dir->iters, iterp) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 if ((*iterp)->pos == user) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 (*iterp)->pos = user->next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 } |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
49 |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
50 if (dir->prev_insert_pos == user) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
51 dir->prev_insert_pos = user->next; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 } |
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 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
|
55 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 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
|
57 user->host->user_count--; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
59 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
|
60 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
|
61 user_move_iters(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 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
|
64 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
|
65 i_free(user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
68 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
|
69 struct user *user, |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
70 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
|
71 { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
72 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
|
73 |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
74 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
|
75 *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
|
76 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
|
77 } |
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 |
20986
410eacd7ad40
director: Code cleanup - added USER_IS_BEING_KILLED() macro
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20985
diff
changeset
|
79 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
|
80 /* 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
|
81 *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
|
82 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
|
83 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
|
84 } |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
85 |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
86 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
|
87 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
|
88 *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
|
89 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
|
90 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
|
91 } |
15323
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
92 |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
93 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
|
94 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
|
95 } |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
96 return FALSE; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
97 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
98 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 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
|
100 { |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
101 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
|
102 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 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
|
104 !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
|
105 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
|
106 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 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
|
109 |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
110 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
|
111 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
|
112 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
|
113 if (expire_timestamp != 0) { |
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
114 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
|
115 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
|
116 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
|
117 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
|
118 } |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
119 } |
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 |
18664
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
122 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
|
123 { |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
124 return hash_table_count(dir->hash); |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
125 } |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
126 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 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
|
128 unsigned int username_hash) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 { |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
130 struct user *user; |
22633
9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22632
diff
changeset
|
131 time_t expire_timestamp; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
133 user_directory_drop_expired(dir); |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
134 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
|
135 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
|
136 user_free(dir, user); |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
137 user = NULL; |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
138 } |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
139 return user; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
142 static void |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
143 user_directory_insert_backwards(struct user_directory *dir, |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
144 struct user *pos, struct user *user) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
145 { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
146 for (; pos != NULL; pos = pos->prev) { |
15080
e708a1d691d3
Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents:
14923
diff
changeset
|
147 if (pos->timestamp <= user->timestamp) |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
148 break; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
149 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
150 if (pos == NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
151 DLLIST2_PREPEND(&dir->head, &dir->tail, user); |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
152 else { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
153 user->prev = pos; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
154 user->next = pos->next; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
155 user->prev->next = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
156 if (user->next != NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
157 user->next->prev = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
158 else |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
159 dir->tail = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
160 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
161 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
162 |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
163 static void |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
164 user_directory_insert_forwards(struct user_directory *dir, |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
165 struct user *pos, struct user *user) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
166 { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
167 for (; pos != NULL; pos = pos->next) { |
15080
e708a1d691d3
Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents:
14923
diff
changeset
|
168 if (pos->timestamp >= user->timestamp) |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
169 break; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
170 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
171 if (pos == NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
172 DLLIST2_APPEND(&dir->head, &dir->tail, user); |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
173 else { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
174 user->prev = pos->prev; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
175 user->next = pos; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
176 if (user->prev != NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
177 user->prev->next = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
178 else |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
179 dir->head = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
180 user->next->prev = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
181 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
182 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
183 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 struct user * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 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
|
186 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
|
187 { |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
188 struct user *user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
189 |
14487
45be27ff3414
director: Removed special (time_t)-1 code, it's not actually needed.
Timo Sirainen <tss@iki.fi>
parents:
14469
diff
changeset
|
190 /* 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
|
191 if (timestamp > ioloop_time) |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
192 timestamp = ioloop_time; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 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
|
195 user->username_hash = username_hash; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 user->host = host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 user->host->user_count++; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 user->timestamp = timestamp; |
13018
dab7043e8263
director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
199 |
13030
d9d5759196ee
Compiler warning fix on 32bit systems.
Timo Sirainen <tss@iki.fi>
parents:
13018
diff
changeset
|
200 if (dir->tail == NULL || (time_t)dir->tail->timestamp <= timestamp) |
13018
dab7043e8263
director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
201 DLLIST2_APPEND(&dir->head, &dir->tail, user); |
dab7043e8263
director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
202 else { |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
203 /* need to insert to correct position. we should get here |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
204 only when handshaking. the handshaking USER requests should |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
205 come sorted by timestamp. so keep track of the previous |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
206 insert position, the next USER should be inserted after |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
207 it. */ |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
208 if (dir->prev_insert_pos == NULL) { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
209 /* find the position starting from tail */ |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
210 user_directory_insert_backwards(dir, dir->tail, user); |
15080
e708a1d691d3
Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents:
14923
diff
changeset
|
211 } else if (timestamp < (time_t)dir->prev_insert_pos->timestamp) { |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
212 user_directory_insert_backwards(dir, dir->prev_insert_pos, |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
213 user); |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
214 } else { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
215 user_directory_insert_forwards(dir, dir->prev_insert_pos, |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
216 user); |
13018
dab7043e8263
director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
217 } |
dab7043e8263
director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
218 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 |
22492
ac432c123103
director: Make sure users gets expired even on an idle director
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
220 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
|
221 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
|
222 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
|
223 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
|
224 } |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
225 dir->prev_insert_pos = user; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 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
|
227 return user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 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
|
231 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 user_move_iters(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 user->timestamp = ioloop_time; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 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
|
236 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
|
237 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 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
|
240 struct mail_host *host) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 struct user *user, *next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 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
|
245 next = user->next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 if (user->host == host) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 user_free(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 } |
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 |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
252 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
|
253 struct user *const *user2) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
254 { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
255 if ((*user1)->timestamp < (*user2)->timestamp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
256 return -1; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
257 if ((*user1)->timestamp > (*user2)->timestamp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
258 return 1; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
259 return 0; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
260 } |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
261 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
262 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
|
263 { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
264 ARRAY(struct user *) users; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
265 struct user *user, *const *userp; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
266 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
|
267 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
268 if (users_count == 0) { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
269 i_assert(dir->head == NULL); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
270 return; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
271 } |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
272 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
273 /* 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
|
274 i_array_init(&users, users_count); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
275 user = dir->head; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
276 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
|
277 array_append(&users, &user, 1); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
278 i_assert(user == NULL); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
279 array_sort(&users, user_timestamp_cmp); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
280 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
281 /* recreate the linked list */ |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
282 dir->head = dir->tail = NULL; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
283 array_foreach(&users, userp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
284 DLLIST2_APPEND(&dir->head, &dir->tail, *userp); |
16658 | 285 i_assert(dir->head != NULL && |
286 dir->head->timestamp <= dir->tail->timestamp); | |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
287 array_free(&users); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
288 } |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
289 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
290 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
|
291 struct user *user) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 { |
14355 | 293 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
|
294 } |
11334 | 295 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
296 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
|
297 struct user *user) |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
298 { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
299 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
|
300 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
301 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
|
302 (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
|
303 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
|
304 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 |
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
|
306 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
|
307 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
|
308 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
|
309 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 struct user_directory *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
312 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
|
313 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 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
|
315 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
|
316 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
|
317 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
|
318 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
|
319 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
|
320 dir->user_near_expiring_secs = |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
321 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
|
322 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
|
323 |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
324 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
|
325 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
|
326 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
|
327 return dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 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
|
331 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 struct user_directory *dir = *_dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 *_dir = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 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
|
337 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 while (dir->head != NULL) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 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
|
340 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
|
341 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
|
342 hash_table_destroy(&dir->hash); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 array_free(&dir->iters); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 i_free(dir); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 struct user_directory_iter * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 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
|
349 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
350 struct user_directory_iter *iter; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 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
|
353 iter->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 iter->pos = dir->head; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 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
|
356 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
|
357 return iter; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 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
|
361 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 struct user *user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
364 user = iter->pos; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 if (user == NULL) |
17398
552cab8feb5f
various - trivial NULL-related sparse cleanups
Phil Carmody <phil@dovecot.fi>
parents:
17130
diff
changeset
|
366 return NULL; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
367 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
368 iter->pos = user->next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
369 return user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
370 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
371 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
372 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
|
373 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
374 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
|
375 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
|
376 unsigned int i, count; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
377 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
378 *_iter = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
379 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
380 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
|
381 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
|
382 if (iters[i] == iter) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
383 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
|
384 break; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
385 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
386 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 i_free(iter); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
388 } |