Mercurial > dovecot > core-2.2
annotate src/director/user-directory.c @ 20988:9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
This should make it a bit easier to understand the life time of user
killing. It also simplifies code by removing struct
director_user_kill_finish_ctx.
Finally, this already reduces memory usage with 32bit systems, and would
make it possible to reduce also on 64bit systems if timestamp is shrank to
31 bits and weak bit moved after it. I'm not sure if that would be better
for performance though. In any case it would provide free space for 4 extra
bytes if that were needed in future.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Mon, 17 Oct 2016 01:07:50 +0300 |
parents | 410eacd7ad40 |
children | ef9d8f4c6c67 |
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" |
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
|
8 #include "mail-user-hash.h" |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "mail-host.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "user-directory.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
12 /* 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
|
13 #define USER_NEAR_EXPIRING_PERCENTAGE 10 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
14 /* but min/max. of this many secs */ |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
15 #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
|
16 #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
|
17 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 struct user_directory_iter { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 struct user_directory *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 struct user *pos; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 struct user_directory { |
14923
96fd2c3bf932
Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
24 /* unsigned int username_hash => user */ |
96fd2c3bf932
Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents:
14920
diff
changeset
|
25 HASH_TABLE(void *, struct user *) hash; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 /* sorted by time */ |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 struct user *head, *tail; |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
28 struct user *prev_insert_pos; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
14920
a097ef0a9d6d
Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents:
14918
diff
changeset
|
30 ARRAY(struct user_directory_iter *) iters; |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
31 void (*user_free_hook)(struct user *); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 |
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
|
33 char *username_hash_fmt; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 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
|
35 /* 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
|
36 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
|
37 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
|
38 }; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 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
|
41 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 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
|
43 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 array_foreach(&dir->iters, iterp) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 if ((*iterp)->pos == user) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 (*iterp)->pos = user->next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 } |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
48 |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
49 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
|
50 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
|
51 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 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
|
54 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 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
|
56 user->host->user_count--; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
58 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
|
59 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
|
60 user_move_iters(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 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
|
63 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
|
64 i_free(user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
67 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
|
68 struct user *user) |
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 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
72 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
|
73 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
|
74 |
20986
410eacd7ad40
director: Code cleanup - added USER_IS_BEING_KILLED() macro
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20985
diff
changeset
|
75 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
|
76 /* 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
|
77 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
|
78 } |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
79 |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
80 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
|
81 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
|
82 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
|
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 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
|
85 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
|
86 } |
7352d48b4071
director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents:
14487
diff
changeset
|
87 return FALSE; |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
88 } |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
89 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 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
|
91 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 while (dir->head != NULL && |
11599 | 93 !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
|
94 user_free(dir, dir->head); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 |
18664
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
97 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
|
98 { |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
99 return hash_table_count(dir->hash); |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
100 } |
502755a1af5f
director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
101 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 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
|
103 unsigned int username_hash) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 { |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
105 struct user *user; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
107 user_directory_drop_expired(dir); |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
108 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
|
109 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
|
110 user_free(dir, user); |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
111 user = NULL; |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
112 } |
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
113 return user; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
116 static void |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
117 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
|
118 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
|
119 { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
120 for (; pos != NULL; pos = pos->prev) { |
15080
e708a1d691d3
Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents:
14923
diff
changeset
|
121 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
|
122 break; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
123 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
124 if (pos == NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
125 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
|
126 else { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
127 user->prev = pos; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
128 user->next = pos->next; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
129 user->prev->next = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
130 if (user->next != NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
131 user->next->prev = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
132 else |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
133 dir->tail = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
134 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
135 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
136 |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
137 static void |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
138 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
|
139 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
|
140 { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
141 for (; pos != NULL; pos = pos->next) { |
15080
e708a1d691d3
Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents:
14923
diff
changeset
|
142 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
|
143 break; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
144 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
145 if (pos == NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
146 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
|
147 else { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
148 user->prev = pos->prev; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
149 user->next = pos; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
150 if (user->prev != NULL) |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
151 user->prev->next = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
152 else |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
153 dir->head = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
154 user->next->prev = user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
155 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
156 } |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
157 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 struct user * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 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
|
160 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
|
161 { |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
162 struct user *user; |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
163 |
14487
45be27ff3414
director: Removed special (time_t)-1 code, it's not actually needed.
Timo Sirainen <tss@iki.fi>
parents:
14469
diff
changeset
|
164 /* 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
|
165 if (timestamp > ioloop_time) |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
166 timestamp = ioloop_time; |
11321
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 = i_new(struct user, 1); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 user->username_hash = username_hash; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 user->host = host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 user->host->user_count++; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 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
|
173 |
13030
d9d5759196ee
Compiler warning fix on 32bit systems.
Timo Sirainen <tss@iki.fi>
parents:
13018
diff
changeset
|
174 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
|
175 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
|
176 else { |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
177 /* 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
|
178 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
|
179 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
|
180 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
|
181 it. */ |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
182 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
|
183 /* 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
|
184 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
|
185 } 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
|
186 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
|
187 user); |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
188 } else { |
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
189 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
|
190 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
|
191 } |
dab7043e8263
director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents:
12782
diff
changeset
|
192 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 |
14468
0b4295b48941
director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents:
14355
diff
changeset
|
194 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
|
195 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
|
196 return 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 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 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
|
200 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 user_move_iters(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 user->timestamp = ioloop_time; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 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
|
205 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
|
206 } |
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 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
|
209 struct mail_host *host) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 struct user *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 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
|
214 next = user->next; |
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 if (user->host == host) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 user_free(dir, user); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
221 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
|
222 struct user *const *user2) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
223 { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
224 if ((*user1)->timestamp < (*user2)->timestamp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
225 return -1; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
226 if ((*user1)->timestamp > (*user2)->timestamp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
227 return 1; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
228 return 0; |
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 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
231 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
|
232 { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
233 ARRAY(struct user *) users; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
234 struct user *user, *const *userp; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
235 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
|
236 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
237 if (users_count == 0) { |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
238 i_assert(dir->head == NULL); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
239 return; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
240 } |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
241 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
242 /* 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
|
243 i_array_init(&users, users_count); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
244 user = dir->head; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
245 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
|
246 array_append(&users, &user, 1); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
247 i_assert(user == NULL); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
248 array_sort(&users, user_timestamp_cmp); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
249 |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
250 /* recreate the linked list */ |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
251 dir->head = dir->tail = NULL; |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
252 array_foreach(&users, userp) |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
253 DLLIST2_APPEND(&dir->head, &dir->tail, *userp); |
16658 | 254 i_assert(dir->head != NULL && |
255 dir->head->timestamp <= dir->tail->timestamp); | |
16621
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
256 array_free(&users); |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
257 } |
5ef62caea61b
director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents:
16617
diff
changeset
|
258 |
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
|
259 unsigned int user_directory_get_username_hash(struct user_directory *dir, |
817ef4c9f1f3
Added director_username_hash setting to specify what part of the username is hashed.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
260 const char *username) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 { |
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
|
262 return mail_user_hash(username, dir->username_hash_fmt); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
265 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
|
266 struct user *user) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 { |
14355 | 268 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
|
269 } |
11334 | 270 |
14310
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
271 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
|
272 struct user *user) |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
273 { |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
274 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
|
275 |
7a26c427fc78
director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents:
14292
diff
changeset
|
276 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
|
277 (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
|
278 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
|
279 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
280 |
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
|
281 struct user_directory * |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
282 user_directory_init(unsigned int timeout_secs, const char *username_hash_fmt, |
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
283 void (*user_free_hook)(struct user *)) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 struct user_directory *dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
287 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
|
288 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 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
|
290 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
|
291 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
|
292 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
|
293 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
|
294 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
|
295 dir->user_near_expiring_secs = |
16617
0e0eb964685a
director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
296 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
|
297 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
|
298 |
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
|
299 dir->username_hash_fmt = i_strdup(username_hash_fmt); |
20988
9d4039e2ae25
director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20986
diff
changeset
|
300 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
|
301 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
|
302 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
|
303 return dir; |
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 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
|
307 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 struct user_directory *dir = *_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 *_dir = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 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
|
313 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 while (dir->head != NULL) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
315 user_free(dir, dir->head); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 hash_table_destroy(&dir->hash); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 array_free(&dir->iters); |
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
|
318 i_free(dir->username_hash_fmt); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 i_free(dir); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
322 struct user_directory_iter * |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
323 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
|
324 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 struct user_directory_iter *iter; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
326 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 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
|
328 iter->dir = dir; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 iter->pos = dir->head; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 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
|
331 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
|
332 return iter; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
333 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
334 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
335 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
|
336 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 struct user *user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 user = iter->pos; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 if (user == NULL) |
17398
552cab8feb5f
various - trivial NULL-related sparse cleanups
Phil Carmody <phil@dovecot.fi>
parents:
17130
diff
changeset
|
341 return NULL; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 iter->pos = user->next; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 return user; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 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
|
348 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
349 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
|
350 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
|
351 unsigned int i, count; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
352 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 *_iter = NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 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
|
356 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
|
357 if (iters[i] == iter) { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 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
|
359 break; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
362 i_free(iter); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
363 } |