Mercurial > dovecot > core-2.2
annotate src/dsync/dsync-brain.c @ 10976:f6c2c0866aff HEAD
dsync: Added extra sanity check.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 23 Mar 2010 20:14:56 +0200 |
parents | 615eef3139c2 |
children | c955d4789553 |
rev | line source |
---|---|
10582
615eef3139c2
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
10545
diff
changeset
|
1 /* Copyright (c) 2009-2010 Dovecot authors, see the included COPYING file */ |
9559 | 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); |
10545
96db209efe22
dsync: Initial code to sync mailbox list without dir GUID support.
Timo Sirainen <tss@iki.fi>
parents:
10519
diff
changeset
|
95 if (!dsync_mailbox_is_noselect(dup_box)) |
9736
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); | |
10545
96db209efe22
dsync: Initial code to sync mailbox list without dir GUID support.
Timo Sirainen <tss@iki.fi>
parents:
10519
diff
changeset
|
105 array_sort(&list->dirs, dsync_mailbox_p_name_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, |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
282 src_boxes[src]); |
9736
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, |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
288 dest_boxes[dest]); |
9736
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, |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
318 const struct dsync_worker_subscription *subs, |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
319 time_t *last_change_r) |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
320 { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
321 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
|
322 struct dsync_worker_unsubscription lookup; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
323 |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
324 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
|
325 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
|
326 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
|
327 dsync_worker_unsubscription_cmp); |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
328 if (unsubs == NULL) { |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
329 *last_change_r = 0; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
330 return FALSE; |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
331 } else if (unsubs->last_change <= subs->last_change) { |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
332 *last_change_r = subs->last_change; |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
333 return FALSE; |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
334 } else { |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
335 *last_change_r = unsubs->last_change; |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
336 return TRUE; |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
337 } |
10328
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 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
340 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
|
341 { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
342 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
|
343 unsigned int src, dest, src_count, dest_count; |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
344 time_t last_change; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
345 int ret; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
346 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
347 /* subscriptions are sorted by name. */ |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
348 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
|
349 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
|
350 for (src = dest = 0;; ) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
351 if (src == src_count) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
352 if (dest == dest_count) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
353 break; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
354 ret = 1; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
355 } else if (dest == dest_count) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
356 ret = -1; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
357 } else { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
358 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
|
359 dest_subs[dest].vname); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
360 if (ret == 0) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
361 src++; dest++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
362 continue; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
363 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
364 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
365 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
366 if (ret < 0) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
367 /* subscribed only in source */ |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
368 if (dsync_brain_is_unsubscribed(brain->dest_subs_list, |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
369 &src_subs[src], |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
370 &last_change)) { |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
371 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
|
372 src_subs[src].vname, |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
373 last_change, FALSE); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
374 } else { |
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 src_subs[src].vname, |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
377 last_change, TRUE); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
378 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
379 src++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
380 } else { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
381 /* subscribed only in dest */ |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
382 if (dsync_brain_is_unsubscribed(brain->src_subs_list, |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
383 &dest_subs[dest], |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
384 &last_change)) { |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
385 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
|
386 dest_subs[dest].vname, |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
387 last_change, FALSE); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
388 } else { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
389 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
|
390 dest_subs[dest].vname, |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
391 last_change, TRUE); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
392 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
393 dest++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
394 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
395 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
396 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
397 |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
398 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
|
399 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
|
400 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
|
401 { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
402 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
|
403 |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
404 if (box1->uid_validity != box2->uid_validity) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
405 if (brain->verbose) { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
406 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
|
407 box1->uid_validity, box2->uid_validity); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
408 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
409 return TRUE; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
410 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
411 if (box1->uid_next != box2->uid_next) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
412 if (brain->verbose) { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
413 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
|
414 box1->uid_next, box2->uid_next); |
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 TRUE; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
417 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
418 if (box1->highest_modseq != box2->highest_modseq) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
419 if (brain->verbose) { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
420 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
|
421 (unsigned long long)box1->highest_modseq, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
422 (unsigned long long)box2->highest_modseq); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
423 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
424 return TRUE; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
425 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
426 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
|
427 } |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
428 |
10371 | 429 static bool dsync_mailbox_has_changes(struct dsync_brain *brain, |
430 const struct dsync_mailbox *box1, | |
431 const struct dsync_mailbox *box2) | |
432 { | |
433 if (strcmp(box1->name, box2->name) != 0) | |
434 return TRUE; | |
435 return dsync_mailbox_has_changed_msgs(brain, box1, box2); | |
436 } | |
437 | |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
438 static void |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
439 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
|
440 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
|
441 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
|
442 { |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
443 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
|
444 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
|
445 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
|
446 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
|
447 int ret; |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
448 |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
449 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
|
450 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
|
451 |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
452 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
|
453 src_deleted = (src_boxes[src]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
454 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
455 dest_deleted = (dest_boxes[dest]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
456 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
457 |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
458 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
|
459 if (ret == 0) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
460 if ((full_sync || |
10371 | 461 dsync_mailbox_has_changes(brain, src_boxes[src], |
462 dest_boxes[dest])) && | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
463 !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
|
464 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
|
465 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
|
466 |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
467 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
|
468 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
|
469 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
|
470 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
|
471 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
|
472 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
|
473 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
|
474 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
|
475 } |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
476 src++; dest++; |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
477 } 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
|
478 /* exists only in source */ |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
479 if (!src_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
480 brain_box = array_append_space(brain_boxes); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
481 brain_box->box = *src_boxes[src]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
482 brain_box->src = src_boxes[src]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
483 if (brain->verbose) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
484 i_info("%s: only in source", |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
485 brain_box->box.name); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
486 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
487 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
488 src++; |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
489 } else { |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
490 /* exists only in dest */ |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
491 if (!dest_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
492 brain_box = array_append_space(brain_boxes); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
493 brain_box->box = *dest_boxes[dest]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
494 brain_box->dest = dest_boxes[dest]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
495 if (brain->verbose) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
496 i_info("%s: only in dest", |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
497 brain_box->box.name); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
498 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
499 } |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
500 dest++; |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
501 } |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
502 } |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
503 for (; src < src_count; src++) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
504 if ((src_boxes[src]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
505 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
506 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
507 |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
508 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
|
509 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
|
510 brain_box->src = src_boxes[src]; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
511 if (brain->verbose) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
512 i_info("%s: only in source", brain_box->box.name); |
9559 | 513 } |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
514 for (; dest < dest_count; dest++) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
515 if ((dest_boxes[dest]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
516 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
517 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
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 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
|
520 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
|
521 brain_box->dest = dest_boxes[dest]; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
522 if (brain->verbose) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
523 i_info("%s: only in dest", brain_box->box.name); |
9559 | 524 } |
525 } | |
526 | |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
527 static void dsync_brain_sync_msgs(struct dsync_brain *brain) |
9559 | 528 { |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
529 ARRAY_TYPE(dsync_brain_mailbox) mailboxes; |
10217 | 530 pool_t pool; |
9559 | 531 |
10217 | 532 pool = pool_alloconly_create("dsync changed mailboxes", 10240); |
533 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
|
534 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
|
535 (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
|
536 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
|
537 dsync_brain_msg_sync_more(brain->mailbox_sync); |
10217 | 538 pool_unref(&pool); |
9559 | 539 } |
540 | |
541 static void | |
10371 | 542 dsync_brain_sync_rename_mailbox(struct dsync_brain *brain, |
543 const struct dsync_brain_mailbox *mailbox) | |
544 { | |
10545
96db209efe22
dsync: Initial code to sync mailbox list without dir GUID support.
Timo Sirainen <tss@iki.fi>
parents:
10519
diff
changeset
|
545 if (mailbox->src->last_change > mailbox->dest->last_change) { |
10371 | 546 dsync_worker_rename_mailbox(brain->dest_worker, |
547 &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
|
548 mailbox->src); |
10371 | 549 } else { |
550 dsync_worker_rename_mailbox(brain->src_worker, | |
551 &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
|
552 mailbox->dest); |
10371 | 553 } |
554 } | |
555 | |
556 static void | |
557 dsync_brain_sync_update_mailboxes(struct dsync_brain *brain) | |
9559 | 558 { |
10000
c610321584ca
Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents:
9759
diff
changeset
|
559 const struct dsync_brain_mailbox *mailbox; |
9559 | 560 |
10000
c610321584ca
Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents:
9759
diff
changeset
|
561 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
|
562 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
|
563 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
|
564 |
10371 | 565 if (mailbox->src != NULL && mailbox->dest != NULL && |
566 strcmp(mailbox->src->name, mailbox->dest->name) != 0) | |
567 dsync_brain_sync_rename_mailbox(brain, mailbox); | |
9559 | 568 } |
569 } | |
570 | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
571 static void dsync_brain_worker_finished(bool success, void *context) |
9559 | 572 { |
573 struct dsync_brain *brain = context; | |
574 | |
10976
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
575 switch (brain->state) { |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
576 case DSYNC_STATE_SYNC_MSGS_FLUSH: |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
577 case DSYNC_STATE_SYNC_MSGS_FLUSH2: |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
578 case DSYNC_STATE_SYNC_FLUSH: |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
579 case DSYNC_STATE_SYNC_FLUSH2: |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
580 break; |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
581 default: |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
582 i_panic("dsync brain state=%d", brain->state); |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
583 } |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
584 |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
585 if (!success) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
586 dsync_brain_fail(brain); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
587 |
9559 | 588 brain->state++; |
589 dsync_brain_sync(brain); | |
590 } | |
591 | |
592 void dsync_brain_sync(struct dsync_brain *brain) | |
593 { | |
594 switch (brain->state) { | |
595 case DSYNC_STATE_GET_MAILBOXES: | |
596 i_assert(brain->src_mailbox_list == NULL); | |
597 brain->src_mailbox_list = | |
598 dsync_brain_mailbox_list_init(brain, brain->src_worker); | |
599 brain->dest_mailbox_list = | |
600 dsync_brain_mailbox_list_init(brain, brain->dest_worker); | |
601 dsync_worker_mailbox_input(brain->src_mailbox_list); | |
602 dsync_worker_mailbox_input(brain->dest_mailbox_list); | |
603 break; | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
604 case DSYNC_STATE_GET_SUBSCRIPTIONS: |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
605 i_assert(brain->src_subs_list == NULL); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
606 brain->src_subs_list = |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
607 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
|
608 brain->dest_subs_list = |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
609 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
|
610 dsync_worker_subs_input(brain->src_subs_list); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
611 dsync_worker_subs_input(brain->dest_subs_list); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
612 break; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
613 case DSYNC_STATE_SYNC_MAILBOXES: |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
614 dsync_brain_sync_mailboxes(brain); |
9559 | 615 brain->state++; |
616 /* fall through */ | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
617 case DSYNC_STATE_SYNC_SUBSCRIPTIONS: |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
618 dsync_brain_sync_subscriptions(brain); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
619 brain->state++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
620 /* 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
|
621 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
|
622 dsync_brain_sync_msgs(brain); |
9559 | 623 break; |
10323
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
624 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
|
625 /* 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
|
626 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
|
627 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
|
628 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
|
629 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
|
630 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
|
631 break; |
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
632 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
|
633 break; |
10371 | 634 case DSYNC_STATE_SYNC_UPDATE_MAILBOXES: |
635 dsync_brain_sync_update_mailboxes(brain); | |
9559 | 636 brain->state++; |
637 /* fall through */ | |
638 case DSYNC_STATE_SYNC_FLUSH: | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
639 dsync_worker_finish(brain->src_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
640 dsync_brain_worker_finished, brain); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
641 dsync_worker_finish(brain->dest_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
642 dsync_brain_worker_finished, brain); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
643 break; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
644 case DSYNC_STATE_SYNC_FLUSH2: |
9559 | 645 break; |
646 case DSYNC_STATE_SYNC_END: | |
647 master_service_stop(master_service); | |
648 break; | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
649 default: |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
650 i_unreached(); |
9559 | 651 } |
652 } | |
10354
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
653 |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
654 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
|
655 { |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
656 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
|
657 |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
658 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
|
659 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
|
660 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
|
661 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
|
662 } |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
663 } |
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
|
664 |
9f2e8d230bd5
dsync: If some uid/modseq changes couldn't be done, exit with different value.
Timo Sirainen <tss@iki.fi>
parents:
10356
diff
changeset
|
665 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
|
666 { |
9f2e8d230bd5
dsync: If some uid/modseq changes couldn't be done, exit with different value.
Timo Sirainen <tss@iki.fi>
parents:
10356
diff
changeset
|
667 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
|
668 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
|
669 } |