annotate src/dsync/dsync-brain.c @ 9559:34eef8a2716b HEAD

dsync: Initial implementation.
author Timo Sirainen <tss@iki.fi>
date Mon, 29 Jun 2009 22:04:23 -0400
parents
children 7b0bcf423fca
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9559
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "hash.h"
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "master-service.h"
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "dsync-worker.h"
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "dsync-brain-private.h"
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 static void
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 dsync_brain_mailbox_list_deinit(struct dsync_brain_mailbox_list **list);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 static void dsync_brain_msg_sync_deinit(struct dsync_brain_mailbox_sync **sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 struct dsync_brain *dsync_brain_init(struct dsync_worker *src_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 struct dsync_worker *dest_worker)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 struct dsync_brain *brain;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 brain = i_new(struct dsync_brain, 1);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 brain->src_worker = src_worker;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 brain->dest_worker = dest_worker;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 return brain;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 static void dsync_brain_fail(struct dsync_brain *brain)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 brain->failed = TRUE;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 master_service_stop(master_service);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 int dsync_brain_deinit(struct dsync_brain **_brain)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 struct dsync_brain *brain = *_brain;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 int ret = brain->failed ? -1 : 0;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 if (brain->mailbox_sync != NULL)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 dsync_brain_msg_sync_deinit(&brain->mailbox_sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 if (brain->src_mailbox_list != NULL)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 dsync_brain_mailbox_list_deinit(&brain->src_mailbox_list);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 if (brain->dest_mailbox_list != NULL)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 dsync_brain_mailbox_list_deinit(&brain->dest_mailbox_list);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 *_brain = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 i_free(brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 return ret;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 static void dsync_brain_mailbox_list_finished(struct dsync_brain *brain)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 if (brain->src_mailbox_list->iter != NULL ||
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 brain->dest_mailbox_list->iter != NULL)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 return;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 /* both lists are finished */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 brain->state++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 dsync_brain_sync(brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 static void dsync_worker_mailbox_input(void *context)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 struct dsync_brain_mailbox_list *list = context;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 struct dsync_mailbox dsync_box, *dup_box;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 int ret;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 while ((ret = dsync_worker_mailbox_iter_next(list->iter,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 &dsync_box)) > 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 dup_box = dsync_mailbox_dup(list->pool, &dsync_box);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 array_append(&list->mailboxes, &dup_box, 1);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 if (ret < 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 /* finished listing mailboxes */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 if (dsync_worker_mailbox_iter_deinit(&list->iter) < 0)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 dsync_brain_fail(list->brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 array_sort(&list->mailboxes, dsync_mailbox_p_guid_cmp);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 dsync_brain_mailbox_list_finished(list->brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 static struct dsync_brain_mailbox_list *
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 dsync_brain_mailbox_list_init(struct dsync_brain *brain,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 struct dsync_worker *worker)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 struct dsync_brain_mailbox_list *list;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 pool_t pool;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 pool = pool_alloconly_create("dsync brain mailbox list", 10240);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 list = p_new(pool, struct dsync_brain_mailbox_list, 1);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 list->pool = pool;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 list->brain = brain;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 list->worker = worker;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 list->iter = dsync_worker_mailbox_iter_init(worker);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 p_array_init(&list->mailboxes, pool, 128);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 dsync_worker_set_input_callback(worker, dsync_worker_mailbox_input,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 list);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 return list;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 static void
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 dsync_brain_mailbox_list_deinit(struct dsync_brain_mailbox_list **_list)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 struct dsync_brain_mailbox_list *list = *_list;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 *_list = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 if (list->iter != NULL)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 (void)dsync_worker_mailbox_iter_deinit(&list->iter);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 pool_unref(&list->pool);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 static void dsync_brain_create_missing_mailboxes(struct dsync_brain *brain)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 struct dsync_mailbox *const *src_boxes, *const *dest_boxes, new_box;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 unsigned int src, dest, src_count, dest_count;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 int ret;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 /* FIXME: handle different hierarchy separators? */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 memset(&new_box, 0, sizeof(new_box));
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 /* find mailboxes from source whose GUIDs don't exist in dest.
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 the mailboxes are sorted by GUID, so we can do this quickly. */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 src_boxes = array_get(&brain->src_mailbox_list->mailboxes, &src_count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 dest_boxes = array_get(&brain->dest_mailbox_list->mailboxes, &dest_count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 for (src = dest = 0; src < src_count && dest < dest_count; ) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 ret = dsync_mailbox_guid_cmp(src_boxes[src], dest_boxes[dest]);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 if (ret == 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 src++; dest++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 } else if (ret < 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 /* exists only in source */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 new_box = *src_boxes[src];
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 new_box.uid_next = 0;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 new_box.highest_modseq = 0;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 dsync_worker_create_mailbox(brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 &new_box);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 src++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 } else {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 /* exists only in dest */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 dest++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 for (; src < src_count; src++) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 new_box = *src_boxes[src];
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 new_box.uid_next = 0;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 new_box.highest_modseq = 0;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 dsync_worker_create_mailbox(brain->dest_worker, &new_box);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 static void dsync_brain_guid_add(struct dsync_brain_mailbox_sync *sync,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 struct dsync_brain_msg_iter *iter)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 struct dsync_brain_guid_instance *inst, *prev_inst;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 inst = p_new(sync->pool, struct dsync_brain_guid_instance, 1);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 inst->mailbox_idx = iter->mailbox_idx;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 inst->uid = iter->msg.uid;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 prev_inst = hash_table_lookup(sync->guid_hash, iter->msg.guid);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 if (prev_inst == NULL) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 hash_table_insert(sync->guid_hash,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 p_strdup(sync->pool, iter->msg.guid), inst);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 } else {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 inst->next = prev_inst->next;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 prev_inst->next = inst;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 static int dsync_brain_msg_iter_next(struct dsync_brain_msg_iter *iter)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 int ret = 1;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 if (iter->msg.guid == NULL) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 ret = dsync_worker_msg_iter_next(iter->iter, &iter->mailbox_idx,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 &iter->msg);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 if (ret > 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 if (iter->save_guids)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 dsync_brain_guid_add(iter->sync, iter);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 if (iter->wanted_mailbox_idx != iter->mailbox_idx) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 /* finished with this mailbox */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 return -1;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 return ret;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 static int dsync_brain_msg_iter_next_pair(struct dsync_brain_mailbox_sync *sync)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 int ret;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 if ((ret = dsync_brain_msg_iter_next(sync->src_msg_iter)) <= 0)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 return ret;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 if ((ret = dsync_brain_msg_iter_next(sync->dest_msg_iter)) <= 0)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 return ret;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 return 1;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 static void
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 dsync_brain_msg_sync_save_source(struct dsync_brain_mailbox_sync *sync)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 struct dsync_brain_new_msg *new_msg;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 new_msg = array_append_space(&sync->new_msgs);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 new_msg->mailbox_idx = sync->src_msg_iter->mailbox_idx;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 new_msg->msg = dsync_message_dup(sync->pool, &sync->src_msg_iter->msg);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 static void dsync_brain_msg_sync_existing(struct dsync_brain *brain,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 struct dsync_message *src_msg,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 struct dsync_message *dest_msg)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 if (src_msg->flags != dest_msg->flags ||
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 src_msg->modseq > dest_msg->modseq ||
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 !dsync_keyword_list_equals(src_msg->keywords, dest_msg->keywords))
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 dsync_worker_msg_update_metadata(brain->dest_worker, src_msg);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 static int dsync_brain_msg_sync_pair(struct dsync_brain_mailbox_sync *sync)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 struct dsync_message *src_msg = &sync->src_msg_iter->msg;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 struct dsync_message *dest_msg = &sync->dest_msg_iter->msg;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 struct dsync_brain_uid_conflict *conflict;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 if (src_msg->uid < dest_msg->uid) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 /* message has been expunged from dest. ignore it, unless
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 we're in uid-conflict mode. */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 if (sync->uid_conflict)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 dsync_brain_msg_sync_save_source(sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 src_msg->guid = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 } else if (src_msg->uid > dest_msg->uid) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 /* message has been expunged from src. expunge it from dest
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 too, unless we're in uid-conflict mode. */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 if (!sync->uid_conflict) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 dsync_worker_msg_expunge(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 dest_msg->uid);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 dest_msg->guid = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 } else if (strcmp(src_msg->guid, dest_msg->guid) == 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 /* message exists, sync metadata */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 dsync_brain_msg_sync_existing(sync->brain, src_msg, dest_msg);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 src_msg->guid = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 dest_msg->guid = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 } else {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 /* UID conflict */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 sync->uid_conflict = TRUE;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 conflict = array_append_space(&sync->uid_conflicts);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 conflict->mailbox_idx = sync->src_msg_iter->mailbox_idx;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 conflict->uid = dest_msg->uid;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 dsync_brain_msg_sync_save_source(sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 src_msg->guid = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 dest_msg->guid = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 return 0;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 static bool
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 dsync_brain_msg_sync_mailbox_more(struct dsync_brain_mailbox_sync *sync)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 struct dsync_mailbox *const *boxp;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 int ret;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 while ((ret = dsync_brain_msg_iter_next_pair(sync)) > 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 if (dsync_brain_msg_sync_pair(sync) < 0)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 break;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 if (dsync_worker_is_output_full(sync->brain->dest_worker))
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 return FALSE;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 if (ret == 0)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 return FALSE;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 /* finished syncing messages in this mailbox that exist in both source
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 and destination. if there are any messages left in destination,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 expunge them if possible and add their GUIDs to hash in any case. */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 boxp = array_idx(&sync->brain->src_mailbox_list->mailboxes,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 sync->src_msg_iter->wanted_mailbox_idx);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 while ((ret = dsync_brain_msg_iter_next(sync->dest_msg_iter)) > 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 if (sync->dest_msg_iter->msg.uid >= (*boxp)->uid_next)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 sync->uid_conflict = TRUE;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 if (!sync->uid_conflict) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 dsync_worker_msg_expunge(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 sync->dest_msg_iter->msg.uid);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 sync->dest_msg_iter->msg.guid = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 if (ret == 0)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 return FALSE;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 /* if there are any messages left in source, we'll copy all of them */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 while ((ret = dsync_brain_msg_iter_next(sync->src_msg_iter)) > 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 dsync_brain_msg_sync_save_source(sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 sync->src_msg_iter->msg.guid = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 if (ret == 0)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 return FALSE;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 /* done with this mailbox. the same iterator is still used for
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 getting messages from other mailboxes. */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 return TRUE;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 static void dsync_brain_msg_sync_finish(struct dsync_brain_mailbox_sync *sync)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 /* synced all existing messages. now add the new messages. */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 if (dsync_worker_msg_iter_deinit(&sync->src_msg_iter->iter) < 0 ||
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 dsync_worker_msg_iter_deinit(&sync->dest_msg_iter->iter))
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 dsync_brain_fail(sync->brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 sync->brain->state++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 dsync_brain_sync(sync->brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 static void dsync_brain_msg_sync_more(struct dsync_brain_mailbox_sync *sync)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 struct dsync_mailbox *const *mailboxes;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 unsigned int count, mailbox_idx;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 mailboxes = array_get(&sync->brain->src_mailbox_list->mailboxes,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 &count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 while (dsync_brain_msg_sync_mailbox_more(sync)) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 /* sync the next mailbox */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 mailbox_idx = ++sync->src_msg_iter->wanted_mailbox_idx;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 sync->dest_msg_iter->wanted_mailbox_idx++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 if (mailbox_idx == count) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 dsync_brain_msg_sync_finish(sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 return;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 dsync_worker_select_mailbox(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 &mailboxes[mailbox_idx]->guid);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 static void dsync_worker_msg_callback(void *context)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 struct dsync_brain_mailbox_sync *sync = context;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 dsync_brain_msg_sync_more(sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 static struct dsync_brain_msg_iter *
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 dsync_brain_msg_iter_init(struct dsync_brain_mailbox_sync *sync,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 struct dsync_worker *worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 const mailbox_guid_t mailboxes[],
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 unsigned int mailbox_count)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 struct dsync_brain_msg_iter *iter;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 iter = p_new(sync->pool, struct dsync_brain_msg_iter, 1);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 iter->sync = sync;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 iter->worker = worker;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 iter->iter = dsync_worker_msg_iter_init(worker, mailboxes,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 mailbox_count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 dsync_worker_set_input_callback(worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 dsync_worker_msg_callback, sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 dsync_worker_set_output_callback(worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 dsync_worker_msg_callback, sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 return iter;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 static struct dsync_brain_mailbox_sync *
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 dsync_brain_msg_sync_init(struct dsync_brain *brain)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 struct dsync_brain_mailbox_sync *sync;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 ARRAY_DEFINE(guids, mailbox_guid_t);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 struct dsync_mailbox *const *mailboxes;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 unsigned int i, count;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 pool_t pool;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 /* initialize message iteration on both workers */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 mailboxes = array_get(&brain->src_mailbox_list->mailboxes, &count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 t_array_init(&guids, count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 for (i = 0; i < count; i++)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 array_append(&guids, &mailboxes[i]->guid, 1);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 pool = pool_alloconly_create("dsync brain mailbox sync", 1024*256);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 sync = p_new(pool, struct dsync_brain_mailbox_sync, 1);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 sync->pool = pool;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 sync->brain = brain;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 i_array_init(&sync->uid_conflicts, 128);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 i_array_init(&sync->new_msgs, 128);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 i_array_init(&sync->copy_retry_indexes, 32);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 sync->src_msg_iter =
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 dsync_brain_msg_iter_init(sync, brain->src_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 array_idx(&guids, 0), count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 sync->dest_msg_iter =
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 dsync_brain_msg_iter_init(sync, brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 array_idx(&guids, 0), count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 sync->guid_hash = hash_table_create(default_pool, pool, 10000,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 strcase_hash,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 (hash_cmp_callback_t *)strcasecmp);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 sync->dest_msg_iter->save_guids = TRUE;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 return sync;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 static void dsync_brain_msg_sync_deinit(struct dsync_brain_mailbox_sync **_sync)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 struct dsync_brain_mailbox_sync *sync = *_sync;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 *_sync = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 if (sync->src_msg_iter->iter != NULL)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 (void)dsync_worker_msg_iter_deinit(&sync->src_msg_iter->iter);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 if (sync->dest_msg_iter->iter != NULL)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 (void)dsync_worker_msg_iter_deinit(&sync->dest_msg_iter->iter);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409 hash_table_destroy(&sync->guid_hash);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 array_free(&sync->uid_conflicts);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 array_free(&sync->new_msgs);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412 array_free(&sync->copy_retry_indexes);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 pool_unref(&sync->pool);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 static void dsync_brain_sync_existing_mailboxes(struct dsync_brain *brain)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418 brain->mailbox_sync = dsync_brain_msg_sync_init(brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 dsync_brain_msg_sync_more(brain->mailbox_sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 static int
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 dsync_brain_msg_sync_add_new_msg(struct dsync_brain_mailbox_sync *sync,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 const struct dsync_mailbox *src_mailbox,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 unsigned int msg_idx,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 const struct dsync_message *msg)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 const struct dsync_brain_guid_instance *inst;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 struct dsync_mailbox *const *inst_box;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 struct dsync_msg_static_data data;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 int ret;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 inst = hash_table_lookup(sync->guid_hash, msg->guid);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 if (inst != NULL) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 /* we can save this by copying an existing message */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 dsync_worker_select_mailbox(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 &src_mailbox->guid);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 dsync_worker_set_next_result_tag(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 msg_idx+1);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 inst_box = array_idx(&sync->brain->src_mailbox_list->mailboxes,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441 inst->mailbox_idx);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 dsync_worker_msg_copy(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 &(*inst_box)->guid, inst->uid, msg);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 sync->copy_results_left++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 } else {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 dsync_worker_select_mailbox(sync->brain->src_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 &src_mailbox->guid);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 ret = dsync_worker_msg_get(sync->brain->src_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 msg->uid, &data);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 if (ret <= 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 if (ret == 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 /* mail got expunged during sync.
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 just skip this. */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 return 1;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 } else {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 dsync_brain_fail(sync->brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 return -1;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 dsync_worker_select_mailbox(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 &src_mailbox->guid);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 dsync_worker_msg_save(sync->brain->dest_worker, msg, &data);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 return dsync_worker_is_output_full(sync->brain->dest_worker) ? 0 : 1;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 static void
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 dsync_brain_msg_sync_add_new_msgs(struct dsync_brain_mailbox_sync *sync)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 struct dsync_mailbox *const *mailboxes, *mailbox;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 const struct dsync_brain_new_msg *msgs;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472 unsigned int i, mailbox_count, msg_count;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474 mailboxes = array_get(&sync->brain->src_mailbox_list->mailboxes,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
475 &mailbox_count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476 msgs = array_get(&sync->new_msgs, &msg_count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 for (i = sync->next_new_msg; i < msg_count; i++) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 mailbox = mailboxes[msgs[i].mailbox_idx];
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 if (dsync_brain_msg_sync_add_new_msg(sync, mailbox, i,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480 msgs[i].msg) <= 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481 /* failed / continue later */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482 sync->next_new_msg = i + 1;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483 return;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
485 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
487 /* all messages sent */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488 if (sync->copy_results_left == 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
489 sync->brain->state++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
490 dsync_brain_sync(sync->brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
492 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494 static void dsync_worker_copy_input(void *context)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
495 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
496 struct dsync_brain_mailbox_sync *sync = context;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497 struct dsync_brain_guid_instance *inst;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 const struct dsync_brain_new_msg *msgs;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 unsigned int count;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500 uint32_t tag;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501 int result;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
502
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
503 msgs = array_get(&sync->new_msgs, &count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
504 while (dsync_worker_get_next_result(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505 &tag, &result)) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
506 if (tag == 0 || tag > count) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
507 i_error("Worker sent result with invalid tag %u", tag);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
508 dsync_brain_fail(sync->brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
509 return;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
510 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
511 tag--;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
512 if (sync->copy_results_left == 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513 i_error("Worker sent unexpected result");
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514 dsync_brain_fail(sync->brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515 return;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
516 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
517 sync->copy_results_left--;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518 if (result < 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 /* mark the guid instance invalid and try again later */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
520 inst = hash_table_lookup(sync->guid_hash,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521 msgs[tag].msg->guid);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
522 inst->failed = TRUE;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
523 array_append(&sync->copy_retry_indexes, &tag, 1);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 if (sync->copy_results_left == 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527 sync->brain->state++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 dsync_brain_sync(sync->brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
530 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 static void dsync_worker_new_msg_output(void *context)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
534 struct dsync_brain_mailbox_sync *sync = context;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
535
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
536 dsync_brain_msg_sync_add_new_msgs(sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539 static void
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540 dsync_brain_msg_sync_new_msgs(struct dsync_brain_mailbox_sync *sync)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
542 dsync_worker_set_input_callback(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543 dsync_worker_copy_input, sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 dsync_worker_set_output_callback(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
545 dsync_worker_new_msg_output, sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
546 dsync_brain_msg_sync_add_new_msgs(sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
547 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
549 static void
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
550 dsync_brain_msg_sync_retry_copies(struct dsync_brain_mailbox_sync *sync)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
551 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 const uint32_t *indexes;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553 struct dsync_mailbox *const *mailboxes, *mailbox;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
554 const struct dsync_brain_new_msg *msgs;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 unsigned int i, msg_idx, idx_count, msg_count, mailbox_count;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556 struct dsync_brain_guid_instance *inst;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557 const char *guid_str;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558 void *orig_key, *orig_value;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560 /* first remove GUID instances that had failed. */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 msgs = array_get(&sync->new_msgs, &msg_count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
562 indexes = array_get(&sync->copy_retry_indexes, &idx_count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563 for (i = 0; i < idx_count; i++) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 guid_str = msgs[indexes[i]].msg->guid;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 if (hash_table_lookup_full(sync->guid_hash, guid_str,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 &orig_key, &orig_value))
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567 inst = orig_value;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
568 else
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569 inst = NULL;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
570 if (inst != NULL && inst->failed) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
571 inst = inst->next;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
572 if (inst == NULL)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
573 hash_table_remove(sync->guid_hash, guid_str);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
574 else {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575 hash_table_update(sync->guid_hash, orig_key,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
576 inst);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
577 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
579 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
581 /* try saving again. there probably weren't many of them, so don't
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
582 worry about filling output buffer. */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583 mailboxes = array_get(&sync->brain->src_mailbox_list->mailboxes,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
584 &mailbox_count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
585 for (i = 0; i < idx_count; i++) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586 msg_idx = indexes[i];
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587 mailbox = mailboxes[msgs[msg_idx].mailbox_idx];
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588 (void)dsync_brain_msg_sync_add_new_msg(sync, mailbox, msg_idx,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589 msgs[msg_idx].msg);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
591
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 /* if we copied anything, we'll again have to wait for the results */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593 array_clear(&sync->copy_retry_indexes);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594 dsync_worker_set_output_callback(sync->brain->dest_worker, NULL, NULL);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 if (sync->copy_results_left == 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597 dsync_worker_set_input_callback(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
598 NULL, NULL);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 sync->brain->state++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
600 dsync_brain_sync(sync->brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 } else {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602 /* temporarily move back the state. once copies have returned
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603 success/failures, we'll get back to this function and see
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
604 if we need to retry again */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
605 sync->brain->state--;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
606 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
607 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
608
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609 static void
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
610 dsync_brain_msg_sync_update_mailbox(struct dsync_brain *brain)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612 struct dsync_mailbox *const *mailboxes;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613 unsigned int i, count;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
614
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
615 mailboxes = array_get(&brain->src_mailbox_list->mailboxes, &count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
616 for (i = 0; i < count; i++)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
617 dsync_worker_update_mailbox(brain->dest_worker, mailboxes[i]);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
618 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
619
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
620 static void
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
621 dsync_brain_msg_sync_resolve_uid_conflicts(struct dsync_brain_mailbox_sync *sync)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
622 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
623 const struct dsync_brain_uid_conflict *conflicts;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
624 struct dsync_mailbox *const *mailboxes, *mailbox;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
625 unsigned int i, count, mailbox_count;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
626
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
627 mailboxes = array_get(&sync->brain->src_mailbox_list->mailboxes,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
628 &mailbox_count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
629 conflicts = array_get(&sync->uid_conflicts, &count);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
630 for (i = 0; i < count; i++) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
631 mailbox = mailboxes[conflicts[i].mailbox_idx];
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
632 dsync_worker_select_mailbox(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
633 &mailbox->guid);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
634 dsync_worker_msg_update_uid(sync->brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
635 conflicts[i].uid);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
636 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
637 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
638
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
639 static void dsync_worker_flush_callback(void *context)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
640 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
641 struct dsync_brain *brain = context;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
642 int ret;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
644 if ((ret = dsync_worker_output_flush(brain->dest_worker)) <= 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
645 if (ret < 0)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
646 dsync_brain_fail(brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647 return;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
649 brain->state++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
650 dsync_brain_sync(brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
652
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
653 void dsync_brain_sync(struct dsync_brain *brain)
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
655 switch (brain->state) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
656 case DSYNC_STATE_GET_MAILBOXES:
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
657 i_assert(brain->src_mailbox_list == NULL);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
658 brain->src_mailbox_list =
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659 dsync_brain_mailbox_list_init(brain, brain->src_worker);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660 brain->dest_mailbox_list =
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
661 dsync_brain_mailbox_list_init(brain, brain->dest_worker);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
662 dsync_worker_mailbox_input(brain->src_mailbox_list);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
663 dsync_worker_mailbox_input(brain->dest_mailbox_list);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
664 break;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
665 case DSYNC_STATE_CREATE_MAILBOXES:
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
666 if (array_count(&brain->src_mailbox_list->mailboxes) == 0) {
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
667 /* no mailboxes */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
668 i_error("No source mailboxes");
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
669 dsync_brain_fail(brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
670 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
671
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
672 /* FIXME: maybe wait and verify that all mailboxes are
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
673 created successfully? */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
674 dsync_brain_create_missing_mailboxes(brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
675 brain->state++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
676 /* fall through */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
677 case DSYNC_STATE_SYNC_EXISTING_MSGS:
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
678 dsync_brain_sync_existing_mailboxes(brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
679 break;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
680 case DSYNC_STATE_SYNC_NEW_MSGS:
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
681 dsync_brain_msg_sync_new_msgs(brain->mailbox_sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
682 break;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
683 case DSYNC_STATE_SYNC_RETRY_COPIES:
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
684 dsync_brain_msg_sync_retry_copies(brain->mailbox_sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
685 break;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686 case DSYNC_STATE_SYNC_UPDATE_MAILBOX:
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 dsync_brain_msg_sync_update_mailbox(brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 brain->state++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689 /* fall through */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690 case DSYNC_STATE_SYNC_RESOLVE_UID_CONFLICTS:
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691 /* resolve uid conflicts after uid_nexts have been updated,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692 so that it won't again collide uids */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
693 dsync_brain_msg_sync_resolve_uid_conflicts(brain->mailbox_sync);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
694 brain->state++;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
695 /* fall through */
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
696 case DSYNC_STATE_SYNC_FLUSH:
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
697 dsync_worker_set_output_callback(brain->dest_worker,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
698 dsync_worker_flush_callback,
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
699 brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
700 dsync_worker_flush_callback(brain);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
701 break;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 case DSYNC_STATE_SYNC_END:
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
703 master_service_stop(master_service);
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
704 break;
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
705 }
34eef8a2716b dsync: Initial implementation.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
706 }