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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 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
c3901ac774cb Make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents: 16621
diff changeset
285 i_assert(dir->head != NULL &&
c3901ac774cb Make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents: 16621
diff changeset
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
5b05411a81cf Compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents: 14310
diff changeset
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
d6d59ff58511 Compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents: 11321
diff changeset
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 }