annotate src/director/user-directory.c @ 22675:d689d7d99b4f

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