dovecot-2.2: dsync: Added some debugging output for mailbox trees.
dovecot at dovecot.org
dovecot at dovecot.org
Fri Oct 24 01:25:35 UTC 2014
details: http://hg.dovecot.org/dovecot-2.2/rev/3dda0b301c20
changeset: 17993:3dda0b301c20
user: Timo Sirainen <tss at iki.fi>
date: Fri Oct 24 04:24:40 2014 +0300
description:
dsync: Added some debugging output for mailbox trees.
diffstat:
src/doveadm/dsync/dsync-brain-mailbox-tree.c | 50 +++++++++++++++++++++++----
src/doveadm/dsync/dsync-mailbox-tree.c | 24 +++++++++++++
src/doveadm/dsync/dsync-mailbox-tree.h | 4 ++
3 files changed, 70 insertions(+), 8 deletions(-)
diffs (195 lines):
diff -r 2c8d458f120f -r 3dda0b301c20 src/doveadm/dsync/dsync-brain-mailbox-tree.c
--- a/src/doveadm/dsync/dsync-brain-mailbox-tree.c Fri Oct 24 03:58:35 2014 +0300
+++ b/src/doveadm/dsync/dsync-brain-mailbox-tree.c Fri Oct 24 04:24:40 2014 +0300
@@ -66,6 +66,7 @@
dsync_mailbox_tree_iter_init(brain->local_mailbox_tree);
}
+
void dsync_brain_send_mailbox_tree(struct dsync_brain *brain)
{
struct dsync_mailbox_node *node;
@@ -79,6 +80,12 @@
T_BEGIN {
const char *const *parts;
+ if (brain->debug) {
+ i_debug("brain %c: Local mailbox tree: %s %s",
+ brain->master_brain ? 'M' : 'S', full_name,
+ dsync_mailbox_node_to_string(node));
+ }
+
parts = t_strsplit(full_name, sep);
ret = dsync_ibc_send_mailbox_tree_node(brain->ibc,
parts, node);
@@ -301,15 +308,21 @@
char sep[2];
bool changed = FALSE;
+ sep[0] = brain->hierarchy_sep; sep[1] = '\0';
while ((ret = dsync_ibc_recv_mailbox_tree_node(brain->ibc, &parts,
&remote_node)) > 0) {
if (dsync_get_mailbox_name(brain, parts, &name, &ns) < 0) {
- sep[0] = brain->hierarchy_sep; sep[1] = '\0';
i_error("Couldn't find namespace for mailbox %s",
t_strarray_join(parts, sep));
brain->failed = 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);
@@ -335,7 +348,9 @@
static void
dsync_brain_mailbox_tree_add_delete(struct dsync_mailbox_tree *tree,
struct dsync_mailbox_tree *other_tree,
- const struct dsync_mailbox_delete *other_del)
+ const struct dsync_mailbox_delete *other_del,
+ const struct dsync_mailbox_node **node_r,
+ const char **status_r)
{
const struct dsync_mailbox_node *node;
struct dsync_mailbox_node *other_node, *old_node;
@@ -343,9 +358,11 @@
/* see if we can find the deletion based on mailbox tree that should
still have the mailbox */
- node = dsync_mailbox_tree_find_delete(tree, other_del);
- if (node == NULL)
+ node = *node_r = dsync_mailbox_tree_find_delete(tree, other_del);
+ if (node == NULL) {
+ *status_r = "not found";
return;
+ }
switch (other_del->type) {
case DSYNC_MAILBOX_DELETE_TYPE_MAILBOX:
@@ -355,6 +372,7 @@
if (other_del->timestamp <= node->last_renamed_or_created) {
/* we don't want to delete this directory, we already
have a newer timestamp for it */
+ *status_r = "keep directory, we have a newer timestamp";
return;
}
break;
@@ -362,6 +380,7 @@
if (other_del->timestamp <= node->last_subscription_change) {
/* we don't want to unsubscribe, since we already have
a newer subscription timestamp */
+ *status_r = "keep subscription, we have a newer timestamp";
return;
}
break;
@@ -376,6 +395,7 @@
other_del->type != DSYNC_MAILBOX_DELETE_TYPE_MAILBOX)) {
/* other side has already created a new mailbox or
directory with this name, we can't delete it */
+ *status_r = "name has already been recreated";
return;
}
@@ -390,14 +410,17 @@
possible that one side has created mailboxes that conflict
with another namespace's prefix. since we're here because
one of the mailboxes was deleted, we'll just ignore this. */
+ *status_r = "namespace mismatch";
return;
}
other_node->ns = node->ns;
- if (other_del->type != DSYNC_MAILBOX_DELETE_TYPE_UNSUBSCRIBE)
+ if (other_del->type != DSYNC_MAILBOX_DELETE_TYPE_UNSUBSCRIBE) {
other_node->existence = DSYNC_MAILBOX_NODE_DELETED;
- else {
+ *status_r = "marked as deleted";
+ } else {
other_node->last_subscription_change = other_del->timestamp;
other_node->subscribed = FALSE;
+ *status_r = "marked as unsubscribed";
}
if (dsync_mailbox_tree_guid_hash_add(other_tree, other_node,
@@ -407,6 +430,8 @@
bool dsync_brain_recv_mailbox_tree_deletes(struct dsync_brain *brain)
{
+ const struct dsync_mailbox_node *node;
+ const char *status;
const struct dsync_mailbox_delete *deletes;
unsigned int i, count;
char sep;
@@ -420,7 +445,16 @@
for (i = 0; i < count; i++) {
dsync_brain_mailbox_tree_add_delete(brain->local_mailbox_tree,
brain->remote_mailbox_tree,
- &deletes[i]);
+ &deletes[i], &node, &status);
+ if (brain->debug) {
+ const char *node_name = node == NULL ? "" :
+ dsync_mailbox_node_get_full_name(brain->local_mailbox_tree, node);
+ i_debug("brain %c: Remote mailbox tree deletion: guid=%s type=%s timestamp=%ld name=%s local update=%s",
+ brain->master_brain ? 'M' : 'S',
+ guid_128_to_string(deletes[i].guid),
+ dsync_mailbox_delete_type_to_string(deletes[i].type),
+ deletes[i].timestamp, node_name, status);
+ }
}
/* apply local mailbox deletions based on remote tree */
@@ -431,7 +465,7 @@
for (i = 0; i < count; i++) {
dsync_brain_mailbox_tree_add_delete(brain->remote_mailbox_tree,
brain->local_mailbox_tree,
- &deletes[i]);
+ &deletes[i], &node, &status);
}
dsync_brain_mailbox_trees_sync(brain);
diff -r 2c8d458f120f -r 3dda0b301c20 src/doveadm/dsync/dsync-mailbox-tree.c
--- a/src/doveadm/dsync/dsync-mailbox-tree.c Fri Oct 24 03:58:35 2014 +0300
+++ b/src/doveadm/dsync/dsync-mailbox-tree.c Fri Oct 24 04:24:40 2014 +0300
@@ -494,3 +494,27 @@
} T_END;
return ret;
}
+
+const char *dsync_mailbox_node_to_string(const struct dsync_mailbox_node *node)
+{
+ return t_strdup_printf("guid=%s uid_validity=%u uid_next=%u subs=%s last_change=%ld last_subs=%ld",
+ guid_128_to_string(node->mailbox_guid),
+ node->uid_validity, node->uid_next,
+ node->subscribed ? "yes" : "no",
+ (long)node->last_renamed_or_created,
+ (long)node->last_subscription_change);
+}
+
+const char *
+dsync_mailbox_delete_type_to_string(enum dsync_mailbox_delete_type type)
+{
+ switch (type) {
+ case DSYNC_MAILBOX_DELETE_TYPE_MAILBOX:
+ return "mailbox";
+ case DSYNC_MAILBOX_DELETE_TYPE_DIR:
+ return "dir";
+ case DSYNC_MAILBOX_DELETE_TYPE_UNSUBSCRIBE:
+ return "unsubscribe";
+ }
+ return t_strdup_printf("unknown #%u", type);
+}
diff -r 2c8d458f120f -r 3dda0b301c20 src/doveadm/dsync/dsync-mailbox-tree.h
--- a/src/doveadm/dsync/dsync-mailbox-tree.h Fri Oct 24 03:58:35 2014 +0300
+++ b/src/doveadm/dsync/dsync-mailbox-tree.h Fri Oct 24 04:24:40 2014 +0300
@@ -188,4 +188,8 @@
dsync_mailbox_trees_sync_next(struct dsync_mailbox_tree_sync_ctx *ctx);
void dsync_mailbox_trees_sync_deinit(struct dsync_mailbox_tree_sync_ctx **ctx);
+const char *dsync_mailbox_node_to_string(const struct dsync_mailbox_node *node);
+const char *
+dsync_mailbox_delete_type_to_string(enum dsync_mailbox_delete_type type);
+
#endif
More information about the dovecot-cvs
mailing list