Mercurial > dovecot > core-2.2
annotate src/director/mail-host.c @ 22633:9284bdc3c5c5
director: Don't recreate timeout on every user lookup
Recreate it only when the timeout should change.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sat, 04 Nov 2017 01:34:02 +0200 |
parents | 476eab310305 |
children | 7163028a9f90 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21082
diff
changeset
|
1 /* Copyright (c) 2010-2017 Dovecot authors, see the included COPYING file */ |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
5 #include "bsearch-insert-pos.h" |
19291
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
6 #include "crc32.h" |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
7 #include "md5.h" |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
8 #include "user-directory.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 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 #define VHOST_MULTIPLIER 100 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
13 struct mail_host_list { |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
14 ARRAY_TYPE(mail_tag) tags; |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
15 ARRAY_TYPE(mail_host) hosts; |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
16 user_free_hook_t *user_free_hook; |
19291
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
17 unsigned int hosts_hash; |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
18 unsigned int user_expire_secs; |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
19 bool consistent_hashing; |
19410
5168fdd5127e
director: Code cleanup - renamed hosts_unsorted to vhosts_unsorted
Timo Sirainen <tss@iki.fi>
parents:
19409
diff
changeset
|
20 bool vhosts_unsorted; |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
21 bool have_vhosts; |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
22 }; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 static int |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 mail_host_cmp(struct mail_host *const *h1, struct mail_host *const *h2) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 return net_ip_cmp(&(*h1)->ip, &(*h2)->ip); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
30 static int |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
31 mail_vhost_cmp(const struct mail_vhost *h1, const struct mail_vhost *h2) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
32 { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
33 if (h1->hash < h2->hash) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
34 return -1; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
35 else if (h1->hash > h2->hash) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
36 return 1; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
37 /* hash collision. not ideal, but we'll need to keep the order |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
38 consistent across directors so compare the IPs next. */ |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
39 return net_ip_cmp(&h1->host->ip, &h2->host->ip); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
40 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
41 |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
42 static int |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
43 mail_vhost_hash_cmp(const unsigned int *hash, const struct mail_vhost *vhost) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
44 { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
45 if (vhost->hash < *hash) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
46 return 1; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
47 else if (vhost->hash > *hash) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
48 return -1; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
49 else |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
50 return 0; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
51 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
52 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
53 static void mail_vhost_add(struct mail_tag *tag, struct mail_host *host) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 { |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
55 struct mail_vhost *vhost; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
56 struct md5_context md5_ctx, md5_ctx2; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
57 unsigned char md5[MD5_RESULTLEN]; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
58 const char *ip_str; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
59 char num_str[MAX_INT_STRLEN]; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
60 unsigned int i, j; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
61 |
19439
a36239ce0f78
director: Fixed recent tag reimplementation to actually work.
Timo Sirainen <tss@iki.fi>
parents:
19438
diff
changeset
|
62 if (host->down || host->tag != tag) |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
63 return; |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
64 |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
65 ip_str = net_ip2addr(&host->ip); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
66 |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
67 md5_init(&md5_ctx); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
68 md5_update(&md5_ctx, ip_str, strlen(ip_str)); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
69 |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
70 for (i = 0; i < host->vhost_count; i++) { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
71 md5_ctx2 = md5_ctx; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
72 i_snprintf(num_str, sizeof(num_str), "-%u", i); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
73 md5_update(&md5_ctx2, num_str, strlen(num_str)); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
74 md5_final(&md5_ctx2, md5); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
75 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
76 vhost = array_append_space(&tag->vhosts); |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
77 vhost->host = host; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
78 for (j = 0; j < sizeof(vhost->hash); j++) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
79 vhost->hash = (vhost->hash << CHAR_BIT) | md5[j]; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
80 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
81 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
82 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
83 static void |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
84 mail_tag_vhosts_sort_ring(struct mail_host_list *list, struct mail_tag *tag) |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
85 { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
86 struct mail_host *const *hostp; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
87 |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
88 /* rebuild vhosts */ |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
89 array_clear(&tag->vhosts); |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
90 array_foreach(&list->hosts, hostp) |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
91 mail_vhost_add(tag, *hostp); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
92 array_sort(&tag->vhosts, mail_vhost_cmp); |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
93 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
94 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
95 static void |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
96 mail_tag_vhosts_sort_direct(struct mail_host_list *list, struct mail_tag *tag) |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
97 { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
98 struct mail_vhost *vhost; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 struct mail_host *const *hostp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 unsigned int i; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 /* rebuild vhosts */ |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
103 array_clear(&tag->vhosts); |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
104 array_foreach(&list->hosts, hostp) { |
19439
a36239ce0f78
director: Fixed recent tag reimplementation to actually work.
Timo Sirainen <tss@iki.fi>
parents:
19438
diff
changeset
|
105 if ((*hostp)->down || (*hostp)->tag != tag) |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
106 continue; |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
107 for (i = 0; i < (*hostp)->vhost_count; i++) { |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
108 vhost = array_append_space(&tag->vhosts); |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
109 vhost->host = *hostp; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
110 } |
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 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
114 static void |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
115 mail_hosts_sort(struct mail_host_list *list) |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
116 { |
19291
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
117 struct mail_host *const *hostp; |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
118 struct mail_tag *const *tagp; |
19291
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
119 uint32_t num; |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
120 |
19406
63516762a64c
director: With director_consistent_hashing=yes hosts_hash wasn't always calculated right.
Timo Sirainen <tss@iki.fi>
parents:
19311
diff
changeset
|
121 array_sort(&list->hosts, mail_host_cmp); |
63516762a64c
director: With director_consistent_hashing=yes hosts_hash wasn't always calculated right.
Timo Sirainen <tss@iki.fi>
parents:
19311
diff
changeset
|
122 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
123 list->have_vhosts = FALSE; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
124 array_foreach(&list->tags, tagp) { |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
125 if (list->consistent_hashing) |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
126 mail_tag_vhosts_sort_ring(list, *tagp); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
127 else |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
128 mail_tag_vhosts_sort_direct(list, *tagp); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
129 if (array_count(&(*tagp)->vhosts) > 0) |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
130 list->have_vhosts = TRUE; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
131 } |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
132 list->vhosts_unsorted = FALSE; |
19291
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
133 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
134 /* recalculate the hosts_hash */ |
19291
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
135 list->hosts_hash = 0; |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
136 array_foreach(&list->hosts, hostp) { |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
137 num = ((*hostp)->down ? 1 : 0) ^ (*hostp)->vhost_count; |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
138 list->hosts_hash = crc32_data_more(list->hosts_hash, |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
139 &num, sizeof(num)); |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
140 num = net_ip_hash(&(*hostp)->ip); |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
141 list->hosts_hash = crc32_data_more(list->hosts_hash, |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
142 &num, sizeof(num)); |
19440
1c826c476dbb
director: Include tag also in the hosts_hash.
Timo Sirainen <tss@iki.fi>
parents:
19439
diff
changeset
|
143 list->hosts_hash = crc32_str_more(list->hosts_hash, |
1c826c476dbb
director: Include tag also in the hosts_hash.
Timo Sirainen <tss@iki.fi>
parents:
19439
diff
changeset
|
144 (*hostp)->tag->name); |
19291
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
145 } |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
146 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
147 |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
148 struct mail_tag * |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
149 mail_tag_find(struct mail_host_list *list, const char *tag_name) |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
150 { |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
151 struct mail_tag *const *tagp; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
152 |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
153 array_foreach(&list->tags, tagp) { |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
154 if (strcmp((*tagp)->name, tag_name) == 0) |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
155 return *tagp; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
156 } |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
157 return NULL; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
158 } |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
159 |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
160 static struct mail_tag * |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
161 mail_tag_get(struct mail_host_list *list, const char *tag_name) |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
162 { |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
163 struct mail_tag *tag; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
164 |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
165 tag = mail_tag_find(list, tag_name); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
166 if (tag == NULL) { |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
167 tag = i_new(struct mail_tag, 1); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
168 tag->name = i_strdup(tag_name); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
169 i_array_init(&tag->vhosts, 16*VHOST_MULTIPLIER); |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
170 tag->users = user_directory_init(list->user_expire_secs, |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
171 list->user_free_hook); |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
172 array_append(&list->tags, &tag, 1); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
173 } |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
174 return tag; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
175 } |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
176 |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
177 static void mail_tag_free(struct mail_tag *tag) |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
178 { |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
179 user_directory_deinit(&tag->users); |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
180 array_free(&tag->vhosts); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
181 i_free(tag->name); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
182 i_free(tag); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
183 } |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
184 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
185 struct mail_host * |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
186 mail_host_add_ip(struct mail_host_list *list, const struct ip_addr *ip, |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
187 const char *tag_name) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 struct mail_host *host; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
191 i_assert(tag_name != NULL); |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
192 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 host = i_new(struct mail_host, 1); |
19407
39cfca637d60
director: Code cleanup - make most mail_host_*() list parameters unnecessary.
Timo Sirainen <tss@iki.fi>
parents:
19406
diff
changeset
|
194 host->list = list; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 host->vhost_count = VHOST_MULTIPLIER; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 host->ip = *ip; |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
197 host->tag = mail_tag_get(list, tag_name); |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
198 array_append(&list->hosts, &host, 1); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 |
19410
5168fdd5127e
director: Code cleanup - renamed hosts_unsorted to vhosts_unsorted
Timo Sirainen <tss@iki.fi>
parents:
19409
diff
changeset
|
200 list->vhosts_unsorted = TRUE; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 return host; |
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 |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
204 struct mail_host * |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
205 mail_host_add_hostname(struct mail_host_list *list, const char *hostname, |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
206 const struct ip_addr *ip, const char *tag_name) |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
207 { |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
208 struct mail_host *host; |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
209 |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
210 host = mail_host_add_ip(list, ip, tag_name); |
19438
f643e85f42ec
director: Don't treat empty hostname the same as having it.
Timo Sirainen <tss@iki.fi>
parents:
19411
diff
changeset
|
211 if (hostname != NULL && hostname[0] != '\0') |
f643e85f42ec
director: Don't treat empty hostname the same as having it.
Timo Sirainen <tss@iki.fi>
parents:
19411
diff
changeset
|
212 host->hostname = i_strdup(hostname); |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
213 return host; |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
214 } |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
215 |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
216 static int |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
217 mail_host_add(struct mail_host_list *list, const char *hostname, |
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
218 const char *tag_name) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 { |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
220 struct ip_addr *ips, ip; |
11759
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
221 unsigned int i, ips_count; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
223 if (net_addr2ip(hostname, &ip) == 0) { |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
224 (void)mail_host_add_ip(list, &ip, tag_name); |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
225 return 0; |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
226 } |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
227 |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
228 if (net_gethostbyname(hostname, &ips, &ips_count) < 0) { |
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
229 i_error("Unknown mail host: %s", hostname); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 return -1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 |
11759
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
233 for (i = 0; i < ips_count; i++) |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
234 (void)mail_host_add_hostname(list, hostname, &ips[i], tag_name); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 return 0; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
238 static int |
11759
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
239 mail_hosts_add_range(struct mail_host_list *list, |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
240 struct ip_addr ip1, struct ip_addr ip2, |
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
241 const char *tag_name) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 { |
11570
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
243 uint32_t *ip1_arr, *ip2_arr; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
244 uint32_t i1, i2; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
245 unsigned int i, j, max_bits, last_bits; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 |
11570
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
247 if (ip1.family != ip2.family) { |
11759
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
248 i_error("IP address family mismatch: %s vs %s", |
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
249 net_ip2addr(&ip1), net_ip2addr(&ip2)); |
11570
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
250 return -1; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
251 } |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
252 if (net_ip_cmp(&ip1, &ip2) > 0) { |
11759
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
253 i_error("IP addresses reversed: %s-%s", |
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
254 net_ip2addr(&ip1), net_ip2addr(&ip2)); |
11570
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
255 return -1; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
256 } |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
257 if (IPADDR_IS_V4(&ip1)) { |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
258 ip1_arr = &ip1.u.ip4.s_addr; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
259 ip2_arr = &ip2.u.ip4.s_addr; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
260 max_bits = 32; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
261 last_bits = 8; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
262 } else { |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
263 #ifndef HAVE_IPV6 |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
264 i_error("IPv6 not supported"); |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
265 return -1; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
266 #else |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
267 ip1_arr = (void *)&ip1.u.ip6; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
268 ip2_arr = (void *)&ip2.u.ip6; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
269 max_bits = 128; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
270 last_bits = 16; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
271 #endif |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
272 } |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 |
11570
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
274 /* make sure initial bits match */ |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
275 for (i = 0; i < (max_bits-last_bits)/32; i++) { |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
276 if (ip1_arr[i] != ip2_arr[i]) { |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
277 i_error("IP address range too large: %s-%s", |
11759
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
278 net_ip2addr(&ip1), net_ip2addr(&ip2)); |
11570
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
279 return -1; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
280 } |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
281 } |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
282 i1 = htonl(ip1_arr[i]); |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
283 i2 = htonl(ip2_arr[i]); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 |
11570
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
285 for (j = last_bits; j < 32; j++) { |
14669
6411d91d0755
Fixed signed integer shift overflows.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
286 if ((i1 & (1U << j)) != (i2 & (1U << j))) { |
11570
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
287 i_error("IP address range too large: %s-%s", |
11759
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
288 net_ip2addr(&ip1), net_ip2addr(&ip2)); |
11570
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
289 return -1; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
290 } |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
291 } |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
292 |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
293 /* create hosts from the final bits */ |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
294 do { |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
295 ip1_arr[i] = ntohl(i1); |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
296 (void)mail_host_add_ip(list, &ip1, tag_name); |
11570
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
297 i1++; |
870cd20ada71
director: director_mail_servers setting now allows ip1-ip2 ranges.
Timo Sirainen <tss@iki.fi>
parents:
11353
diff
changeset
|
298 } while (ip1_arr[i] != ip2_arr[i]); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 return 0; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
302 int mail_hosts_parse_and_add(struct mail_host_list *list, |
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
303 const char *hosts_string) |
11321
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 int ret = 0; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 T_BEGIN { |
11759
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
308 const char *const *tmp, *p, *host1, *host2; |
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
309 struct ip_addr ip1, ip2; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
311 tmp = t_strsplit_spaces(hosts_string, " "); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 for (; *tmp != NULL; tmp++) { |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
313 const char *tag, *value = *tmp; |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
314 |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
315 p = strchr(value, '@'); |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
316 if (p == NULL) |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
317 tag = ""; |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
318 else { |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
319 value = t_strdup_until(value, p++); |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
320 tag = p; |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
321 } |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
322 p = strchr(value, '-'); |
11759
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
323 if (p != NULL) { |
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
324 /* see if this is ip1-ip2 range */ |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
325 host1 = t_strdup_until(value, p); |
11759
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
326 host2 = p + 1; |
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
327 if (net_addr2ip(host1, &ip1) == 0 && |
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
328 net_addr2ip(host2, &ip2) == 0) { |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
329 if (mail_hosts_add_range(list, ip1, ip2, |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
330 tag) < 0) |
11759
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
331 ret = -1; |
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
332 continue; |
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
333 } |
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
334 } |
065c414a5c07
director: director_mail_servers setting can now contain host names.
Timo Sirainen <tss@iki.fi>
parents:
11585
diff
changeset
|
335 |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
336 if (mail_host_add(list, value, tag) < 0) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 ret = -1; |
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 } T_END; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
340 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
341 if (array_count(&list->hosts) == 0) { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 if (ret < 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 i_error("No valid servers specified"); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 else |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 i_error("Empty server list"); |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
346 ret = -1; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
347 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
348 return ret; |
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 |
21072
f670c77eafcb
director: const mail_host in mail_host_get_tag
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
19552
diff
changeset
|
351 const char *mail_host_get_tag(const struct mail_host *host) |
19408
7e47f561ad49
director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents:
19407
diff
changeset
|
352 { |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
353 return host->tag->name; |
19408
7e47f561ad49
director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents:
19407
diff
changeset
|
354 } |
7e47f561ad49
director: Code cleanup - access host->tag via mail_host_get_tag()
Timo Sirainen <tss@iki.fi>
parents:
19407
diff
changeset
|
355 |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
356 void mail_host_set_tag(struct mail_host *host, const char *tag_name) |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
357 { |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
358 i_assert(tag_name != NULL); |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
359 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
360 host->tag = mail_tag_get(host->list, tag_name); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
361 host->list->vhosts_unsorted = TRUE; |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
362 } |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
363 |
21842
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
364 void mail_host_set_down(struct mail_host *host, bool down, |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
365 time_t timestamp, const char *log_prefix) |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
366 { |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
367 if (host->down != down) { |
21842
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
368 const char *updown = down ? "down" : "up"; |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
369 i_info("%sHost %s changed %s " |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
370 "(vhost_count=%u last_updown_change=%ld)", |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
371 log_prefix, net_ip2addr(&host->ip), updown, |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
372 host->vhost_count, (long)host->last_updown_change); |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
373 |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
374 host->down = down; |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
375 host->last_updown_change = timestamp; |
19410
5168fdd5127e
director: Code cleanup - renamed hosts_unsorted to vhosts_unsorted
Timo Sirainen <tss@iki.fi>
parents:
19409
diff
changeset
|
376 host->list->vhosts_unsorted = TRUE; |
18729
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
377 } |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
378 } |
0ee3e734249a
director: Added "up" vs "down" states and doveadm director up/down commands.
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
379 |
21842
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
380 void mail_host_set_vhost_count(struct mail_host *host, unsigned int vhost_count, |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
381 const char *log_prefix) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
382 { |
21842
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
383 i_info("%sHost %s vhost count changed from %u to %u", |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
384 log_prefix, net_ip2addr(&host->ip), |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
385 host->vhost_count, vhost_count); |
86e52ff70044
director: Log vhost count changes and HOST-UP/DOWN
Martti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
parents:
21390
diff
changeset
|
386 |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 host->vhost_count = vhost_count; |
19410
5168fdd5127e
director: Code cleanup - renamed hosts_unsorted to vhosts_unsorted
Timo Sirainen <tss@iki.fi>
parents:
19409
diff
changeset
|
388 host->list->vhosts_unsorted = TRUE; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
389 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
390 |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
391 static void mail_host_free(struct mail_host *host) |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
392 { |
19310
7f718c840aff
director: Remember backends' hostnames and send them in login reply.
Timo Sirainen <tss@iki.fi>
parents:
19291
diff
changeset
|
393 i_free(host->hostname); |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
394 i_free(host); |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
395 } |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
396 |
19407
39cfca637d60
director: Code cleanup - make most mail_host_*() list parameters unnecessary.
Timo Sirainen <tss@iki.fi>
parents:
19406
diff
changeset
|
397 void mail_host_remove(struct mail_host *host) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
398 { |
19407
39cfca637d60
director: Code cleanup - make most mail_host_*() list parameters unnecessary.
Timo Sirainen <tss@iki.fi>
parents:
19406
diff
changeset
|
399 struct mail_host_list *list = host->list; |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
400 struct mail_host *const *hosts; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
401 unsigned int i, count; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
402 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
403 hosts = array_get(&list->hosts, &count); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
404 for (i = 0; i < count; i++) { |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
405 if (hosts[i] == host) { |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
406 array_delete(&host->list->hosts, i, 1); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
407 break; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
408 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 } |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
410 mail_host_free(host); |
19410
5168fdd5127e
director: Code cleanup - renamed hosts_unsorted to vhosts_unsorted
Timo Sirainen <tss@iki.fi>
parents:
19409
diff
changeset
|
411 list->vhosts_unsorted = TRUE; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
412 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
413 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
414 struct mail_host * |
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
415 mail_host_lookup(struct mail_host_list *list, const struct ip_addr *ip) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
416 { |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 struct mail_host *const *hostp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 |
19410
5168fdd5127e
director: Code cleanup - renamed hosts_unsorted to vhosts_unsorted
Timo Sirainen <tss@iki.fi>
parents:
19409
diff
changeset
|
419 if (list->vhosts_unsorted) |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
420 mail_hosts_sort(list); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
421 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
422 array_foreach(&list->hosts, hostp) { |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
423 if (net_ip_compare(&(*hostp)->ip, ip)) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
424 return *hostp; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
425 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 return NULL; |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
429 static struct mail_host * |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
430 mail_host_get_by_hash_ring(struct mail_tag *tag, unsigned int hash) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
431 { |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
432 const struct mail_vhost *vhosts; |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
433 unsigned int count, idx; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
434 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
435 vhosts = array_get(&tag->vhosts, &count); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
436 array_bsearch_insert_pos(&tag->vhosts, &hash, |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
437 mail_vhost_hash_cmp, &idx); |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
438 i_assert(idx <= count); |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
439 if (idx == count) { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
440 if (count == 0) |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
441 return NULL; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
442 idx = 0; |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
443 } |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
444 return vhosts[idx % count].host; |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
445 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
446 |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
447 static struct mail_host * |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
448 mail_host_get_by_hash_direct(struct mail_tag *tag, unsigned int hash) |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
449 { |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
450 const struct mail_vhost *vhosts; |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
451 unsigned int count; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
452 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
453 vhosts = array_get(&tag->vhosts, &count); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
454 if (count == 0) |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
455 return NULL; |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
456 return vhosts[hash % count].host; |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
457 } |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
458 |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
459 struct mail_host * |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
460 mail_host_get_by_hash(struct mail_host_list *list, unsigned int hash, |
19409
11a913488054
director: Code cleanup - rename tag to tag_name in mail_host_*() parameters.
Timo Sirainen <tss@iki.fi>
parents:
19408
diff
changeset
|
461 const char *tag_name) |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
462 { |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
463 struct mail_tag *tag; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
464 |
19410
5168fdd5127e
director: Code cleanup - renamed hosts_unsorted to vhosts_unsorted
Timo Sirainen <tss@iki.fi>
parents:
19409
diff
changeset
|
465 if (list->vhosts_unsorted) |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
466 mail_hosts_sort(list); |
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
467 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
468 tag = mail_tag_find(list, tag_name); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
469 if (tag == NULL) |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
470 return NULL; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
471 |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
472 if (list->consistent_hashing) |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
473 return mail_host_get_by_hash_ring(tag, hash); |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
474 else |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
475 return mail_host_get_by_hash_direct(tag, hash); |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
476 } |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
477 |
19287
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
18729
diff
changeset
|
478 void mail_hosts_set_synced(struct mail_host_list *list) |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
18729
diff
changeset
|
479 { |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
18729
diff
changeset
|
480 struct mail_host *const *hostp; |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
18729
diff
changeset
|
481 |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
18729
diff
changeset
|
482 array_foreach(&list->hosts, hostp) |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
18729
diff
changeset
|
483 (*hostp)->desynced = FALSE; |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
18729
diff
changeset
|
484 } |
0f9d4f1a083d
director: Don't become desynced if two directors change the same backend in incompatible ways.
Timo Sirainen <tss@iki.fi>
parents:
18729
diff
changeset
|
485 |
19291
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
486 unsigned int mail_hosts_hash(struct mail_host_list *list) |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
487 { |
19410
5168fdd5127e
director: Code cleanup - renamed hosts_unsorted to vhosts_unsorted
Timo Sirainen <tss@iki.fi>
parents:
19409
diff
changeset
|
488 if (list->vhosts_unsorted) |
19291
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
489 mail_hosts_sort(list); |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
490 /* don't retun 0 as hash, since we're using it as "doesn't exist" in |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
491 some places. */ |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
492 return list->hosts_hash == 0 ? 1 : list->hosts_hash; |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
493 } |
eb9b9519db7a
director: Added mail_hosts_hash(), which identifies the current mail_hosts configuration.
Timo Sirainen <tss@iki.fi>
parents:
19287
diff
changeset
|
494 |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
495 bool mail_hosts_have_usable(struct mail_host_list *list) |
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
496 { |
19410
5168fdd5127e
director: Code cleanup - renamed hosts_unsorted to vhosts_unsorted
Timo Sirainen <tss@iki.fi>
parents:
19409
diff
changeset
|
497 if (list->vhosts_unsorted) |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
498 mail_hosts_sort(list); |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
499 return list->have_vhosts; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
500 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
501 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
502 const ARRAY_TYPE(mail_host) *mail_hosts_get(struct mail_host_list *list) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
503 { |
19410
5168fdd5127e
director: Code cleanup - renamed hosts_unsorted to vhosts_unsorted
Timo Sirainen <tss@iki.fi>
parents:
19409
diff
changeset
|
504 if (list->vhosts_unsorted) |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
505 mail_hosts_sort(list); |
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
506 return &list->hosts; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
507 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
508 |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
509 bool mail_hosts_have_tags(struct mail_host_list *list) |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
510 { |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
511 struct mail_tag *const *tagp; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
512 |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
513 if (list->vhosts_unsorted) |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
514 mail_hosts_sort(list); |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
515 |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
516 array_foreach(&list->tags, tagp) { |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
517 if ((*tagp)->name[0] != '\0' && array_count(&(*tagp)->vhosts) > 0) |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
518 return TRUE; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
519 } |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
520 return FALSE; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
521 } |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
522 |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
523 const ARRAY_TYPE(mail_tag) *mail_hosts_get_tags(struct mail_host_list *list) |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
524 { |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
525 return &list->tags; |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
526 } |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
527 |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
528 struct mail_host_list * |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
529 mail_hosts_init(unsigned int user_expire_secs, bool consistent_hashing, |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
530 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
|
531 { |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
532 struct mail_host_list *list; |
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
533 |
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
534 list = i_new(struct mail_host_list, 1); |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
535 list->user_expire_secs = user_expire_secs; |
18065
b9df3d654710
director: Added director_consistent_hashing setting.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
536 list->consistent_hashing = consistent_hashing; |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
537 list->user_free_hook = user_free_hook; |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
538 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
539 i_array_init(&list->hosts, 16); |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
540 i_array_init(&list->tags, 4); |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
541 return list; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
542 } |
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
543 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
544 void mail_hosts_deinit(struct mail_host_list **_list) |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
545 { |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
546 struct mail_host_list *list = *_list; |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
547 struct mail_host *const *hostp; |
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
548 struct mail_tag *const *tagp; |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
549 |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
550 *_list = NULL; |
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
551 |
21082
565ca26ee41c
director: Don't access freed memory during deinit
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21079
diff
changeset
|
552 array_foreach(&list->tags, tagp) |
565ca26ee41c
director: Don't access freed memory during deinit
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21079
diff
changeset
|
553 mail_tag_free(*tagp); |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
554 array_foreach(&list->hosts, hostp) |
18067
a7e830b9b967
director: Added support for backend cluster "tags".
Timo Sirainen <tss@iki.fi>
parents:
18065
diff
changeset
|
555 mail_host_free(*hostp); |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
556 array_free(&list->hosts); |
19411
0e05efd14b39
director: Fixed backend selection when multiple tags were used.
Timo Sirainen <tss@iki.fi>
parents:
19410
diff
changeset
|
557 array_free(&list->tags); |
11352
19336bddada2
director: Code cleanup - keep mail hosts in a struct rather than in static variables.
Timo Sirainen <tss@iki.fi>
parents:
11321
diff
changeset
|
558 i_free(list); |
11321
5f350b5ff6d9
Added initial implementation of a director process (for NFS users).
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
559 } |
11353
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
560 |
21882
476eab310305
director: Fix mail_hosts_dup() to duplicate tags correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
561 static struct mail_host * |
476eab310305
director: Fix mail_hosts_dup() to duplicate tags correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
562 mail_host_dup(struct mail_host_list *dest_list, const struct mail_host *src) |
11353
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
563 { |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
564 struct mail_host *dest; |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
565 |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
566 dest = i_new(struct mail_host, 1); |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
567 *dest = *src; |
21882
476eab310305
director: Fix mail_hosts_dup() to duplicate tags correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
568 dest->tag = mail_tag_get(dest_list, src->tag->name); |
19311
5876ca2d63fb
director: Fix to previous change - mail_host_dup() wasn't strdup()ing hostname.
Timo Sirainen <tss@iki.fi>
parents:
19310
diff
changeset
|
569 dest->hostname = i_strdup(src->hostname); |
11353
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
570 return dest; |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
571 } |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
572 |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
573 struct mail_host_list *mail_hosts_dup(const struct mail_host_list *src) |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
574 { |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
575 struct mail_host_list *dest; |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
576 struct mail_host *const *hostp, *dest_host; |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
577 |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
578 dest = mail_hosts_init(src->user_expire_secs, src->consistent_hashing, |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
579 src->user_free_hook); |
11353
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
580 array_foreach(&src->hosts, hostp) { |
21882
476eab310305
director: Fix mail_hosts_dup() to duplicate tags correctly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21842
diff
changeset
|
581 dest_host = mail_host_dup(dest, *hostp); |
11353
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
582 array_append(&dest->hosts, &dest_host, 1); |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
583 } |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
584 mail_hosts_sort(dest); |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
585 return dest; |
1bc3d5589c5a
doveadm director status user: Show more ways of what user's potential hosts are.
Timo Sirainen <tss@iki.fi>
parents:
11352
diff
changeset
|
586 } |
21079
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
587 |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
588 void mail_hosts_sort_users(struct mail_host_list *list) |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
589 { |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
590 struct mail_tag *const *tagp; |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
591 |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
592 array_foreach(&list->tags, tagp) |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
593 user_directory_sort((*tagp)->users); |
d6f399a7f672
director: Keep per-tag directory
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
21072
diff
changeset
|
594 } |