Mercurial > dovecot > core-2.2
annotate src/director/user-directory.c @ 21078:6d37f4dd198d
director: Code cleanup - typedef user_free_hook
This is done because user_free_hook needs to be
also used in mail_host. If it changes, this
reduces the places that need touching.
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Tue, 01 Nov 2016 14:36:19 +0200 |
parents | b2418f9c5a54 |
children | 2e2563132d5f |
rev | line source |
---|---|
19552
0f22db71df7a
global: freshen copyright
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
18664
diff
changeset
|
1 /* Copyright (c) 2010-2016 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 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 struct user_directory_iter { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct user_directory *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 struct user *pos; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 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
|
22 /* 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
|
23 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
|
24 /* sorted by time */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 struct user *head, *tail; |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
26 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
|
27 |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
28 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
|
29 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
|
30 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 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
|
32 /* 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
|
33 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
|
34 unsigned int user_near_expiring_secs; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 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
|
38 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 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
|
40 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 array_foreach(&dir->iters, iterp) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 if ((*iterp)->pos == user) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 (*iterp)->pos = user->next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 } |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
45 |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
46 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
|
47 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
|
48 } |
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 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
|
51 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 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
|
53 user->host->user_count--; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
55 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
|
56 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
|
57 user_move_iters(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 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
|
60 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
|
61 i_free(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 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
64 static bool user_directory_user_has_connections(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
|
65 struct user *user) |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
66 { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
67 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
|
68 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
69 if (expire_timestamp > ioloop_time) |
15323
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
70 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
|
71 |
20986
410eacd7ad40
director: Code cleanup - added USER_IS_BEING_KILLED() macro
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20985
diff
changeset
|
72 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
|
73 /* don't free this user until the kill is finished */ |
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; |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
75 } |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
76 |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
77 if (user->weak) { |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
78 if (expire_timestamp + USER_NEAR_EXPIRING_MAX >= ioloop_time) |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
79 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
|
80 |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
81 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
|
82 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
|
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 return FALSE; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
85 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
86 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 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
|
88 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 while (dir->head != NULL && |
11599 | 90 !user_directory_user_has_connections(dir, dir->head)) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 user_free(dir, dir->head); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 |
18664
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
94 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
|
95 { |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
96 return hash_table_count(dir->hash); |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
97 } |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
98 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 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
|
100 unsigned int username_hash) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 { |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
102 struct user *user; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
104 user_directory_drop_expired(dir); |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
105 user = hash_table_lookup(dir->hash, POINTER_CAST(username_hash)); |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
106 if (user != NULL && !user_directory_user_has_connections(dir, user)) { |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
107 user_free(dir, user); |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
108 user = NULL; |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
109 } |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
110 return user; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
113 static void |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
114 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
|
115 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
|
116 { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
117 for (; pos != NULL; pos = pos->prev) { |
15080
e708a1d691d3
Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents:
14923
diff
changeset
|
118 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
|
119 break; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
120 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
121 if (pos == NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
122 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
|
123 else { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
124 user->prev = pos; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
125 user->next = pos->next; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
126 user->prev->next = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
127 if (user->next != NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
128 user->next->prev = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
129 else |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
130 dir->tail = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
131 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
132 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
133 |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
134 static void |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
135 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
|
136 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
|
137 { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
138 for (; pos != NULL; pos = pos->next) { |
15080
e708a1d691d3
Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents:
14923
diff
changeset
|
139 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
|
140 break; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
141 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
142 if (pos == NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
143 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
|
144 else { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
145 user->prev = pos->prev; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
146 user->next = pos; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
147 if (user->prev != NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
148 user->prev->next = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
149 else |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
150 dir->head = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
151 user->next->prev = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
152 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
153 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
154 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 struct user * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 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
|
157 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
|
158 { |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
159 struct user *user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
160 |
14487
45be27ff3414
director: Removed special (time_t)-1 code, it's not actually needed.
Timo Sirainen <tss@iki.fi>
parents:
14469
diff
changeset
|
161 /* 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
|
162 if (timestamp > ioloop_time) |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
163 timestamp = ioloop_time; |
11321
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 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
|
166 user->username_hash = username_hash; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 user->host = host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 user->host->user_count++; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 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
|
170 |
13030
d9d5759196ee
Compiler warning fix on 32bit systems.
Timo Sirainen <tss@iki.fi>
parents:
13018
diff
changeset
|
171 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
|
172 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
|
173 else { |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
174 /* 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
|
175 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
|
176 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
|
177 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
|
178 it. */ |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
179 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
|
180 /* 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
|
181 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
|
182 } 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
|
183 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
|
184 user); |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
185 } else { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
186 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
|
187 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
|
188 } |
dab7043e8263
director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
189 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
191 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
|
192 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
|
193 return user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 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
|
197 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 user_move_iters(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 user->timestamp = ioloop_time; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 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
|
202 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
|
203 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 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
|
206 struct mail_host *host) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 struct user *user, *next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 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
|
211 next = user->next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 if (user->host == host) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 user_free(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
218 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
|
219 struct user *const *user2) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
220 { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
221 if ((*user1)->timestamp < (*user2)->timestamp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
222 return -1; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
223 if ((*user1)->timestamp > (*user2)->timestamp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
224 return 1; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
225 return 0; |
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 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
228 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
|
229 { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
230 ARRAY(struct user *) users; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
231 struct user *user, *const *userp; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
232 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
|
233 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
234 if (users_count == 0) { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
235 i_assert(dir->head == NULL); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
236 return; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
237 } |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
238 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
239 /* 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
|
240 i_array_init(&users, users_count); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
241 user = dir->head; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
242 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
|
243 array_append(&users, &user, 1); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
244 i_assert(user == NULL); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
245 array_sort(&users, user_timestamp_cmp); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
246 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
247 /* recreate the linked list */ |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
248 dir->head = dir->tail = NULL; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
249 array_foreach(&users, userp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
250 DLLIST2_APPEND(&dir->head, &dir->tail, *userp); |
16658 | 251 i_assert(dir->head != NULL && |
252 dir->head->timestamp <= dir->tail->timestamp); | |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
253 array_free(&users); |
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 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
256 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
|
257 struct user *user) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 { |
14355 | 259 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
|
260 } |
11334 | 261 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
262 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
|
263 struct user *user) |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
264 { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
265 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
|
266 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
267 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
|
268 (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
|
269 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
|
270 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 |
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
|
272 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
|
273 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
|
274 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
|
275 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 struct user_directory *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
277 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
278 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
|
279 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 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
|
281 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
|
282 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
|
283 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
|
284 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
|
285 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
|
286 dir->user_near_expiring_secs = |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
287 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
|
288 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
|
289 |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
290 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
|
291 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
|
292 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
|
293 return dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 } |
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 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
|
297 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 struct user_directory *dir = *_dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 *_dir = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 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
|
303 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 while (dir->head != NULL) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 user_free(dir, dir->head); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 hash_table_destroy(&dir->hash); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 array_free(&dir->iters); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 i_free(dir); |
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 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 struct user_directory_iter * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 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
|
313 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 struct user_directory_iter *iter; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 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
|
317 iter->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
318 iter->pos = dir->head; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 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
|
320 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
|
321 return iter; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 } |
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 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
|
325 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 struct user *user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
328 user = iter->pos; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 if (user == NULL) |
17398
552cab8feb5f
various - trivial NULL-related sparse cleanups
Phil Carmody <phil@dovecot.fi>
parents:
17130
diff
changeset
|
330 return NULL; |
11321
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 iter->pos = user->next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 return user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 } |
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 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
|
337 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 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
|
339 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
|
340 unsigned int i, count; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 *_iter = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 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
|
345 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
|
346 if (iters[i] == iter) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 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
|
348 break; |
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 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
351 i_free(iter); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 } |