annotate src/director/user-directory.c @ 21078:6d37f4dd198d

director: Code cleanup - typedef user_free_hook This is done because user_free_hook needs to be also used in mail_host. If it changes, this reduces the places that need touching.
author Aki Tuomi <aki.tuomi@dovecot.fi>
date Tue, 01 Nov 2016 14:36:19 +0200
parents b2418f9c5a54
children 2e2563132d5f
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"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "mail-host.h"
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9
14310
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
10 /* n% of timeout_secs */
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
11 #define USER_NEAR_EXPIRING_PERCENTAGE 10
16617
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
12 /* but min/max. of this many secs */
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
13 #define USER_NEAR_EXPIRING_MIN 3
14310
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
14 #define USER_NEAR_EXPIRING_MAX 30
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 struct user_directory_iter {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 struct user_directory *dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 struct user *pos;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 };
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 struct user_directory {
14923
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
22 /* unsigned int username_hash => user */
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
23 HASH_TABLE(void *, struct user *) hash;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 /* sorted by time */
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 struct user *head, *tail;
14468
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
26 struct user *prev_insert_pos;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
28 ARRAY(struct user_directory_iter *) iters;
21078
6d37f4dd198d director: Code cleanup - typedef user_free_hook
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21077
diff changeset
29 user_free_hook_t *user_free_hook;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 unsigned int timeout_secs;
14310
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
32 /* If user's expire time is less than this many seconds away,
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
33 don't assume that other directors haven't yet expired it */
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
34 unsigned int user_near_expiring_secs;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 };
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 static void user_move_iters(struct user_directory *dir, struct user *user)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 struct user_directory_iter *const *iterp;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 array_foreach(&dir->iters, iterp) {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 if ((*iterp)->pos == user)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 (*iterp)->pos = user->next;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 }
14468
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
45
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
46 if (dir->prev_insert_pos == user)
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
47 dir->prev_insert_pos = user->next;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 static void user_free(struct user_directory *dir, struct user *user)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 i_assert(user->host->user_count > 0);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 user->host->user_count--;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
20988
9d4039e2ae25 director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20986
diff changeset
55 if (dir->user_free_hook != NULL)
9d4039e2ae25 director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20986
diff changeset
56 dir->user_free_hook(user);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 user_move_iters(dir, user);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 hash_table_remove(dir->hash, POINTER_CAST(user->username_hash));
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 DLLIST2_REMOVE(&dir->head, &dir->tail, user);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 i_free(user);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
14310
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
64 static bool user_directory_user_has_connections(struct user_directory *dir,
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
65 struct user *user)
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
66 {
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
67 time_t expire_timestamp = user->timestamp + dir->timeout_secs;
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
68
16617
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
69 if (expire_timestamp > ioloop_time)
15323
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
70 return TRUE;
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
71
20986
410eacd7ad40 director: Code cleanup - added USER_IS_BEING_KILLED() macro
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20985
diff changeset
72 if (USER_IS_BEING_KILLED(user)) {
15323
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
73 /* don't free this user until the kill is finished */
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
74 return TRUE;
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
75 }
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
76
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
77 if (user->weak) {
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
78 if (expire_timestamp + USER_NEAR_EXPIRING_MAX >= ioloop_time)
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
79 return TRUE;
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
80
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
81 i_warning("User %u weakness appears to be stuck, removing it",
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
82 user->username_hash);
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
83 }
7352d48b4071 director: If user's weak-flag appears to have gotten stuck, unset it.
Timo Sirainen <tss@iki.fi>
parents: 14487
diff changeset
84 return FALSE;
14310
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
85 }
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
86
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 static void user_directory_drop_expired(struct user_directory *dir)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 while (dir->head != NULL &&
11599
e5730fb45680 director: Minor code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 11334
diff changeset
90 !user_directory_user_has_connections(dir, dir->head))
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 user_free(dir, dir->head);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93
18664
502755a1af5f director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
94 unsigned int user_directory_count(struct user_directory *dir)
502755a1af5f director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
95 {
502755a1af5f director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
96 return hash_table_count(dir->hash);
502755a1af5f director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
97 }
502755a1af5f director: Include useful statistics in process title.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
98
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 struct user *user_directory_lookup(struct user_directory *dir,
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 unsigned int username_hash)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 {
16617
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
102 struct user *user;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103
16617
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
104 user_directory_drop_expired(dir);
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
105 user = hash_table_lookup(dir->hash, POINTER_CAST(username_hash));
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
106 if (user != NULL && !user_directory_user_has_connections(dir, user)) {
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
107 user_free(dir, user);
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
108 user = NULL;
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
109 }
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
110 return user;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112
14468
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
113 static void
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
114 user_directory_insert_backwards(struct user_directory *dir,
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
115 struct user *pos, struct user *user)
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
116 {
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
117 for (; pos != NULL; pos = pos->prev) {
15080
e708a1d691d3 Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents: 14923
diff changeset
118 if (pos->timestamp <= user->timestamp)
14468
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
119 break;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
120 }
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
121 if (pos == NULL)
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
122 DLLIST2_PREPEND(&dir->head, &dir->tail, user);
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
123 else {
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
124 user->prev = pos;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
125 user->next = pos->next;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
126 user->prev->next = user;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
127 if (user->next != NULL)
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
128 user->next->prev = user;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
129 else
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
130 dir->tail = user;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
131 }
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
132 }
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
133
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
134 static void
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
135 user_directory_insert_forwards(struct user_directory *dir,
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
136 struct user *pos, struct user *user)
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
137 {
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
138 for (; pos != NULL; pos = pos->next) {
15080
e708a1d691d3 Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents: 14923
diff changeset
139 if (pos->timestamp >= user->timestamp)
14468
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
140 break;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
141 }
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
142 if (pos == NULL)
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
143 DLLIST2_APPEND(&dir->head, &dir->tail, user);
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
144 else {
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
145 user->prev = pos->prev;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
146 user->next = pos;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
147 if (user->prev != NULL)
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
148 user->prev->next = user;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
149 else
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
150 dir->head = user;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
151 user->next->prev = user;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
152 }
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
153 }
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
154
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 struct user *
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 user_directory_add(struct user_directory *dir, unsigned int username_hash,
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 struct mail_host *host, time_t timestamp)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 {
14468
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
159 struct user *user;
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
160
14487
45be27ff3414 director: Removed special (time_t)-1 code, it's not actually needed.
Timo Sirainen <tss@iki.fi>
parents: 14469
diff changeset
161 /* make sure we don't add timestamps higher than ioloop time */
45be27ff3414 director: Removed special (time_t)-1 code, it's not actually needed.
Timo Sirainen <tss@iki.fi>
parents: 14469
diff changeset
162 if (timestamp > ioloop_time)
14468
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
163 timestamp = ioloop_time;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 user = i_new(struct user, 1);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 user->username_hash = username_hash;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 user->host = host;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 user->host->user_count++;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 user->timestamp = timestamp;
13018
dab7043e8263 director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
170
13030
d9d5759196ee Compiler warning fix on 32bit systems.
Timo Sirainen <tss@iki.fi>
parents: 13018
diff changeset
171 if (dir->tail == NULL || (time_t)dir->tail->timestamp <= timestamp)
13018
dab7043e8263 director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
172 DLLIST2_APPEND(&dir->head, &dir->tail, user);
dab7043e8263 director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
173 else {
14468
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
174 /* need to insert to correct position. we should get here
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
175 only when handshaking. the handshaking USER requests should
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
176 come sorted by timestamp. so keep track of the previous
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
177 insert position, the next USER should be inserted after
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
178 it. */
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
179 if (dir->prev_insert_pos == NULL) {
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
180 /* find the position starting from tail */
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
181 user_directory_insert_backwards(dir, dir->tail, user);
15080
e708a1d691d3 Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents: 14923
diff changeset
182 } else if (timestamp < (time_t)dir->prev_insert_pos->timestamp) {
14468
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
183 user_directory_insert_backwards(dir, dir->prev_insert_pos,
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
184 user);
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
185 } else {
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
186 user_directory_insert_forwards(dir, dir->prev_insert_pos,
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
187 user);
13018
dab7043e8263 director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
188 }
dab7043e8263 director: Avoid potential problems by making sure users list is always sorted by timestamp.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
189 }
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190
14468
0b4295b48941 director: Optimized adding users to linked list during handshake.
Timo Sirainen <tss@iki.fi>
parents: 14355
diff changeset
191 dir->prev_insert_pos = user;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 hash_table_insert(dir->hash, POINTER_CAST(user->username_hash), user);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 return user;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 void user_directory_refresh(struct user_directory *dir, struct user *user)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 user_move_iters(dir, user);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 user->timestamp = ioloop_time;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 DLLIST2_REMOVE(&dir->head, &dir->tail, user);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 DLLIST2_APPEND(&dir->head, &dir->tail, user);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 void user_directory_remove_host(struct user_directory *dir,
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 struct mail_host *host)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 struct user *user, *next;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 for (user = dir->head; user != NULL; user = next) {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 next = user->next;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 if (user->host == host)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 user_free(dir, user);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217
16621
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
218 static int user_timestamp_cmp(struct user *const *user1,
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
219 struct user *const *user2)
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
220 {
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
221 if ((*user1)->timestamp < (*user2)->timestamp)
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
222 return -1;
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
223 if ((*user1)->timestamp > (*user2)->timestamp)
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
224 return 1;
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
225 return 0;
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
226 }
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
227
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
228 void user_directory_sort(struct user_directory *dir)
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
229 {
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
230 ARRAY(struct user *) users;
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
231 struct user *user, *const *userp;
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
232 unsigned int i, users_count = hash_table_count(dir->hash);
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
233
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
234 if (users_count == 0) {
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
235 i_assert(dir->head == NULL);
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
236 return;
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
237 }
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
238
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
239 /* place all users into array and sort it */
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
240 i_array_init(&users, users_count);
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
241 user = dir->head;
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
242 for (i = 0; i < users_count; i++, user = user->next)
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
243 array_append(&users, &user, 1);
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
244 i_assert(user == NULL);
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
245 array_sort(&users, user_timestamp_cmp);
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
246
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
247 /* recreate the linked list */
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
248 dir->head = dir->tail = NULL;
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
249 array_foreach(&users, userp)
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
250 DLLIST2_APPEND(&dir->head, &dir->tail, *userp);
16658
c3901ac774cb Make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents: 16621
diff changeset
251 i_assert(dir->head != NULL &&
c3901ac774cb Make static analyzer happier.
Timo Sirainen <tss@iki.fi>
parents: 16621
diff changeset
252 dir->head->timestamp <= dir->tail->timestamp);
16621
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
253 array_free(&users);
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
254 }
5ef62caea61b director: Update existing users' timestamps during handshake.
Timo Sirainen <tss@iki.fi>
parents: 16617
diff changeset
255
14310
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
256 bool user_directory_user_is_recently_updated(struct user_directory *dir,
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
257 struct user *user)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 {
14355
5b05411a81cf Compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents: 14310
diff changeset
259 return (time_t)(user->timestamp + dir->timeout_secs/2) >= ioloop_time;
14310
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
260 }
11334
d6d59ff58511 Compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents: 11321
diff changeset
261
14310
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
262 bool user_directory_user_is_near_expiring(struct user_directory *dir,
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
263 struct user *user)
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
264 {
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
265 time_t expire_timestamp;
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
266
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
267 expire_timestamp = user->timestamp +
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
268 (dir->timeout_secs - dir->user_near_expiring_secs);
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
269 return expire_timestamp < ioloop_time;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271
14292
817ef4c9f1f3 Added director_username_hash setting to specify what part of the username is hashed.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
272 struct user_directory *
21076
ef9d8f4c6c67 director: Code cleanup - moved username_hash generation to director.h
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20988
diff changeset
273 user_directory_init(unsigned int timeout_secs,
21078
6d37f4dd198d director: Code cleanup - typedef user_free_hook
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21077
diff changeset
274 user_free_hook_t *user_free_hook)
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 struct user_directory *dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277
16617
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
278 i_assert(timeout_secs > USER_NEAR_EXPIRING_MIN);
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
279
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 dir = i_new(struct user_directory, 1);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 dir->timeout_secs = timeout_secs;
14310
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
282 dir->user_near_expiring_secs =
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
283 timeout_secs * USER_NEAR_EXPIRING_PERCENTAGE / 100;
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
284 dir->user_near_expiring_secs =
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
285 I_MIN(dir->user_near_expiring_secs, USER_NEAR_EXPIRING_MAX);
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
286 dir->user_near_expiring_secs =
16617
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
287 I_MAX(dir->user_near_expiring_secs, USER_NEAR_EXPIRING_MIN);
0e0eb964685a director: Expire users a bit more correctly.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
288 i_assert(dir->timeout_secs/2 > dir->user_near_expiring_secs);
14310
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
289
20988
9d4039e2ae25 director: Moved all user killing state to struct director_kill_context
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20986
diff changeset
290 dir->user_free_hook = user_free_hook;
14918
8eae4e205c82 Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents: 14917
diff changeset
291 hash_table_create_direct(&dir->hash, default_pool, 0);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 i_array_init(&dir->iters, 8);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 return dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 void user_directory_deinit(struct user_directory **_dir)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 struct user_directory *dir = *_dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 *_dir = NULL;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 i_assert(array_count(&dir->iters) == 0);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 while (dir->head != NULL)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 user_free(dir, dir->head);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 hash_table_destroy(&dir->hash);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 array_free(&dir->iters);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 i_free(dir);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 struct user_directory_iter *
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 user_directory_iter_init(struct user_directory *dir)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 struct user_directory_iter *iter;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 iter = i_new(struct user_directory_iter, 1);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 iter->dir = dir;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 iter->pos = dir->head;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 array_append(&dir->iters, &iter, 1);
14310
7a26c427fc78 director: Avoid user getting redirected to different servers near its expiration.
Timo Sirainen <tss@iki.fi>
parents: 14292
diff changeset
320 user_directory_drop_expired(dir);
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 return iter;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 struct user *user_directory_iter_next(struct user_directory_iter *iter)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 struct user *user;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 user = iter->pos;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 if (user == NULL)
17398
552cab8feb5f various - trivial NULL-related sparse cleanups
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
330 return NULL;
11321
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 iter->pos = user->next;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 return user;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 void user_directory_iter_deinit(struct user_directory_iter **_iter)
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 struct user_directory_iter *iter = *_iter;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 struct user_directory_iter *const *iters;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 unsigned int i, count;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 *_iter = NULL;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 iters = array_get(&iter->dir->iters, &count);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 for (i = 0; i < count; i++) {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 if (iters[i] == iter) {
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 array_delete(&iter->dir->iters, i, 1);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 break;
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 }
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 i_free(iter);
5f350b5ff6d9 Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 }