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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
e5730fb45680 director: Minor code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 11334
diff changeset
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
c3901ac774cb Make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents: 16621
diff changeset
254 i_assert(dir->head != NULL &&
c3901ac774cb Make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents: 16621
diff changeset
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
5b05411a81cf Compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents: 14310
diff changeset
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
d6d59ff58511 Compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents: 11321
diff changeset
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 }