Mercurial > dovecot > core-2.2
annotate src/dsync/dsync-brain.c @ 11684:9798d57644ba HEAD
dsync: Potential crashfix, plus some compiler warning fixes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 01 Jul 2010 18:29:06 +0100 |
parents | 28639e01a479 |
children | b37c85676f8e |
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; |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
28 brain->backup = (flags & DSYNC_BRAIN_FLAG_BACKUP) != 0; |
9559 | 29 return brain; |
30 } | |
31 | |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
32 void dsync_brain_fail(struct dsync_brain *brain) |
9559 | 33 { |
34 brain->failed = TRUE; | |
35 master_service_stop(master_service); | |
36 } | |
37 | |
38 int dsync_brain_deinit(struct dsync_brain **_brain) | |
39 { | |
40 struct dsync_brain *brain = *_brain; | |
41 int ret = brain->failed ? -1 : 0; | |
42 | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
43 if (brain->state != DSYNC_STATE_SYNC_END) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
44 ret = -1; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
45 |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
46 if (ret < 0) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
47 /* 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
|
48 are deinitialized, so they can destroy the streams */ |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
49 dsync_worker_msg_save_cancel(brain->src_worker); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
50 dsync_worker_msg_save_cancel(brain->dest_worker); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
51 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
52 |
9559 | 53 if (brain->mailbox_sync != NULL) |
54 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
|
55 |
9559 | 56 if (brain->src_mailbox_list != NULL) |
57 dsync_brain_mailbox_list_deinit(&brain->src_mailbox_list); | |
58 if (brain->dest_mailbox_list != NULL) | |
59 dsync_brain_mailbox_list_deinit(&brain->dest_mailbox_list); | |
60 | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
61 if (brain->src_subs_list != NULL) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
62 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
|
63 if (brain->dest_subs_list != NULL) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
64 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
|
65 |
11680
49b226835cd2
dsync: Another try at not increasing mailbox uidnext/highestmodseq on failure
Timo Sirainen <tss@iki.fi>
parents:
11677
diff
changeset
|
66 if (dsync_worker_has_failed(brain->src_worker) || |
49b226835cd2
dsync: Another try at not increasing mailbox uidnext/highestmodseq on failure
Timo Sirainen <tss@iki.fi>
parents:
11677
diff
changeset
|
67 dsync_worker_has_failed(brain->dest_worker)) |
49b226835cd2
dsync: Another try at not increasing mailbox uidnext/highestmodseq on failure
Timo Sirainen <tss@iki.fi>
parents:
11677
diff
changeset
|
68 ret = -1; |
49b226835cd2
dsync: Another try at not increasing mailbox uidnext/highestmodseq on failure
Timo Sirainen <tss@iki.fi>
parents:
11677
diff
changeset
|
69 |
9559 | 70 *_brain = NULL; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
71 i_free(brain->mailbox); |
9559 | 72 i_free(brain); |
73 return ret; | |
74 } | |
75 | |
76 static void dsync_brain_mailbox_list_finished(struct dsync_brain *brain) | |
77 { | |
78 if (brain->src_mailbox_list->iter != NULL || | |
79 brain->dest_mailbox_list->iter != NULL) | |
80 return; | |
81 | |
82 /* both lists are finished */ | |
83 brain->state++; | |
84 dsync_brain_sync(brain); | |
85 } | |
86 | |
87 static void dsync_worker_mailbox_input(void *context) | |
88 { | |
89 struct dsync_brain_mailbox_list *list = context; | |
90 struct dsync_mailbox dsync_box, *dup_box; | |
91 int ret; | |
92 | |
93 while ((ret = dsync_worker_mailbox_iter_next(list->iter, | |
94 &dsync_box)) > 0) { | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
95 if (list->brain->mailbox != NULL && |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
96 strcmp(list->brain->mailbox, dsync_box.name) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
97 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
98 |
9559 | 99 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
|
100 if (!dsync_mailbox_is_noselect(dup_box)) |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
101 array_append(&list->mailboxes, &dup_box, 1); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
102 else |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
103 array_append(&list->dirs, &dup_box, 1); |
9559 | 104 } |
105 if (ret < 0) { | |
106 /* finished listing mailboxes */ | |
107 if (dsync_worker_mailbox_iter_deinit(&list->iter) < 0) | |
108 dsync_brain_fail(list->brain); | |
109 array_sort(&list->mailboxes, dsync_mailbox_p_guid_cmp); | |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
110 array_sort(&list->dirs, dsync_mailbox_p_name_sha1_cmp); |
9559 | 111 dsync_brain_mailbox_list_finished(list->brain); |
112 } | |
113 } | |
114 | |
115 static struct dsync_brain_mailbox_list * | |
116 dsync_brain_mailbox_list_init(struct dsync_brain *brain, | |
117 struct dsync_worker *worker) | |
118 { | |
119 struct dsync_brain_mailbox_list *list; | |
120 pool_t pool; | |
121 | |
122 pool = pool_alloconly_create("dsync brain mailbox list", 10240); | |
123 list = p_new(pool, struct dsync_brain_mailbox_list, 1); | |
124 list->pool = pool; | |
125 list->brain = brain; | |
126 list->worker = worker; | |
127 list->iter = dsync_worker_mailbox_iter_init(worker); | |
128 p_array_init(&list->mailboxes, pool, 128); | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
129 p_array_init(&list->dirs, pool, 32); |
9559 | 130 dsync_worker_set_input_callback(worker, dsync_worker_mailbox_input, |
131 list); | |
132 return list; | |
133 } | |
134 | |
135 static void | |
136 dsync_brain_mailbox_list_deinit(struct dsync_brain_mailbox_list **_list) | |
137 { | |
138 struct dsync_brain_mailbox_list *list = *_list; | |
139 | |
140 *_list = NULL; | |
141 | |
142 if (list->iter != NULL) | |
143 (void)dsync_worker_mailbox_iter_deinit(&list->iter); | |
144 pool_unref(&list->pool); | |
145 } | |
146 | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
147 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
|
148 { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
149 if (brain->src_subs_list->iter != NULL || |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
150 brain->dest_subs_list->iter != NULL) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
151 return; |
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 /* both lists are finished */ |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
154 brain->state++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
155 dsync_brain_sync(brain); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
156 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
157 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
158 static int |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
159 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
|
160 const struct dsync_worker_subscription *s2) |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
161 { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
162 return strcmp(s1->vname, s2->vname); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
163 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
164 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
165 static int |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
166 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
|
167 const struct dsync_worker_unsubscription *u2) |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
168 { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
169 int ret; |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
170 |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
171 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
|
172 return ret != 0 ? ret : |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
173 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
|
174 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
175 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
176 static void dsync_worker_subs_input(void *context) |
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 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
|
179 struct dsync_worker_subscription subs; |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
180 struct dsync_worker_unsubscription unsubs; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
181 int ret; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
182 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
183 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
|
184 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
|
185 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
|
186 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
|
187 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
|
188 array_append(&list->subscriptions, &subs, 1); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
189 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
190 if (ret == 0) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
191 return; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
192 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
193 memset(&unsubs, 0, sizeof(unsubs)); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
194 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
|
195 &unsubs)) > 0) { |
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
196 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
|
197 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
|
198 } |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
199 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
200 if (ret < 0) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
201 /* finished listing subscriptions */ |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
202 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
|
203 dsync_brain_fail(list->brain); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
204 array_sort(&list->subscriptions, |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
205 dsync_worker_subscription_cmp); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
206 array_sort(&list->unsubscriptions, |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
207 dsync_worker_unsubscription_cmp); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
208 dsync_brain_subs_list_finished(list->brain); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
209 } |
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 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
212 static struct dsync_brain_subs_list * |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
213 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
|
214 struct dsync_worker *worker) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
215 { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
216 struct dsync_brain_subs_list *list; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
217 pool_t pool; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
218 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
219 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
|
220 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
|
221 list->pool = pool; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
222 list->brain = brain; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
223 list->worker = worker; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
224 list->iter = dsync_worker_subs_iter_init(worker); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
225 p_array_init(&list->subscriptions, pool, 128); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
226 p_array_init(&list->unsubscriptions, pool, 64); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
227 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
|
228 return list; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
229 } |
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 static void |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
232 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
|
233 { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
234 struct dsync_brain_subs_list *list = *_list; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
235 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
236 *_list = NULL; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
237 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
238 if (list->iter != NULL) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
239 (void)dsync_worker_subs_iter_deinit(&list->iter); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
240 pool_unref(&list->pool); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
241 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
242 |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
243 enum dsync_brain_mailbox_action { |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
244 DSYNC_BRAIN_MAILBOX_ACTION_NONE, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
245 DSYNC_BRAIN_MAILBOX_ACTION_CREATE, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
246 DSYNC_BRAIN_MAILBOX_ACTION_DELETE |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
247 }; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
248 |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
249 static void |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
250 dsync_brain_mailbox_action(struct dsync_brain *brain, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
251 enum dsync_brain_mailbox_action action, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
252 struct dsync_worker *action_worker, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
253 struct dsync_mailbox *action_box) |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
254 { |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
255 struct dsync_mailbox new_box; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
256 |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
257 if (brain->backup && action_worker == brain->src_worker) { |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
258 /* backup mode: switch actions */ |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
259 action_worker = brain->dest_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
260 switch (action) { |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
261 case DSYNC_BRAIN_MAILBOX_ACTION_NONE: |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
262 break; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
263 case DSYNC_BRAIN_MAILBOX_ACTION_CREATE: |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
264 action = DSYNC_BRAIN_MAILBOX_ACTION_DELETE; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
265 break; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
266 case DSYNC_BRAIN_MAILBOX_ACTION_DELETE: |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
267 action = DSYNC_BRAIN_MAILBOX_ACTION_CREATE; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
268 break; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
269 } |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
270 } |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
271 |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
272 switch (action) { |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
273 case DSYNC_BRAIN_MAILBOX_ACTION_NONE: |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
274 break; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
275 case DSYNC_BRAIN_MAILBOX_ACTION_CREATE: |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
276 new_box = *action_box; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
277 new_box.uid_next = 0; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
278 new_box.highest_modseq = 0; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
279 dsync_worker_create_mailbox(action_worker, &new_box); |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
280 break; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
281 case DSYNC_BRAIN_MAILBOX_ACTION_DELETE: |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
282 if (!dsync_mailbox_is_noselect(action_box)) |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
283 dsync_worker_delete_mailbox(action_worker, action_box); |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
284 else |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
285 dsync_worker_delete_dir(action_worker, action_box); |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
286 break; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
287 } |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
288 } |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
289 |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
290 static void dsync_brain_sync_mailboxes(struct dsync_brain *brain) |
9559 | 291 { |
11684
9798d57644ba
dsync: Potential crashfix, plus some compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents:
11681
diff
changeset
|
292 struct dsync_mailbox *const *src_boxes, *const *dest_boxes; |
9798d57644ba
dsync: Potential crashfix, plus some compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents:
11681
diff
changeset
|
293 struct dsync_mailbox *action_box = NULL; |
9798d57644ba
dsync: Potential crashfix, plus some compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents:
11681
diff
changeset
|
294 struct dsync_worker *action_worker = NULL; |
9559 | 295 unsigned int src, dest, src_count, dest_count; |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
296 enum dsync_brain_mailbox_action action; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
297 bool src_deleted, dest_deleted; |
9559 | 298 int ret; |
299 | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
300 /* 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
|
301 GUID, so we can do this quickly. */ |
9559 | 302 src_boxes = array_get(&brain->src_mailbox_list->mailboxes, &src_count); |
303 dest_boxes = array_get(&brain->dest_mailbox_list->mailboxes, &dest_count); | |
304 for (src = dest = 0; src < src_count && dest < dest_count; ) { | |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
305 action = DSYNC_BRAIN_MAILBOX_ACTION_NONE; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
306 src_deleted = (src_boxes[src]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
307 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
308 dest_deleted = (dest_boxes[dest]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
309 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
310 ret = dsync_mailbox_guid_cmp(src_boxes[src], |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
311 dest_boxes[dest]); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
312 if (ret < 0) { |
9559 | 313 /* exists only in source */ |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
314 if (!src_deleted) { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
315 action = DSYNC_BRAIN_MAILBOX_ACTION_CREATE; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
316 action_worker = brain->dest_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
317 action_box = src_boxes[src]; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
318 } |
9559 | 319 src++; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
320 } else if (ret > 0) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
321 /* exists only in dest */ |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
322 if (!dest_deleted) { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
323 action = DSYNC_BRAIN_MAILBOX_ACTION_CREATE; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
324 action_worker = brain->src_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
325 action_box = dest_boxes[dest]; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
326 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
327 dest++; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
328 } else if (src_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
329 /* delete from dest too */ |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
330 if (!dest_deleted) { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
331 action = DSYNC_BRAIN_MAILBOX_ACTION_DELETE; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
332 action_worker = brain->dest_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
333 action_box = dest_boxes[dest]; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
334 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
335 src++; dest++; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
336 } else if (dest_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
337 /* delete from src too */ |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
338 action = DSYNC_BRAIN_MAILBOX_ACTION_DELETE; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
339 action_worker = brain->src_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
340 action_box = src_boxes[src]; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
341 src++; dest++; |
9559 | 342 } else { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
343 src++; dest++; |
9559 | 344 } |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
345 dsync_brain_mailbox_action(brain, action, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
346 action_worker, action_box); |
9559 | 347 } |
348 for (; src < src_count; src++) { | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
349 if ((src_boxes[src]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
350 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
351 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
352 |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
353 dsync_brain_mailbox_action(brain, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
354 DSYNC_BRAIN_MAILBOX_ACTION_CREATE, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
355 brain->dest_worker, src_boxes[src]); |
9559 | 356 } |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
357 for (; dest < dest_count; dest++) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
358 if ((dest_boxes[dest]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
359 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
360 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
361 |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
362 dsync_brain_mailbox_action(brain, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
363 DSYNC_BRAIN_MAILBOX_ACTION_CREATE, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
364 brain->src_worker, dest_boxes[dest]); |
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
|
365 } |
9559 | 366 } |
367 | |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
368 static void dsync_brain_sync_dirs(struct dsync_brain *brain) |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
369 { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
370 struct dsync_mailbox *const *src_boxes, *const *dest_boxes, *action_box; |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
371 unsigned int src, dest, src_count, dest_count; |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
372 enum dsync_brain_mailbox_action action; |
11684
9798d57644ba
dsync: Potential crashfix, plus some compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents:
11681
diff
changeset
|
373 struct dsync_worker *action_worker = NULL; |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
374 bool src_deleted, dest_deleted; |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
375 int ret; |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
376 |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
377 /* create/delete missing directories. */ |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
378 src_boxes = array_get(&brain->src_mailbox_list->dirs, &src_count); |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
379 dest_boxes = array_get(&brain->dest_mailbox_list->dirs, &dest_count); |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
380 for (src = dest = 0; src < src_count && dest < dest_count; ) { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
381 action = DSYNC_BRAIN_MAILBOX_ACTION_NONE; |
11684
9798d57644ba
dsync: Potential crashfix, plus some compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents:
11681
diff
changeset
|
382 action_box = NULL; |
9798d57644ba
dsync: Potential crashfix, plus some compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents:
11681
diff
changeset
|
383 |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
384 src_deleted = (src_boxes[src]->flags & |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
385 DSYNC_MAILBOX_FLAG_DELETED_DIR) != 0; |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
386 dest_deleted = (dest_boxes[dest]->flags & |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
387 DSYNC_MAILBOX_FLAG_DELETED_DIR) != 0; |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
388 ret = memcmp(src_boxes[src]->name_sha1.guid, |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
389 dest_boxes[dest]->name_sha1.guid, |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
390 sizeof(src_boxes[src]->name_sha1.guid)); |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
391 if (ret < 0) { |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
392 /* exists only in source */ |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
393 if (!src_deleted) { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
394 action = DSYNC_BRAIN_MAILBOX_ACTION_CREATE; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
395 action_worker = brain->dest_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
396 action_box = src_boxes[src]; |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
397 } |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
398 src++; |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
399 } else if (ret > 0) { |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
400 /* exists only in dest */ |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
401 if (!dest_deleted) { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
402 action = DSYNC_BRAIN_MAILBOX_ACTION_CREATE; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
403 action_worker = brain->src_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
404 action_box = dest_boxes[dest]; |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
405 } |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
406 dest++; |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
407 } else if (src_deleted) { |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
408 /* delete from dest too */ |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
409 if (!dest_deleted) { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
410 action = DSYNC_BRAIN_MAILBOX_ACTION_DELETE; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
411 action_worker = brain->dest_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
412 action_box = dest_boxes[dest]; |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
413 } |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
414 src++; dest++; |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
415 } else if (dest_deleted) { |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
416 /* delete from src too */ |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
417 action = DSYNC_BRAIN_MAILBOX_ACTION_DELETE; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
418 action_worker = brain->src_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
419 action_box = src_boxes[src]; |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
420 src++; dest++; |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
421 } else { |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
422 src++; dest++; |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
423 } |
11684
9798d57644ba
dsync: Potential crashfix, plus some compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents:
11681
diff
changeset
|
424 i_assert(action_box == NULL || |
9798d57644ba
dsync: Potential crashfix, plus some compiler warning fixes.
Timo Sirainen <tss@iki.fi>
parents:
11681
diff
changeset
|
425 dsync_mailbox_is_noselect(action_box)); |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
426 dsync_brain_mailbox_action(brain, action, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
427 action_worker, action_box); |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
428 } |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
429 for (; src < src_count; src++) { |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
430 if ((src_boxes[src]->flags & |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
431 DSYNC_MAILBOX_FLAG_DELETED_DIR) != 0) |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
432 continue; |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
433 |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
434 dsync_brain_mailbox_action(brain, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
435 DSYNC_BRAIN_MAILBOX_ACTION_CREATE, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
436 brain->dest_worker, src_boxes[src]); |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
437 } |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
438 for (; dest < dest_count; dest++) { |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
439 if ((dest_boxes[dest]->flags & |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
440 DSYNC_MAILBOX_FLAG_DELETED_DIR) != 0) |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
441 continue; |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
442 |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
443 dsync_brain_mailbox_action(brain, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
444 DSYNC_BRAIN_MAILBOX_ACTION_CREATE, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
445 brain->src_worker, dest_boxes[dest]); |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
446 } |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
447 } |
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
448 |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
449 static bool |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
450 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
|
451 const struct dsync_worker_subscription *subs, |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
452 time_t *last_change_r) |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
453 { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
454 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
|
455 struct dsync_worker_unsubscription lookup; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
456 |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
457 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
|
458 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
|
459 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
|
460 dsync_worker_unsubscription_cmp); |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
461 if (unsubs == NULL) { |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
462 *last_change_r = 0; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
463 return FALSE; |
10519
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
464 } 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
|
465 *last_change_r = subs->last_change; |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
466 return FALSE; |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
467 } else { |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
468 *last_change_r = unsubs->last_change; |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
469 return TRUE; |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
470 } |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
471 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
472 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
473 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
|
474 { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
475 const struct dsync_worker_subscription *src_subs, *dest_subs; |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
476 const struct dsync_worker_subscription *action_subs; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
477 struct dsync_worker *action_worker; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
478 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
|
479 time_t last_change; |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
480 bool subscribe; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
481 int ret; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
482 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
483 /* subscriptions are sorted by name. */ |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
484 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
|
485 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
|
486 for (src = dest = 0;; ) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
487 if (src == src_count) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
488 if (dest == dest_count) |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
489 break; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
490 ret = 1; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
491 } else if (dest == dest_count) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
492 ret = -1; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
493 } else { |
10331
b5b253d35612
dsync: Fixed subscription syncing to work with namespace prefixes.
Timo Sirainen <tss@iki.fi>
parents:
10328
diff
changeset
|
494 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
|
495 dest_subs[dest].vname); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
496 if (ret == 0) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
497 src++; dest++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
498 continue; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
499 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
500 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
501 |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
502 if (ret < 0) { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
503 /* subscribed only in source */ |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
504 action_subs = &src_subs[src]; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
505 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
|
506 &src_subs[src], |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
507 &last_change)) { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
508 action_worker = brain->src_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
509 subscribe = FALSE; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
510 } else { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
511 action_worker = brain->dest_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
512 subscribe = TRUE; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
513 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
514 src++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
515 } else { |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
516 /* subscribed only in dest */ |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
517 action_subs = &dest_subs[dest]; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
518 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
|
519 &dest_subs[dest], |
eba3e50fef36
dsync: Write mailbox changelog records using original timestamps.
Timo Sirainen <tss@iki.fi>
parents:
10373
diff
changeset
|
520 &last_change)) { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
521 action_worker = brain->dest_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
522 subscribe = FALSE; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
523 } else { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
524 action_worker = brain->src_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
525 subscribe = TRUE; |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
526 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
527 dest++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
528 } |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
529 |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
530 if (brain->backup && action_worker == brain->src_worker) { |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
531 /* backup mode: switch action */ |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
532 action_worker = brain->dest_worker; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
533 subscribe = !subscribe; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
534 last_change = ioloop_time; |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
535 } |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
536 dsync_worker_set_subscribed(action_worker, action_subs->vname, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
537 last_change, subscribe); |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
538 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
539 } |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
540 |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
541 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
|
542 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
|
543 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
|
544 { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
545 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
|
546 |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
547 if (box1->uid_validity != box2->uid_validity) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
548 if (brain->verbose) { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
549 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
|
550 box1->uid_validity, box2->uid_validity); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
551 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
552 return TRUE; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
553 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
554 if (box1->uid_next != box2->uid_next) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
555 if (brain->verbose) { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
556 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
|
557 box1->uid_next, box2->uid_next); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
558 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
559 return TRUE; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
560 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
561 if (box1->highest_modseq != box2->highest_modseq) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
562 if (brain->verbose) { |
9759
ab4e247d326d
dsync: Minor verbose logging improvements.
Timo Sirainen <tss@iki.fi>
parents:
9736
diff
changeset
|
563 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
|
564 (unsigned long long)box1->highest_modseq, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
565 (unsigned long long)box2->highest_modseq); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
566 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
567 return TRUE; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
568 } |
11681
28639e01a479
dsync: Find changed mailboxes also based on number of messages in them.
Timo Sirainen <tss@iki.fi>
parents:
11680
diff
changeset
|
569 if (box1->message_count != box2->message_count) { |
28639e01a479
dsync: Find changed mailboxes also based on number of messages in them.
Timo Sirainen <tss@iki.fi>
parents:
11680
diff
changeset
|
570 if (brain->verbose) { |
28639e01a479
dsync: Find changed mailboxes also based on number of messages in them.
Timo Sirainen <tss@iki.fi>
parents:
11680
diff
changeset
|
571 i_info("%s: message_count changed %u -> %u", name, |
28639e01a479
dsync: Find changed mailboxes also based on number of messages in them.
Timo Sirainen <tss@iki.fi>
parents:
11680
diff
changeset
|
572 box1->message_count, box2->message_count); |
28639e01a479
dsync: Find changed mailboxes also based on number of messages in them.
Timo Sirainen <tss@iki.fi>
parents:
11680
diff
changeset
|
573 } |
28639e01a479
dsync: Find changed mailboxes also based on number of messages in them.
Timo Sirainen <tss@iki.fi>
parents:
11680
diff
changeset
|
574 return TRUE; |
28639e01a479
dsync: Find changed mailboxes also based on number of messages in them.
Timo Sirainen <tss@iki.fi>
parents:
11680
diff
changeset
|
575 } |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
576 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
|
577 } |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
578 |
10371 | 579 static bool dsync_mailbox_has_changes(struct dsync_brain *brain, |
580 const struct dsync_mailbox *box1, | |
581 const struct dsync_mailbox *box2) | |
582 { | |
583 if (strcmp(box1->name, box2->name) != 0) | |
584 return TRUE; | |
585 return dsync_mailbox_has_changed_msgs(brain, box1, box2); | |
586 } | |
587 | |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
588 static void |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
589 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
|
590 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
|
591 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
|
592 { |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
593 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
|
594 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
|
595 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
|
596 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
|
597 int ret; |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
598 |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
599 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
|
600 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
|
601 |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
602 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
|
603 src_deleted = (src_boxes[src]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
604 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
605 dest_deleted = (dest_boxes[dest]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
606 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
607 |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
608 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
|
609 if (ret == 0) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
610 if ((full_sync || |
10371 | 611 dsync_mailbox_has_changes(brain, src_boxes[src], |
612 dest_boxes[dest])) && | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
613 !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
|
614 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
|
615 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
|
616 |
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
617 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
|
618 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
|
619 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
|
620 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
|
621 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
|
622 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
|
623 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
|
624 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
|
625 } |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
626 src++; dest++; |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
627 } 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
|
628 /* exists only in source */ |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
629 if (!src_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
630 brain_box = array_append_space(brain_boxes); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
631 brain_box->box = *src_boxes[src]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
632 brain_box->src = src_boxes[src]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
633 if (brain->verbose) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
634 i_info("%s: only in source", |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
635 brain_box->box.name); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
636 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
637 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
638 src++; |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
639 } else { |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
640 /* exists only in dest */ |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
641 if (!dest_deleted) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
642 brain_box = array_append_space(brain_boxes); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
643 brain_box->box = *dest_boxes[dest]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
644 brain_box->dest = dest_boxes[dest]; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
645 if (brain->verbose) { |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
646 i_info("%s: only in dest", |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
647 brain_box->box.name); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
648 } |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
649 } |
9639
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
650 dest++; |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
651 } |
ffda7bd92ebc
dsync: Skip syncing mailboxes whose uidvalidity/uidnext/highest-modseq hasn't changed.
Timo Sirainen <tss@iki.fi>
parents:
9638
diff
changeset
|
652 } |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
653 for (; src < src_count; src++) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
654 if ((src_boxes[src]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
655 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
656 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
657 |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
658 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
|
659 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
|
660 brain_box->src = src_boxes[src]; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
661 if (brain->verbose) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
662 i_info("%s: only in source", brain_box->box.name); |
9559 | 663 } |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
664 for (; dest < dest_count; dest++) { |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
665 if ((dest_boxes[dest]->flags & |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
666 DSYNC_MAILBOX_FLAG_DELETED_MAILBOX) != 0) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
667 continue; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
668 |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
669 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
|
670 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
|
671 brain_box->dest = dest_boxes[dest]; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
672 if (brain->verbose) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
673 i_info("%s: only in dest", brain_box->box.name); |
9559 | 674 } |
675 } | |
676 | |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
677 static void dsync_brain_sync_msgs(struct dsync_brain *brain) |
9559 | 678 { |
9686
4d5cc6ce68aa
dsync: Lots of improvements and fixes. Appears to be somewhat working now.
Timo Sirainen <tss@iki.fi>
parents:
9644
diff
changeset
|
679 ARRAY_TYPE(dsync_brain_mailbox) mailboxes; |
10217 | 680 pool_t pool; |
9559 | 681 |
10217 | 682 pool = pool_alloconly_create("dsync changed mailboxes", 10240); |
683 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
|
684 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
|
685 (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
|
686 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
|
687 dsync_brain_msg_sync_more(brain->mailbox_sync); |
10217 | 688 pool_unref(&pool); |
9559 | 689 } |
690 | |
691 static void | |
10371 | 692 dsync_brain_sync_rename_mailbox(struct dsync_brain *brain, |
693 const struct dsync_brain_mailbox *mailbox) | |
694 { | |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
695 if (mailbox->src->last_change > mailbox->dest->last_change || |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
696 brain->backup) { |
10371 | 697 dsync_worker_rename_mailbox(brain->dest_worker, |
698 &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
|
699 mailbox->src); |
10371 | 700 } else { |
701 dsync_worker_rename_mailbox(brain->src_worker, | |
702 &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
|
703 mailbox->dest); |
10371 | 704 } |
705 } | |
706 | |
707 static void | |
708 dsync_brain_sync_update_mailboxes(struct dsync_brain *brain) | |
9559 | 709 { |
10000
c610321584ca
Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents:
9759
diff
changeset
|
710 const struct dsync_brain_mailbox *mailbox; |
11680
49b226835cd2
dsync: Another try at not increasing mailbox uidnext/highestmodseq on failure
Timo Sirainen <tss@iki.fi>
parents:
11677
diff
changeset
|
711 bool failed_changes = dsync_brain_has_unexpected_changes(brain) || |
49b226835cd2
dsync: Another try at not increasing mailbox uidnext/highestmodseq on failure
Timo Sirainen <tss@iki.fi>
parents:
11677
diff
changeset
|
712 dsync_worker_has_failed(brain->src_worker) || |
49b226835cd2
dsync: Another try at not increasing mailbox uidnext/highestmodseq on failure
Timo Sirainen <tss@iki.fi>
parents:
11677
diff
changeset
|
713 dsync_worker_has_failed(brain->dest_worker); |
9559 | 714 |
10000
c610321584ca
Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents:
9759
diff
changeset
|
715 array_foreach(&brain->mailbox_sync->mailboxes, mailbox) { |
11677
b4f029f7793a
dsync: If dsync fails in any way, don't increase mailboxes' next_uid/highestmodseq.
Timo Sirainen <tss@iki.fi>
parents:
11676
diff
changeset
|
716 /* don't update mailboxes if any changes had failed. |
b4f029f7793a
dsync: If dsync fails in any way, don't increase mailboxes' next_uid/highestmodseq.
Timo Sirainen <tss@iki.fi>
parents:
11676
diff
changeset
|
717 for example if some messages couldn't be saved, we don't |
b4f029f7793a
dsync: If dsync fails in any way, don't increase mailboxes' next_uid/highestmodseq.
Timo Sirainen <tss@iki.fi>
parents:
11676
diff
changeset
|
718 want to increase the next_uid to jump over them */ |
b4f029f7793a
dsync: If dsync fails in any way, don't increase mailboxes' next_uid/highestmodseq.
Timo Sirainen <tss@iki.fi>
parents:
11676
diff
changeset
|
719 if (!brain->backup && !failed_changes) { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
720 dsync_worker_update_mailbox(brain->src_worker, |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
721 &mailbox->box); |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
722 } |
11677
b4f029f7793a
dsync: If dsync fails in any way, don't increase mailboxes' next_uid/highestmodseq.
Timo Sirainen <tss@iki.fi>
parents:
11676
diff
changeset
|
723 if (!failed_changes) { |
b4f029f7793a
dsync: If dsync fails in any way, don't increase mailboxes' next_uid/highestmodseq.
Timo Sirainen <tss@iki.fi>
parents:
11676
diff
changeset
|
724 dsync_worker_update_mailbox(brain->dest_worker, |
b4f029f7793a
dsync: If dsync fails in any way, don't increase mailboxes' next_uid/highestmodseq.
Timo Sirainen <tss@iki.fi>
parents:
11676
diff
changeset
|
725 &mailbox->box); |
b4f029f7793a
dsync: If dsync fails in any way, don't increase mailboxes' next_uid/highestmodseq.
Timo Sirainen <tss@iki.fi>
parents:
11676
diff
changeset
|
726 } |
10373
036db604f86c
dsync: Fixed problems with syncing mailbox names that are invalid on other side.
Timo Sirainen <tss@iki.fi>
parents:
10371
diff
changeset
|
727 |
10371 | 728 if (mailbox->src != NULL && mailbox->dest != NULL && |
729 strcmp(mailbox->src->name, mailbox->dest->name) != 0) | |
730 dsync_brain_sync_rename_mailbox(brain, mailbox); | |
9559 | 731 } |
732 } | |
733 | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
734 static void dsync_brain_worker_finished(bool success, void *context) |
9559 | 735 { |
736 struct dsync_brain *brain = context; | |
737 | |
10976
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
738 switch (brain->state) { |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
739 case DSYNC_STATE_SYNC_MSGS_FLUSH: |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
740 case DSYNC_STATE_SYNC_MSGS_FLUSH2: |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
741 case DSYNC_STATE_SYNC_FLUSH: |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
742 case DSYNC_STATE_SYNC_FLUSH2: |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
743 break; |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
744 default: |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
745 i_panic("dsync brain state=%d", brain->state); |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
746 } |
f6c2c0866aff
dsync: Added extra sanity check.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
747 |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
748 if (!success) |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
749 dsync_brain_fail(brain); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
750 |
9559 | 751 brain->state++; |
752 dsync_brain_sync(brain); | |
753 } | |
754 | |
755 void dsync_brain_sync(struct dsync_brain *brain) | |
756 { | |
757 switch (brain->state) { | |
758 case DSYNC_STATE_GET_MAILBOXES: | |
759 i_assert(brain->src_mailbox_list == NULL); | |
760 brain->src_mailbox_list = | |
761 dsync_brain_mailbox_list_init(brain, brain->src_worker); | |
762 brain->dest_mailbox_list = | |
763 dsync_brain_mailbox_list_init(brain, brain->dest_worker); | |
764 dsync_worker_mailbox_input(brain->src_mailbox_list); | |
765 dsync_worker_mailbox_input(brain->dest_mailbox_list); | |
766 break; | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
767 case DSYNC_STATE_GET_SUBSCRIPTIONS: |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
768 i_assert(brain->src_subs_list == NULL); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
769 brain->src_subs_list = |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
770 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
|
771 brain->dest_subs_list = |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
772 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
|
773 dsync_worker_subs_input(brain->src_subs_list); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
774 dsync_worker_subs_input(brain->dest_subs_list); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
775 break; |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
776 case DSYNC_STATE_SYNC_MAILBOXES: |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
777 dsync_brain_sync_mailboxes(brain); |
11524
c955d4789553
dsync: Fixed syncing \noselect mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10976
diff
changeset
|
778 dsync_brain_sync_dirs(brain); |
9559 | 779 brain->state++; |
780 /* fall through */ | |
10328
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
781 case DSYNC_STATE_SYNC_SUBSCRIPTIONS: |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
782 dsync_brain_sync_subscriptions(brain); |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
783 brain->state++; |
b63fd6156663
dsync: Added support for subscription syncing.
Timo Sirainen <tss@iki.fi>
parents:
10323
diff
changeset
|
784 /* 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
|
785 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
|
786 dsync_brain_sync_msgs(brain); |
9559 | 787 break; |
10323
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
788 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
|
789 /* 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
|
790 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
|
791 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
|
792 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
|
793 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
|
794 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
|
795 break; |
513cff2a7008
dsync: Wait for all saves to finish before updating mailboxes' metadata.
Timo Sirainen <tss@iki.fi>
parents:
10217
diff
changeset
|
796 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
|
797 break; |
10371 | 798 case DSYNC_STATE_SYNC_UPDATE_MAILBOXES: |
799 dsync_brain_sync_update_mailboxes(brain); | |
9559 | 800 brain->state++; |
801 /* fall through */ | |
802 case DSYNC_STATE_SYNC_FLUSH: | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
803 dsync_worker_finish(brain->src_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
804 dsync_brain_worker_finished, brain); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
805 dsync_worker_finish(brain->dest_worker, |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
806 dsync_brain_worker_finished, brain); |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
807 break; |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
808 case DSYNC_STATE_SYNC_FLUSH2: |
9559 | 809 break; |
810 case DSYNC_STATE_SYNC_END: | |
811 master_service_stop(master_service); | |
812 break; | |
9736
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
813 default: |
d9a96da46d4a
dsync: Lots of updates and fixes.
Timo Sirainen <tss@iki.fi>
parents:
9686
diff
changeset
|
814 i_unreached(); |
9559 | 815 } |
816 } | |
10354
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
817 |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
818 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
|
819 { |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
820 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
|
821 |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
822 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
|
823 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
|
824 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
|
825 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
|
826 } |
22ffa2eb68c0
dsync convert <source> converts mailbox without proxying. Renamed -e parameter to "mirror".
Timo Sirainen <tss@iki.fi>
parents:
10331
diff
changeset
|
827 } |
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
|
828 |
9f2e8d230bd5
dsync: If some uid/modseq changes couldn't be done, exit with different value.
Timo Sirainen <tss@iki.fi>
parents:
10356
diff
changeset
|
829 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
|
830 { |
11676
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
831 return brain->unexpected_changes || |
cf7f6912af02
dsync: Added backup command, which syncs source to destination, discarding any changes in dest.
Timo Sirainen <tss@iki.fi>
parents:
11524
diff
changeset
|
832 dsync_worker_has_unexpected_changes(brain->src_worker) || |
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
|
833 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
|
834 } |