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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }