Mercurial > dovecot > core-2.2
annotate src/dsync/dsync-brain.c @ 10373:036db604f86c HEAD
dsync: Fixed problems with syncing mailbox names that are invalid on other side.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 19 Nov 2009 17:28:48 -0500 |
parents | b99a19d5a93c |
children | eba3e50fef36 |
rev | line source |
---|---|
9559 | 1 /* Copyright (c) 2009 Dovecot authors, see the included COPYING file */ |
2 | |
3 #include "lib.h" | |
4 #include "array.h" | |
5 #include "hash.h" | |
6 #include "master-service.h" | |
7 #include "dsync-worker.h" | |
8 #include "dsync-brain-private.h" | |
9 | |
10 static void | |
11 dsync_brain_mailbox_list_deinit(struct dsync_brain_mailbox_list **list); | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
12 static void |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
13 dsync_brain_subs_list_deinit(struct dsync_brain_subs_list **list); |
9559 | 14 |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
15 struct dsync_brain * |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
16 dsync_brain_init(struct dsync_worker *src_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
17 struct dsync_worker *dest_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
18 const char *mailbox, enum dsync_brain_flags flags) |
9559 | 19 { |
20 struct dsync_brain *brain; | |
21 | |
22 brain = i_new(struct dsync_brain, 1); | |
23 brain->src_worker = src_worker; | |
24 brain->dest_worker = dest_worker; | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
25 brain->mailbox = i_strdup(mailbox); |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
26 brain->flags = flags; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
27 brain->verbose = (flags & DSYNC_BRAIN_FLAG_VERBOSE) != 0; |
9559 | 28 return brain; |
29 } | |
30 | |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
31 void dsync_brain_fail(struct dsync_brain *brain) |
9559 | 32 { |
33 brain->failed = TRUE; | |
34 master_service_stop(master_service); | |
35 } | |
36 | |
37 int dsync_brain_deinit(struct dsync_brain **_brain) | |
38 { | |
39 struct dsync_brain *brain = *_brain; | |
40 int ret = brain->failed ? -1 : 0; | |
41 | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
42 if (brain->state != DSYNC_STATE_SYNC_END) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
43 ret = -1; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
44 |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
45 if (ret < 0) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
46 /* make sure we unreference save input streams before workers |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
47 are deinitialized, so they can destroy the streams */ |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
48 dsync_worker_msg_save_cancel(brain->src_worker); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
49 dsync_worker_msg_save_cancel(brain->dest_worker); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
50 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
51 |
9559 | 52 if (brain->mailbox_sync != NULL) |
53 dsync_brain_msg_sync_deinit(&brain->mailbox_sync); | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
54 |
9559 | 55 if (brain->src_mailbox_list != NULL) |
56 dsync_brain_mailbox_list_deinit(&brain->src_mailbox_list); | |
57 if (brain->dest_mailbox_list != NULL) | |
58 dsync_brain_mailbox_list_deinit(&brain->dest_mailbox_list); | |
59 | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
60 if (brain->src_subs_list != NULL) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
61 dsync_brain_subs_list_deinit(&brain->src_subs_list); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
62 if (brain->dest_subs_list != NULL) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
63 dsync_brain_subs_list_deinit(&brain->dest_subs_list); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
64 |
9559 | 65 *_brain = NULL; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
66 i_free(brain->mailbox); |
9559 | 67 i_free(brain); |
68 return ret; | |
69 } | |
70 | |
71 static void dsync_brain_mailbox_list_finished(struct dsync_brain *brain) | |
72 { | |
73 if (brain->src_mailbox_list->iter != NULL || | |
74 brain->dest_mailbox_list->iter != NULL) | |
75 return; | |
76 | |
77 /* both lists are finished */ | |
78 brain->state++; | |
79 dsync_brain_sync(brain); | |
80 } | |
81 | |
82 static void dsync_worker_mailbox_input(void *context) | |
83 { | |
84 struct dsync_brain_mailbox_list *list = context; | |
85 struct dsync_mailbox dsync_box, *dup_box; | |
86 int ret; | |
87 | |
88 while ((ret = dsync_worker_mailbox_iter_next(list->iter, | |
89 &dsync_box)) > 0) { | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
90 if (list->brain->mailbox != NULL && |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
91 strcmp(list->brain->mailbox, dsync_box.name) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
92 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
93 |
9559 | 94 dup_box = dsync_mailbox_dup(list->pool, &dsync_box); |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
95 if (!mail_guid_128_is_empty(dup_box->mailbox_guid.guid)) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
96 array_append(&list->mailboxes, &dup_box, 1); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
97 else |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
98 array_append(&list->dirs, &dup_box, 1); |
9559 | 99 } |
100 if (ret < 0) { | |
101 /* finished listing mailboxes */ | |
102 if (dsync_worker_mailbox_iter_deinit(&list->iter) < 0) | |
103 dsync_brain_fail(list->brain); | |
104 array_sort(&list->mailboxes, dsync_mailbox_p_guid_cmp); | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
105 array_sort(&list->dirs, dsync_mailbox_p_dir_guid_cmp); |
9559 | 106 dsync_brain_mailbox_list_finished(list->brain); |
107 } | |
108 } | |
109 | |
110 static struct dsync_brain_mailbox_list * | |
111 dsync_brain_mailbox_list_init(struct dsync_brain *brain, | |
112 struct dsync_worker *worker) | |
113 { | |
114 struct dsync_brain_mailbox_list *list; | |
115 pool_t pool; | |
116 | |
117 pool = pool_alloconly_create("dsync brain mailbox list", 10240); | |
118 list = p_new(pool, struct dsync_brain_mailbox_list, 1); | |
119 list->pool = pool; | |
120 list->brain = brain; | |
121 list->worker = worker; | |
122 list->iter = dsync_worker_mailbox_iter_init(worker); | |
123 p_array_init(&list->mailboxes, pool, 128); | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
124 p_array_init(&list->dirs, pool, 32); |
9559 | 125 dsync_worker_set_input_callback(worker, dsync_worker_mailbox_input, |
126 list); | |
127 return list; | |
128 } | |
129 | |
130 static void | |
131 dsync_brain_mailbox_list_deinit(struct dsync_brain_mailbox_list **_list) | |
132 { | |
133 struct dsync_brain_mailbox_list *list = *_list; | |
134 | |
135 *_list = NULL; | |
136 | |
137 if (list->iter != NULL) | |
138 (void)dsync_worker_mailbox_iter_deinit(&list->iter); | |
139 pool_unref(&list->pool); | |
140 } | |
141 | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
142 static void dsync_brain_subs_list_finished(struct dsync_brain *brain) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
143 { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
144 if (brain->src_subs_list->iter != NULL || |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
145 brain->dest_subs_list->iter != NULL) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
146 return; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
147 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
148 /* both lists are finished */ |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
149 brain->state++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
150 dsync_brain_sync(brain); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
151 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
152 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
153 static int |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
154 dsync_worker_subscription_cmp(const struct dsync_worker_subscription *s1, |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
155 const struct dsync_worker_subscription *s2) |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
156 { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
157 return strcmp(s1->vname, s2->vname); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
158 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
159 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
160 static int |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
161 dsync_worker_unsubscription_cmp(const struct dsync_worker_unsubscription *u1, |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
162 const struct dsync_worker_unsubscription *u2) |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
163 { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
164 int ret; |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
165 |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
166 ret = strcmp(u1->ns_prefix, u2->ns_prefix); |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
167 return ret != 0 ? ret : |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
168 dsync_guid_cmp(&u1->name_sha1, &u2->name_sha1); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
169 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
170 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
171 static void dsync_worker_subs_input(void *context) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
172 { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
173 struct dsync_brain_subs_list *list = context; |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
174 struct dsync_worker_subscription subs; |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
175 struct dsync_worker_unsubscription unsubs; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
176 int ret; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
177 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
178 memset(&subs, 0, sizeof(subs)); |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
179 while ((ret = dsync_worker_subs_iter_next(list->iter, &subs)) > 0) { |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
180 subs.vname = p_strdup(list->pool, subs.vname); |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
181 subs.storage_name = p_strdup(list->pool, subs.storage_name); |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
182 subs.ns_prefix = p_strdup(list->pool, subs.ns_prefix); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
183 array_append(&list->subscriptions, &subs, 1); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
184 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
185 if (ret == 0) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
186 return; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
187 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
188 memset(&unsubs, 0, sizeof(unsubs)); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
189 while ((ret = dsync_worker_subs_iter_next_un(list->iter, |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
190 &unsubs)) > 0) { |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
191 unsubs.ns_prefix = p_strdup(list->pool, unsubs.ns_prefix); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
192 array_append(&list->unsubscriptions, &unsubs, 1); |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
193 } |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
194 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
195 if (ret < 0) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
196 /* finished listing subscriptions */ |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
197 if (dsync_worker_subs_iter_deinit(&list->iter) < 0) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
198 dsync_brain_fail(list->brain); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
199 array_sort(&list->subscriptions, |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
200 dsync_worker_subscription_cmp); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
201 array_sort(&list->unsubscriptions, |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
202 dsync_worker_unsubscription_cmp); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
203 dsync_brain_subs_list_finished(list->brain); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
204 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
205 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
206 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
207 static struct dsync_brain_subs_list * |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
208 dsync_brain_subs_list_init(struct dsync_brain *brain, |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
209 struct dsync_worker *worker) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
210 { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
211 struct dsync_brain_subs_list *list; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
212 pool_t pool; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
213 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
214 pool = pool_alloconly_create("dsync brain subs list", 1024*4); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
215 list = p_new(pool, struct dsync_brain_subs_list, 1); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
216 list->pool = pool; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
217 list->brain = brain; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
218 list->worker = worker; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
219 list->iter = dsync_worker_subs_iter_init(worker); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
220 p_array_init(&list->subscriptions, pool, 128); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
221 p_array_init(&list->unsubscriptions, pool, 64); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
222 dsync_worker_set_input_callback(worker, dsync_worker_subs_input, list); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
223 return list; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
224 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
225 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
226 static void |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
227 dsync_brain_subs_list_deinit(struct dsync_brain_subs_list **_list) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
228 { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
229 struct dsync_brain_subs_list *list = *_list; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
230 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
231 *_list = NULL; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
232 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
233 if (list->iter != NULL) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
234 (void)dsync_worker_subs_iter_deinit(&list->iter); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
235 pool_unref(&list->pool); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
236 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
237 |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
238 static void dsync_brain_sync_mailboxes(struct dsync_brain *brain) |
9559 | 239 { |
240 struct dsync_mailbox *const *src_boxes, *const *dest_boxes, new_box; | |
241 unsigned int src, dest, src_count, dest_count; | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
242 bool src_deleted, dest_deleted; |
9559 | 243 int ret; |
244 | |
245 memset(&new_box, 0, sizeof(new_box)); | |
246 | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
247 /* create/delete missing mailboxes. the mailboxes are sorted by |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
248 GUID, so we can do this quickly. */ |
9559 | 249 src_boxes = array_get(&brain->src_mailbox_list->mailboxes, &src_count); |
250 dest_boxes = array_get(&brain->dest_mailbox_list->mailboxes, &dest_count); | |
251 for (src = dest = 0; src < src_count && dest < dest_count; ) { | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
252 src_deleted = (src_boxes[src]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
253 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
254 dest_deleted = (dest_boxes[dest]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
255 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
256 ret = dsync_mailbox_guid_cmp(src_boxes[src], |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
257 dest_boxes[dest]); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
258 if (ret < 0) { |
9559 | 259 /* exists only in source */ |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
260 if (!src_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
261 new_box = *src_boxes[src]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
262 new_box.uid_next = 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
263 new_box.highest_modseq = 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
264 dsync_worker_create_mailbox(brain->dest_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
265 &new_box); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
266 } |
9559 | 267 src++; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
268 } else if (ret > 0) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
269 /* exists only in dest */ |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
270 if (!dest_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
271 new_box = *dest_boxes[dest]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
272 new_box.uid_next = 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
273 new_box.highest_modseq = 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
274 dsync_worker_create_mailbox(brain->src_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
275 &new_box); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
276 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
277 dest++; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
278 } else if (src_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
279 /* delete from dest too */ |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
280 if (!dest_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
281 dsync_worker_delete_mailbox(brain->dest_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
282 &dest_boxes[dest]->mailbox_guid); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
283 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
284 src++; dest++; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
285 } else if (dest_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
286 /* delete from src too */ |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
287 dsync_worker_delete_mailbox(brain->src_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
288 &src_boxes[src]->mailbox_guid); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
289 src++; dest++; |
9559 | 290 } else { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
291 src++; dest++; |
9559 | 292 } |
293 } | |
294 for (; src < src_count; src++) { | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
295 if ((src_boxes[src]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
296 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
297 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
298 |
9559 | 299 new_box = *src_boxes[src]; |
300 new_box.uid_next = 0; | |
301 new_box.highest_modseq = 0; | |
302 dsync_worker_create_mailbox(brain->dest_worker, &new_box); | |
303 } | |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
304 for (; dest < dest_count; dest++) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
305 if ((dest_boxes[dest]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
306 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
307 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
308 |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
309 new_box = *dest_boxes[dest]; |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
310 new_box.uid_next = 0; |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
311 new_box.highest_modseq = 0; |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
312 dsync_worker_create_mailbox(brain->src_worker, &new_box); |
9638
b11a3eda2477
dsync: Use expunged messages' GUIDs to determine what to do with missing messages at end of mailbox.
Timo Sirainen <tss@iki.fi>
parents:
9592
diff
changeset
|
313 } |
9559 | 314 } |
315 | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
316 static bool |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
317 dsync_brain_is_unsubscribed(struct dsync_brain_subs_list *list, |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
318 const struct dsync_worker_subscription *subs) |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
319 { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
320 const struct dsync_worker_unsubscription *unsubs; |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
321 struct dsync_worker_unsubscription lookup; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
322 |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
323 lookup.ns_prefix = subs->ns_prefix; |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
324 dsync_str_sha_to_guid(subs->storage_name, &lookup.name_sha1); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
325 unsubs = array_bsearch(&list->unsubscriptions, &lookup, |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
326 dsync_worker_unsubscription_cmp); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
327 if (unsubs == NULL) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
328 return FALSE; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
329 else |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
330 return unsubs->last_change > subs->last_change; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
331 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
332 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
333 static void dsync_brain_sync_subscriptions(struct dsync_brain *brain) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
334 { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
335 const struct dsync_worker_subscription *src_subs, *dest_subs; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
336 unsigned int src, dest, src_count, dest_count; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
337 int ret; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
338 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
339 /* subscriptions are sorted by name. */ |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
340 src_subs = array_get(&brain->src_subs_list->subscriptions, &src_count); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
341 dest_subs = array_get(&brain->dest_subs_list->subscriptions, &dest_count); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
342 for (src = dest = 0;; ) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
343 if (src == src_count) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
344 if (dest == dest_count) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
345 break; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
346 ret = 1; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
347 } else if (dest == dest_count) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
348 ret = -1; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
349 } else { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
350 ret = strcmp(src_subs[src].vname, |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
351 dest_subs[dest].vname); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
352 if (ret == 0) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
353 src++; dest++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
354 continue; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
355 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
356 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
357 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
358 if (ret < 0) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
359 /* subscribed only in source */ |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
360 if (dsync_brain_is_unsubscribed(brain->dest_subs_list, |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
361 &src_subs[src])) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
362 dsync_worker_set_subscribed(brain->src_worker, |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
363 src_subs[src].vname, |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
364 FALSE); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
365 } else { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
366 dsync_worker_set_subscribed(brain->dest_worker, |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
367 src_subs[src].vname, |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
368 TRUE); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
369 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
370 src++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
371 } else { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
372 /* subscribed only in dest */ |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
373 if (dsync_brain_is_unsubscribed(brain->src_subs_list, |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
374 &dest_subs[dest])) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
375 dsync_worker_set_subscribed(brain->dest_worker, |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
376 dest_subs[dest].vname, |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
377 FALSE); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
378 } else { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
379 dsync_worker_set_subscribed(brain->src_worker, |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
380 dest_subs[dest].vname, |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
381 TRUE); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
382 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
383 dest++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
384 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
385 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
386 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
387 |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
388 static bool dsync_mailbox_has_changed_msgs(struct dsync_brain *brain, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
389 const struct dsync_mailbox *box1, |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
390 const struct dsync_mailbox *box2) |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
391 { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
392 const char *name = *box1->name != '\0' ? box1->name : box2->name; |
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
393 |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
394 if (box1->uid_validity != box2->uid_validity) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
395 if (brain->verbose) { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
396 i_info("%s: uidvalidity changed %u -> %u", name, |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
397 box1->uid_validity, box2->uid_validity); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
398 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
399 return TRUE; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
400 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
401 if (box1->uid_next != box2->uid_next) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
402 if (brain->verbose) { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
403 i_info("%s: uidnext changed %u -> %u", name, |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
404 box1->uid_next, box2->uid_next); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
405 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
406 return TRUE; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
407 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
408 if (box1->highest_modseq != box2->highest_modseq) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
409 if (brain->verbose) { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
410 i_info("%s: highest_modseq changed %llu -> %llu", name, |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
411 (unsigned long long)box1->highest_modseq, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
412 (unsigned long long)box2->highest_modseq); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
413 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
414 return TRUE; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
415 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
416 return FALSE; |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
417 } |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
418 |
10371 | 419 static bool dsync_mailbox_has_changes(struct dsync_brain *brain, |
420 const struct dsync_mailbox *box1, | |
421 const struct dsync_mailbox *box2) | |
422 { | |
423 if (strcmp(box1->name, box2->name) != 0) | |
424 return TRUE; | |
425 return dsync_mailbox_has_changed_msgs(brain, box1, box2); | |
426 } | |
427 | |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
428 static void |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
429 dsync_brain_get_changed_mailboxes(struct dsync_brain *brain, |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
430 ARRAY_TYPE(dsync_brain_mailbox) *brain_boxes, |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
431 bool full_sync) |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
432 { |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
433 struct dsync_mailbox *const *src_boxes, *const *dest_boxes; |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
434 struct dsync_brain_mailbox *brain_box; |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
435 unsigned int src, dest, src_count, dest_count; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
436 bool src_deleted, dest_deleted; |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
437 int ret; |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
438 |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
439 src_boxes = array_get(&brain->src_mailbox_list->mailboxes, &src_count); |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
440 dest_boxes = array_get(&brain->dest_mailbox_list->mailboxes, &dest_count); |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
441 |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
442 for (src = dest = 0; src < src_count && dest < dest_count; ) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
443 src_deleted = (src_boxes[src]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
444 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
445 dest_deleted = (dest_boxes[dest]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
446 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
447 |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
448 ret = dsync_mailbox_guid_cmp(src_boxes[src], dest_boxes[dest]); |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
449 if (ret == 0) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
450 if ((full_sync || |
10371 | 451 dsync_mailbox_has_changes(brain, src_boxes[src], |
452 dest_boxes[dest])) && | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
453 !src_deleted && !dest_deleted) { |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
454 brain_box = array_append_space(brain_boxes); |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
455 brain_box->box = *src_boxes[src]; |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
456 |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
457 brain_box->box.highest_modseq = |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
458 I_MAX(src_boxes[src]->highest_modseq, |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
459 dest_boxes[dest]->highest_modseq); |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
460 brain_box->box.uid_next = |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
461 I_MAX(src_boxes[src]->uid_next, |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
462 dest_boxes[dest]->uid_next); |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
463 brain_box->src = src_boxes[src]; |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
464 brain_box->dest = dest_boxes[dest]; |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
465 } |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
466 src++; dest++; |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
467 } else if (ret < 0) { |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
468 /* exists only in source */ |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
469 if (!src_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
470 brain_box = array_append_space(brain_boxes); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
471 brain_box->box = *src_boxes[src]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
472 brain_box->src = src_boxes[src]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
473 if (brain->verbose) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
474 i_info("%s: only in source", |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
475 brain_box->box.name); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
476 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
477 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
478 src++; |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
479 } else { |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
480 /* exists only in dest */ |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
481 if (!dest_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
482 brain_box = array_append_space(brain_boxes); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
483 brain_box->box = *dest_boxes[dest]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
484 brain_box->dest = dest_boxes[dest]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
485 if (brain->verbose) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
486 i_info("%s: only in dest", |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
487 brain_box->box.name); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
488 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
489 } |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
490 dest++; |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
491 } |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
492 } |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
493 for (; src < src_count; src++) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
494 if ((src_boxes[src]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
495 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
496 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
497 |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
498 brain_box = array_append_space(brain_boxes); |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
499 brain_box->box = *src_boxes[src]; |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
500 brain_box->src = src_boxes[src]; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
501 if (brain->verbose) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
502 i_info("%s: only in source", brain_box->box.name); |
9559 | 503 } |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
504 for (; dest < dest_count; dest++) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
505 if ((dest_boxes[dest]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
506 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
507 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
508 |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
509 brain_box = array_append_space(brain_boxes); |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
510 brain_box->box = *dest_boxes[dest]; |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
511 brain_box->dest = dest_boxes[dest]; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
512 if (brain->verbose) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
513 i_info("%s: only in dest", brain_box->box.name); |
9559 | 514 } |
515 } | |
516 | |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
517 static void dsync_brain_sync_msgs(struct dsync_brain *brain) |
9559 | 518 { |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
519 ARRAY_TYPE(dsync_brain_mailbox) mailboxes; |
10217 | 520 pool_t pool; |
9559 | 521 |
10217 | 522 pool = pool_alloconly_create("dsync changed mailboxes", 10240); |
523 p_array_init(&mailboxes, pool, 128); | |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
524 dsync_brain_get_changed_mailboxes(brain, &mailboxes, |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
525 (brain->flags & DSYNC_BRAIN_FLAG_FULL_SYNC) != 0); |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
526 brain->mailbox_sync = dsync_brain_msg_sync_init(brain, &mailboxes); |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
527 dsync_brain_msg_sync_more(brain->mailbox_sync); |
10217 | 528 pool_unref(&pool); |
9559 | 529 } |
530 | |
531 static void | |
10371 | 532 dsync_brain_sync_rename_mailbox(struct dsync_brain *brain, |
533 const struct dsync_brain_mailbox *mailbox) | |
534 { | |
535 if (mailbox->src->last_renamed > mailbox->dest->last_renamed) { | |
536 dsync_worker_rename_mailbox(brain->dest_worker, | |
537 &mailbox->box.mailbox_guid, | |
10373
036db604f86c
dsync: Fixed problems with syncing mailbox names that are invalid on other side.
Timo Sirainen <tss@iki.fi>
parents:
10371
diff
changeset
|
538 mailbox->src); |
10371 | 539 } else { |
540 dsync_worker_rename_mailbox(brain->src_worker, | |
541 &mailbox->box.mailbox_guid, | |
10373
036db604f86c
dsync: Fixed problems with syncing mailbox names that are invalid on other side.
Timo Sirainen <tss@iki.fi>
parents:
10371
diff
changeset
|
542 mailbox->dest); |
10371 | 543 } |
544 } | |
545 | |
546 static void | |
547 dsync_brain_sync_update_mailboxes(struct dsync_brain *brain) | |
9559 | 548 { |
10000
c610321584ca
Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents:
9759
diff
changeset
|
549 const struct dsync_brain_mailbox *mailbox; |
9559 | 550 |
10000
c610321584ca
Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents:
9759
diff
changeset
|
551 array_foreach(&brain->mailbox_sync->mailboxes, mailbox) { |
10373
036db604f86c
dsync: Fixed problems with syncing mailbox names that are invalid on other side.
Timo Sirainen <tss@iki.fi>
parents:
10371
diff
changeset
|
552 dsync_worker_update_mailbox(brain->src_worker, &mailbox->box); |
036db604f86c
dsync: Fixed problems with syncing mailbox names that are invalid on other side.
Timo Sirainen <tss@iki.fi>
parents:
10371
diff
changeset
|
553 dsync_worker_update_mailbox(brain->dest_worker, &mailbox->box); |
036db604f86c
dsync: Fixed problems with syncing mailbox names that are invalid on other side.
Timo Sirainen <tss@iki.fi>
parents:
10371
diff
changeset
|
554 |
10371 | 555 if (mailbox->src != NULL && mailbox->dest != NULL && |
556 strcmp(mailbox->src->name, mailbox->dest->name) != 0) | |
557 dsync_brain_sync_rename_mailbox(brain, mailbox); | |
9559 | 558 } |
559 } | |
560 | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
561 static void dsync_brain_worker_finished(bool success, void *context) |
9559 | 562 { |
563 struct dsync_brain *brain = context; | |
564 | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
565 if (!success) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
566 dsync_brain_fail(brain); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
567 |
9559 | 568 brain->state++; |
569 dsync_brain_sync(brain); | |
570 } | |
571 | |
572 void dsync_brain_sync(struct dsync_brain *brain) | |
573 { | |
574 switch (brain->state) { | |
575 case DSYNC_STATE_GET_MAILBOXES: | |
576 i_assert(brain->src_mailbox_list == NULL); | |
577 brain->src_mailbox_list = | |
578 dsync_brain_mailbox_list_init(brain, brain->src_worker); | |
579 brain->dest_mailbox_list = | |
580 dsync_brain_mailbox_list_init(brain, brain->dest_worker); | |
581 dsync_worker_mailbox_input(brain->src_mailbox_list); | |
582 dsync_worker_mailbox_input(brain->dest_mailbox_list); | |
583 break; | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
584 case DSYNC_STATE_GET_SUBSCRIPTIONS: |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
585 i_assert(brain->src_subs_list == NULL); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
586 brain->src_subs_list = |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
587 dsync_brain_subs_list_init(brain, brain->src_worker); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
588 brain->dest_subs_list = |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
589 dsync_brain_subs_list_init(brain, brain->dest_worker); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
590 dsync_worker_subs_input(brain->src_subs_list); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
591 dsync_worker_subs_input(brain->dest_subs_list); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
592 break; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
593 case DSYNC_STATE_SYNC_MAILBOXES: |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
594 dsync_brain_sync_mailboxes(brain); |
9559 | 595 brain->state++; |
596 /* fall through */ | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
597 case DSYNC_STATE_SYNC_SUBSCRIPTIONS: |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
598 dsync_brain_sync_subscriptions(brain); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
599 brain->state++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
600 /* fall through */ |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
601 case DSYNC_STATE_SYNC_MSGS: |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
602 dsync_brain_sync_msgs(brain); |
9559 | 603 break; |
10323
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
604 case DSYNC_STATE_SYNC_MSGS_FLUSH: |
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
605 /* wait until all saves are done, so we don't try to close |
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
606 the mailbox too early */ |
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
607 dsync_worker_finish(brain->src_worker, |
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
608 dsync_brain_worker_finished, brain); |
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
609 dsync_worker_finish(brain->dest_worker, |
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
610 dsync_brain_worker_finished, brain); |
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
611 break; |
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
612 case DSYNC_STATE_SYNC_MSGS_FLUSH2: |
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
613 break; |
10371 | 614 case DSYNC_STATE_SYNC_UPDATE_MAILBOXES: |
615 dsync_brain_sync_update_mailboxes(brain); | |
9559 | 616 brain->state++; |
617 /* fall through */ | |
618 case DSYNC_STATE_SYNC_FLUSH: | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
619 dsync_worker_finish(brain->src_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
620 dsync_brain_worker_finished, brain); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
621 dsync_worker_finish(brain->dest_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
622 dsync_brain_worker_finished, brain); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
623 break; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
624 case DSYNC_STATE_SYNC_FLUSH2: |
9559 | 625 break; |
626 case DSYNC_STATE_SYNC_END: | |
627 master_service_stop(master_service); | |
628 break; | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
629 default: |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
630 i_unreached(); |
9559 | 631 } |
632 } | |
10354
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
633 |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
634 void dsync_brain_sync_all(struct dsync_brain *brain) |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
635 { |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
636 enum dsync_state old_state; |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
637 |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
638 while (brain->state != DSYNC_STATE_SYNC_END) { |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
639 old_state = brain->state; |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
640 dsync_brain_sync(brain); |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
641 i_assert(brain->state != old_state); |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
642 } |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
643 } |
10368
9f2e8d230bd5
dsync: If some uid/modseq changes couldn't be done, exit with different value.
Timo Sirainen <tss@iki.fi>
parents:
10356
diff
changeset
|
644 |
9f2e8d230bd5
dsync: If some uid/modseq changes couldn't be done, exit with different value.
Timo Sirainen <tss@iki.fi>
parents:
10356
diff
changeset
|
645 bool dsync_brain_has_unexpected_changes(struct dsync_brain *brain) |
9f2e8d230bd5
dsync: If some uid/modseq changes couldn't be done, exit with different value.
Timo Sirainen <tss@iki.fi>
parents:
10356
diff
changeset
|
646 { |
9f2e8d230bd5
dsync: If some uid/modseq changes couldn't be done, exit with different value.
Timo Sirainen <tss@iki.fi>
parents:
10356
diff
changeset
|
647 return dsync_worker_has_unexpected_changes(brain->src_worker) || |
9f2e8d230bd5
dsync: If some uid/modseq changes couldn't be done, exit with different value.
Timo Sirainen <tss@iki.fi>
parents:
10356
diff
changeset
|
648 dsync_worker_has_unexpected_changes(brain->dest_worker); |
9f2e8d230bd5
dsync: If some uid/modseq changes couldn't be done, exit with different value.
Timo Sirainen <tss@iki.fi>
parents:
10356
diff
changeset
|
649 } |