dovecot-2.2: doveadm backup: If -D parameter is given, log the r...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Oct 21 21:38:25 EEST 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/cce994007aad
changeset: 16859:cce994007aad
user: Timo Sirainen <tss at iki.fi>
date: Mon Oct 21 21:38:17 2013 +0300
description:
doveadm backup: If -D parameter is given, log the reason why mailbox gets deleted.
diffstat:
src/doveadm/dsync/dsync-brain-mailbox-tree.c | 5 +-
src/doveadm/dsync/dsync-mailbox-tree-sync.c | 68 +++++++++++++++++------
src/doveadm/dsync/dsync-mailbox-tree.h | 11 +++-
src/doveadm/dsync/test-dsync-mailbox-tree-sync.c | 4 +-
4 files changed, 66 insertions(+), 22 deletions(-)
diffs (255 lines):
diff -r 7bd65a83a9a3 -r cce994007aad src/doveadm/dsync/dsync-brain-mailbox-tree.c
--- a/src/doveadm/dsync/dsync-brain-mailbox-tree.c Mon Oct 21 20:47:53 2013 +0300
+++ b/src/doveadm/dsync/dsync-brain-mailbox-tree.c Mon Oct 21 21:38:17 2013 +0300
@@ -268,6 +268,9 @@
struct dsync_mailbox_tree_sync_ctx *ctx;
const struct dsync_mailbox_tree_sync_change *change;
enum dsync_mailbox_trees_sync_type sync_type;
+ enum dsync_mailbox_trees_sync_flags sync_flags =
+ (brain->debug ? DSYNC_MAILBOX_TREES_SYNC_FLAG_DEBUG : 0) |
+ (brain->master_brain ? DSYNC_MAILBOX_TREES_SYNC_FLAG_MASTER_BRAIN : 0);
if (brain->no_backup_overwrite)
sync_type = DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY;
@@ -280,7 +283,7 @@
ctx = dsync_mailbox_trees_sync_init(brain->local_mailbox_tree,
brain->remote_mailbox_tree,
- sync_type);
+ sync_type, sync_flags);
while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) {
if (dsync_brain_mailbox_tree_sync_change(brain, change) < 0)
brain->failed = TRUE;
diff -r 7bd65a83a9a3 -r cce994007aad src/doveadm/dsync/dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/dsync-mailbox-tree-sync.c Mon Oct 21 20:47:53 2013 +0300
+++ b/src/doveadm/dsync/dsync-mailbox-tree-sync.c Mon Oct 21 21:38:17 2013 +0300
@@ -8,6 +8,7 @@
#include "hex-binary.h"
#include "aqueue.h"
#include "hash.h"
+#include "dsync-brain-private.h"
#include "dsync-mailbox-tree-private.h"
#define TEMP_MAX_NAME_LEN 100
@@ -24,8 +25,10 @@
struct dsync_mailbox_tree_sync_ctx {
pool_t pool;
+ struct dsync_brain *brain;
struct dsync_mailbox_tree *local_tree, *remote_tree;
enum dsync_mailbox_trees_sync_type sync_type;
+ enum dsync_mailbox_trees_sync_flags sync_flags;
ARRAY(struct dsync_mailbox_tree_sync_change) changes;
unsigned int change_idx;
@@ -144,11 +147,19 @@
static void
sync_delete_mailbox_node(struct dsync_mailbox_tree_sync_ctx *ctx,
struct dsync_mailbox_tree *tree,
- struct dsync_mailbox_node *node)
+ struct dsync_mailbox_node *node, const char *reason)
{
struct dsync_mailbox_tree_sync_change *change;
const char *name;
+ if ((ctx->sync_flags & DSYNC_MAILBOX_TREES_SYNC_FLAG_DEBUG) != 0 &&
+ tree == ctx->local_tree) {
+ i_debug("brain %c: Deleting mailbox '%s' (GUID %s): %s",
+ (ctx->sync_flags & DSYNC_MAILBOX_TREES_SYNC_FLAG_MASTER_BRAIN) != 0 ? 'M' : 'S',
+ dsync_mailbox_node_get_full_name(tree, node),
+ guid_128_to_string(node->mailbox_guid), reason);
+ }
+
if (tree == ctx->local_tree) {
/* delete this mailbox locally */
change = array_append_space(&ctx->changes);
@@ -165,7 +176,7 @@
static void
sync_delete_mailbox(struct dsync_mailbox_tree_sync_ctx *ctx,
struct dsync_mailbox_tree *tree,
- struct dsync_mailbox_node *node)
+ struct dsync_mailbox_node *node, const char *reason)
{
struct dsync_mailbox_tree *other_tree;
struct dsync_mailbox_node *other_node;
@@ -178,9 +189,9 @@
if (other_node == NULL) {
/* doesn't exist / already deleted */
} else {
- sync_delete_mailbox_node(ctx, other_tree, other_node);
+ sync_delete_mailbox_node(ctx, other_tree, other_node, reason);
}
- sync_delete_mailbox_node(ctx, tree, node);
+ sync_delete_mailbox_node(ctx, tree, node, reason);
}
static void
@@ -206,7 +217,8 @@
if (!ignore_deletes) {
/* this mailbox was deleted. delete it from the
other side as well */
- sync_delete_mailbox(ctx, tree, node);
+ sync_delete_mailbox(ctx, tree, node,
+ "Mailbox has been deleted");
} else {
/* we want to restore the mailbox back.
just treat it as if it didn't exist */
@@ -904,18 +916,33 @@
}
static bool sync_is_wrong_mailbox(struct dsync_mailbox_node *node,
- const struct dsync_mailbox_node *wanted_node)
+ const struct dsync_mailbox_node *wanted_node,
+ const char **reason_r)
{
- if (wanted_node->existence != DSYNC_MAILBOX_NODE_EXISTS)
+ if (wanted_node->existence != DSYNC_MAILBOX_NODE_EXISTS) {
+ *reason_r = wanted_node->existence == DSYNC_MAILBOX_NODE_DELETED ?
+ "Mailbox has been deleted" : "Mailbox doesn't exist";
return TRUE;
- if (node->uid_validity != wanted_node->uid_validity)
+ }
+ if (node->uid_validity != wanted_node->uid_validity) {
+ *reason_r = t_strdup_printf("UIDVALIDITY changed (%u -> %u)",
+ wanted_node->uid_validity,
+ node->uid_validity);
return TRUE;
+ }
if (node->uid_next > wanted_node->uid_next) {
/* we can't lower the UIDNEXT */
+ *reason_r = t_strdup_printf("UIDNEXT is too high (%u > %u)",
+ node->uid_next,
+ wanted_node->uid_next);
return TRUE;
}
- return memcmp(node->mailbox_guid, wanted_node->mailbox_guid,
- sizeof(node->mailbox_guid)) != 0;
+ if (memcmp(node->mailbox_guid, wanted_node->mailbox_guid,
+ sizeof(node->mailbox_guid)) != 0) {
+ *reason_r = "GUID changed";
+ return TRUE;
+ }
+ return FALSE;
}
static void
@@ -925,6 +952,7 @@
struct dsync_mailbox_node *node,
const struct dsync_mailbox_node *wanted_node)
{
+ const char *reason;
int ret;
while (node != NULL && wanted_node != NULL) {
@@ -937,20 +965,22 @@
if (ret < 0) {
/* node shouldn't exist */
if (node->existence == DSYNC_MAILBOX_NODE_EXISTS &&
- !dsync_mailbox_node_is_dir(node))
- sync_delete_mailbox_node(ctx, tree, node);
+ !dsync_mailbox_node_is_dir(node)) {
+ sync_delete_mailbox_node(ctx, tree, node,
+ "Mailbox doesn't exist");
+ }
node = node->next;
} else if (ret > 0) {
/* wanted_node doesn't exist. it's created later. */
wanted_node = wanted_node->next;
- } else {
- if (sync_is_wrong_mailbox(node, wanted_node) &&
+ } else T_BEGIN {
+ if (sync_is_wrong_mailbox(node, wanted_node, &reason) &&
node->existence == DSYNC_MAILBOX_NODE_EXISTS &&
!dsync_mailbox_node_is_dir(node))
- sync_delete_mailbox_node(ctx, tree, node);
+ sync_delete_mailbox_node(ctx, tree, node, reason);
node = node->next;
wanted_node = wanted_node->next;
- }
+ } T_END;
}
for (; node != NULL; node = node->next) {
/* node and its children shouldn't exist */
@@ -961,7 +991,7 @@
}
if (node->existence == DSYNC_MAILBOX_NODE_EXISTS &&
!dsync_mailbox_node_is_dir(node))
- sync_delete_mailbox_node(ctx, tree, node);
+ sync_delete_mailbox_node(ctx, tree, node, "Mailbox doesn't exist");
}
}
@@ -1157,7 +1187,8 @@
struct dsync_mailbox_tree_sync_ctx *
dsync_mailbox_trees_sync_init(struct dsync_mailbox_tree *local_tree,
struct dsync_mailbox_tree *remote_tree,
- enum dsync_mailbox_trees_sync_type sync_type)
+ enum dsync_mailbox_trees_sync_type sync_type,
+ enum dsync_mailbox_trees_sync_flags sync_flags)
{
struct dsync_mailbox_tree_sync_ctx *ctx;
pool_t pool;
@@ -1173,6 +1204,7 @@
ctx->local_tree = local_tree;
ctx->remote_tree = remote_tree;
ctx->sync_type = sync_type;
+ ctx->sync_flags = sync_flags;
i_array_init(&ctx->changes, 128);
ignore_deletes = sync_type == DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_LOCAL;
diff -r 7bd65a83a9a3 -r cce994007aad src/doveadm/dsync/dsync-mailbox-tree.h
--- a/src/doveadm/dsync/dsync-mailbox-tree.h Mon Oct 21 20:47:53 2013 +0300
+++ b/src/doveadm/dsync/dsync-mailbox-tree.h Mon Oct 21 21:38:17 2013 +0300
@@ -4,6 +4,7 @@
#include "guid.h"
struct mail_namespace;
+struct dsync_brain;
enum dsync_mailbox_trees_sync_type {
/* two-way sync for both mailboxes */
@@ -14,6 +15,13 @@
DSYNC_MAILBOX_TREES_SYNC_TYPE_PRESERVE_REMOTE
};
+enum dsync_mailbox_trees_sync_flags {
+ /* Enable debugging */
+ DSYNC_MAILBOX_TREES_SYNC_FLAG_DEBUG = 0x01,
+ /* Show ourself as "master brain" in the debug output */
+ DSYNC_MAILBOX_TREES_SYNC_FLAG_MASTER_BRAIN = 0x02
+};
+
enum dsync_mailbox_node_existence {
/* this is just a filler node for children or for
subscription deletion */
@@ -174,7 +182,8 @@
struct dsync_mailbox_tree_sync_ctx *
dsync_mailbox_trees_sync_init(struct dsync_mailbox_tree *local_tree,
struct dsync_mailbox_tree *remote_tree,
- enum dsync_mailbox_trees_sync_type sync_type);
+ enum dsync_mailbox_trees_sync_type sync_type,
+ enum dsync_mailbox_trees_sync_flags sync_flags);
const struct dsync_mailbox_tree_sync_change *
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);
diff -r 7bd65a83a9a3 -r cce994007aad src/doveadm/dsync/test-dsync-mailbox-tree-sync.c
--- a/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c Mon Oct 21 20:47:53 2013 +0300
+++ b/src/doveadm/dsync/test-dsync-mailbox-tree-sync.c Mon Oct 21 21:38:17 2013 +0300
@@ -170,7 +170,7 @@
dsync_mailbox_tree_build_guid_hash(tree1, &dup_node1, &dup_node2);
dsync_mailbox_tree_build_guid_hash(tree2, &dup_node1, &dup_node2);
ctx = dsync_mailbox_trees_sync_init(tree1, tree2,
- DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY);
+ DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY, 0);
while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) {
}
dsync_mailbox_trees_sync_deinit(&ctx);
@@ -185,7 +185,7 @@
dsync_mailbox_tree_build_guid_hash(orig_tree1, &dup_node1, &dup_node2);
dsync_mailbox_tree_build_guid_hash(orig_tree2, &dup_node1, &dup_node2);
ctx = dsync_mailbox_trees_sync_init(orig_tree2, orig_tree1,
- DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY);
+ DSYNC_MAILBOX_TREES_SYNC_TYPE_TWOWAY, 0);
while ((change = dsync_mailbox_trees_sync_next(ctx)) != NULL) {
}
dsync_mailbox_trees_sync_deinit(&ctx);
More information about the dovecot-cvs
mailing list