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