dsync-brain-mailbox-tree.c (dovecot-2.3.16) | : | dsync-brain-mailbox-tree.c (dovecot-2.3.17) | ||
---|---|---|---|---|
skipping to change at line 320 | skipping to change at line 320 | |||
static void dsync_brain_mailbox_trees_sync(struct dsync_brain *brain) | static void dsync_brain_mailbox_trees_sync(struct dsync_brain *brain) | |||
{ | { | |||
struct dsync_mailbox_tree_sync_ctx *ctx; | struct dsync_mailbox_tree_sync_ctx *ctx; | |||
const struct dsync_mailbox_tree_sync_change *change; | const struct dsync_mailbox_tree_sync_change *change; | |||
enum dsync_mailbox_trees_sync_type sync_type; | enum dsync_mailbox_trees_sync_type sync_type; | |||
enum dsync_mailbox_trees_sync_flags sync_flags = | enum dsync_mailbox_trees_sync_flags sync_flags = | |||
(brain->debug ? DSYNC_MAILBOX_TREES_SYNC_FLAG_DEBUG : 0) | | (brain->debug ? DSYNC_MAILBOX_TREES_SYNC_FLAG_DEBUG : 0) | | |||
(brain->master_brain ? DSYNC_MAILBOX_TREES_SYNC_FLAG_MASTER_BRAIN : 0) | | (brain->master_brain ? DSYNC_MAILBOX_TREES_SYNC_FLAG_MASTER_BRAIN : 0) | | |||
(brain->no_mailbox_renames ? DSYNC_MAILBOX_TREES_SYNC_FLAG_NO_REN AMES : 0); | (brain->no_mailbox_renames ? DSYNC_MAILBOX_TREES_SYNC_FLAG_NO_REN AMES : 0); | |||
int ret; | ||||
if (brain->no_backup_overwrite) | if (brain->no_backup_overwrite) | |||
sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY; | sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY; | |||
else if (brain->backup_send) | else if (brain->backup_send) | |||
sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_LOCAL; | sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_LOCAL; | |||
else if (brain->backup_recv) | else if (brain->backup_recv) | |||
sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_REMOTE; | sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_REMOTE; | |||
else | else | |||
sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY; | sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY; | |||
ctx = dsync_mailbox_trees_sync_init(brain->local_mailbox_tree, | ctx = dsync_mailbox_trees_sync_init(brain->local_mailbox_tree, | |||
brain->remote_mailbox_tree, | brain->remote_mailbox_tree, | |||
sync_type, sync_flags); | sync_type, sync_flags); | |||
while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) { | while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) { | |||
if (dsync_brain_mailbox_tree_sync_change(brain, change, | T_BEGIN { | |||
&brain->mail_error) < 0) | ret = dsync_brain_mailbox_tree_sync_change( | |||
{ | brain, change, &brain->mail_error); | |||
} T_END; | ||||
if (ret < 0) { | ||||
brain->failed = TRUE; | brain->failed = TRUE; | |||
break; | break; | |||
} | } | |||
} | } | |||
if (dsync_mailbox_trees_sync_deinit(&ctx) < 0) | if (dsync_mailbox_trees_sync_deinit(&ctx) < 0) | |||
brain->failed = TRUE; | brain->failed = TRUE; | |||
} | } | |||
static int | ||||
dsync_brain_recv_mailbox_tree_add(struct dsync_brain *brain, | ||||
const char *const *parts, | ||||
const struct dsync_mailbox_node *remote_node, | ||||
const char *sep) | ||||
{ | ||||
struct dsync_mailbox_node *node; | ||||
struct mail_namespace *ns; | ||||
const char *name; | ||||
if (dsync_get_mailbox_name(brain, parts, &name, &ns) < 0) | ||||
return -1; | ||||
if (brain->debug) { | ||||
i_debug("brain %c: Remote mailbox tree: %s %s", | ||||
brain->master_brain ? 'M' : 'S', | ||||
t_strarray_join(parts, sep), | ||||
dsync_mailbox_node_to_string(remote_node)); | ||||
} | ||||
node = dsync_mailbox_tree_get(brain->remote_mailbox_tree, name); | ||||
node->ns = ns; | ||||
dsync_mailbox_node_copy_data(node, remote_node); | ||||
return 0; | ||||
} | ||||
bool dsync_brain_recv_mailbox_tree(struct dsync_brain *brain) | bool dsync_brain_recv_mailbox_tree(struct dsync_brain *brain) | |||
{ | { | |||
const struct dsync_mailbox_node *remote_node; | const struct dsync_mailbox_node *remote_node; | |||
struct dsync_mailbox_node *node, *dup_node1, *dup_node2; | struct dsync_mailbox_node *dup_node1, *dup_node2; | |||
const char *const *parts, *name; | const char *const *parts; | |||
struct mail_namespace *ns; | ||||
enum dsync_ibc_recv_ret ret; | enum dsync_ibc_recv_ret ret; | |||
int ret2; | ||||
char sep[2]; | char sep[2]; | |||
bool changed = FALSE; | bool changed = FALSE; | |||
sep[0] = brain->hierarchy_sep; sep[1] = '\0'; | sep[0] = brain->hierarchy_sep; sep[1] = '\0'; | |||
while ((ret = dsync_ibc_recv_mailbox_tree_node(brain->ibc, &parts, | while ((ret = dsync_ibc_recv_mailbox_tree_node(brain->ibc, &parts, | |||
&remote_node)) > 0) { | &remote_node)) > 0) { | |||
if (dsync_get_mailbox_name(brain, parts, &name, &ns) < 0) { | T_BEGIN { | |||
ret2 = dsync_brain_recv_mailbox_tree_add( | ||||
brain, parts, remote_node, sep); | ||||
} T_END; | ||||
if (ret2 < 0) { | ||||
i_error("Couldn't find namespace for mailbox %s", | i_error("Couldn't find namespace for mailbox %s", | |||
t_strarray_join(parts, sep)); | t_strarray_join(parts, sep)); | |||
brain->failed = TRUE; | brain->failed = TRUE; | |||
return TRUE; | return TRUE; | |||
} | } | |||
if (brain->debug) { | ||||
i_debug("brain %c: Remote mailbox tree: %s %s", | ||||
brain->master_brain ? 'M' : 'S', | ||||
t_strarray_join(parts, sep), | ||||
dsync_mailbox_node_to_string(remote_node)); | ||||
} | ||||
node = dsync_mailbox_tree_get(brain->remote_mailbox_tree, name); | ||||
node->ns = ns; | ||||
dsync_mailbox_node_copy_data(node, remote_node); | ||||
} | } | |||
if (ret != DSYNC_IBC_RECV_RET_FINISHED) | if (ret != DSYNC_IBC_RECV_RET_FINISHED) | |||
return changed; | return changed; | |||
if (dsync_mailbox_tree_build_guid_hash(brain->remote_mailbox_tree, | if (dsync_mailbox_tree_build_guid_hash(brain->remote_mailbox_tree, | |||
&dup_node1, &dup_node2) < 0) { | &dup_node1, &dup_node2) < 0) { | |||
i_error("Remote sent duplicate mailbox GUID %s for mailboxes %s a nd %s", | i_error("Remote sent duplicate mailbox GUID %s for mailboxes %s a nd %s", | |||
guid_128_to_string(dup_node1->mailbox_guid), | guid_128_to_string(dup_node1->mailbox_guid), | |||
dsync_mailbox_node_get_full_name(brain->remote_mailbox_tr ee, | dsync_mailbox_node_get_full_name(brain->remote_mailbox_tr ee, | |||
dup_node1), | dup_node1), | |||
End of changes. 7 change blocks. | ||||
16 lines changed or deleted | 38 lines changed or added |