dovecot-2.2: dsync: Added debugging and rawlogging support.

dovecot at dovecot.org dovecot at dovecot.org
Fri Dec 14 11:23:04 EET 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/af3b86a16ac3
changeset: 15464:af3b86a16ac3
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Dec 14 11:20:04 2012 +0200
description:
dsync: Added debugging and rawlogging support.

diffstat:

 src/doveadm/dsync/doveadm-dsync.c       |  58 +++++++++++++++++++++++++-------
 src/doveadm/dsync/dsync-brain-mails.c   |  27 +++++++++++++++
 src/doveadm/dsync/dsync-brain-private.h |   1 +
 src/doveadm/dsync/dsync-brain.c         |  24 +++++++++++++
 src/doveadm/dsync/dsync-brain.h         |   3 +-
 src/doveadm/dsync/dsync-ibc-stream.c    |  26 +++++---------
 src/doveadm/dsync/dsync-ibc.h           |   4 +-
 7 files changed, 111 insertions(+), 32 deletions(-)

diffs (truncated from 376 to 300 lines):

diff -r f9e8cbb2792d -r af3b86a16ac3 src/doveadm/dsync/doveadm-dsync.c
--- a/src/doveadm/dsync/doveadm-dsync.c	Fri Dec 14 11:17:19 2012 +0200
+++ b/src/doveadm/dsync/doveadm-dsync.c	Fri Dec 14 11:20:04 2012 +0200
@@ -4,6 +4,10 @@
 #include "lib-signals.h"
 #include "array.h"
 #include "execv-const.h"
+#include "fd-set-nonblock.h"
+#include "istream.h"
+#include "ostream.h"
+#include "iostream-rawlog.h"
 #include "str.h"
 #include "var-expand.h"
 #include "settings-parser.h"
@@ -23,13 +27,13 @@
 #include <unistd.h>
 #include <ctype.h>
 
-#define DSYNC_COMMON_GETOPT_ARGS "+dEfl:m:n:s:"
+#define DSYNC_COMMON_GETOPT_ARGS "+dEfm:n:r:Rs:"
 
 struct dsync_cmd_context {
 	struct doveadm_mail_cmd_context ctx;
 	enum dsync_brain_sync_type sync_type;
 	const char *mailbox, *namespace_prefix;
-	const char *state_input;
+	const char *state_input, *rawlog_path;
 
 	const char *remote_name;
 	const char *local_location;
@@ -312,6 +316,23 @@
 	return get_ssh_cmd_args(ctx, host, login, username);
 }
 
+static struct dsync_ibc *
+cmd_dsync_icb_stream_init(struct dsync_cmd_context *ctx,
+			  const char *name, const char *temp_prefix)
+{
+	struct istream *input;
+	struct ostream *output;
+
+	fd_set_nonblock(ctx->fd_in, TRUE);
+	fd_set_nonblock(ctx->fd_out, TRUE);
+
+	input = i_stream_create_fd(ctx->fd_in, (size_t)-1, FALSE);
+	output = o_stream_create_fd(ctx->fd_out, (size_t)-1, FALSE);
+	if (ctx->rawlog_path != NULL)
+		iostream_rawlog_create_path(ctx->rawlog_path, &input, &output);
+	return dsync_ibc_init_stream(input, output, name, temp_prefix);
+}
+
 static int
 cmd_dsync_run(struct doveadm_mail_cmd_context *_ctx, struct mail_user *user)
 {
@@ -335,22 +356,20 @@
 	else {
 		string_t *temp_prefix = t_str_new(64);
 		mail_user_set_get_temp_prefix(temp_prefix, user->set);
-		ibc = dsync_ibc_init_stream(ctx->fd_in, ctx->fd_out,
-					    ctx->remote_name,
-					    str_c(temp_prefix));
-	}
-
-	if (doveadm_debug || doveadm_verbose) {
-		// FIXME
+		ibc = cmd_dsync_icb_stream_init(ctx, ctx->remote_name,
+						str_c(temp_prefix));
 	}
 
 	brain_flags = DSYNC_BRAIN_FLAG_MAILS_HAVE_GUIDS |
 		DSYNC_BRAIN_FLAG_SEND_GUID_REQUESTS;
+
 	if (ctx->reverse_backup)
 		brain_flags |= DSYNC_BRAIN_FLAG_BACKUP_RECV;
 	else if (ctx->backup)
 		brain_flags |= DSYNC_BRAIN_FLAG_BACKUP_SEND;
 
+	if (doveadm_debug)
+		brain_flags |= DSYNC_BRAIN_FLAG_DEBUG;
 	brain = dsync_brain_master_init(user, ibc, sync_ns,
 					ctx->sync_type, brain_flags,
 					ctx->state_input == NULL ? "" :
@@ -376,6 +395,11 @@
 		dsync_ibc_deinit(&ibc2);
 	if (ctx->io_err != NULL)
 		io_remove(&ctx->io_err);
+	if (ctx->fd_in != -1) {
+		if (ctx->fd_out != ctx->fd_in)
+			i_close_fd(&ctx->fd_out);
+		i_close_fd(&ctx->fd_in);
+	}
 	if (ctx->fd_err != -1)
 		i_close_fd(&ctx->fd_err);
 	return ret;
@@ -482,6 +506,9 @@
 	case 'n':
 		ctx->namespace_prefix = optarg;
 		break;
+	case 'r':
+		ctx->rawlog_path = optarg;
+		break;
 	case 'R':
 		if (!ctx->backup)
 			return FALSE;
@@ -527,9 +554,10 @@
 }
 
 static int
-cmd_dsync_server_run(struct doveadm_mail_cmd_context *_ctx ATTR_UNUSED,
+cmd_dsync_server_run(struct doveadm_mail_cmd_context *_ctx,
 		     struct mail_user *user)
 {
+	struct dsync_cmd_context *ctx = (struct dsync_cmd_context *)_ctx;
 	struct dsync_ibc *ibc;
 	struct dsync_brain *brain;
 	string_t *temp_prefix;
@@ -542,8 +570,7 @@
 	temp_prefix = t_str_new(64);
 	mail_user_set_get_temp_prefix(temp_prefix, user->set);
 
-	ibc = dsync_ibc_init_stream(STDIN_FILENO, STDOUT_FILENO,
-				    "local", str_c(temp_prefix));
+	ibc = cmd_dsync_icb_stream_init(ctx, "local", str_c(temp_prefix));
 	brain = dsync_brain_slave_init(user, ibc);
 
 	io_loop_run(current_ioloop);
@@ -567,6 +594,9 @@
 		if (str_to_uint(optarg, &ctx->lock_timeout) < 0)
 			i_error("Invalid -l parameter: %s", optarg);
 		break;
+	case 'r':
+		ctx->rawlog_path = optarg;
+		break;
 	case 'n':
 		ctx->namespace_prefix = optarg;
 		break;
@@ -581,10 +611,12 @@
 	struct dsync_cmd_context *ctx;
 
 	ctx = doveadm_mail_cmd_alloc(struct dsync_cmd_context);
-	ctx->ctx.getopt_args = "El:n:";
+	ctx->ctx.getopt_args = "El:n:r:";
 	ctx->ctx.v.parse_arg = cmd_mailbox_dsync_server_parse_arg;
 	ctx->ctx.v.run = cmd_dsync_server_run;
 	ctx->sync_type = DSYNC_BRAIN_SYNC_TYPE_CHANGED;
+	ctx->fd_in = STDIN_FILENO;
+	ctx->fd_out = STDOUT_FILENO;
 	return &ctx->ctx;
 }
 
diff -r f9e8cbb2792d -r af3b86a16ac3 src/doveadm/dsync/dsync-brain-mails.c
--- a/src/doveadm/dsync/dsync-brain-mails.c	Fri Dec 14 11:17:19 2012 +0200
+++ b/src/doveadm/dsync/dsync-brain-mails.c	Fri Dec 14 11:20:04 2012 +0200
@@ -8,6 +8,15 @@
 #include "dsync-mailbox-export.h"
 #include "dsync-brain-private.h"
 
+static const char *dsync_box_state_names[DSYNC_BOX_STATE_DONE+1] = {
+	"mailbox",
+	"changes",
+	"mail_requests",
+	"mails",
+	"recv_last_common",
+	"done"
+};
+
 static bool dsync_brain_master_sync_recv_mailbox(struct dsync_brain *brain)
 {
 	const struct dsync_mailbox *dsync_box;
@@ -182,6 +191,10 @@
 		dsync_brain_sync_half_finished(brain);
 		return TRUE;
 	}
+	if (brain->debug) {
+		i_debug("brain %c: import mail uid %u guid %s",
+			brain->master_brain ? 'M' : 'S', mail->uid, mail->guid);
+	}
 	dsync_mailbox_import_mail(brain->box_importer, mail);
 	if (mail->input != NULL)
 		i_stream_unref(&mail->input);
@@ -236,6 +249,13 @@
 
 	i_assert(brain->box != NULL);
 
+	if (brain->debug) {
+		i_debug("brain %c: in box '%s' recv_state=%s send_state=%s",
+			brain->master_brain ? 'M' : 'S',
+			mailbox_get_vname(brain->box),
+			dsync_box_state_names[brain->box_recv_state],
+			dsync_box_state_names[brain->box_send_state]);
+	}
 	switch (brain->box_recv_state) {
 	case DSYNC_BOX_STATE_MAILBOX:
 		changed = dsync_brain_master_sync_recv_mailbox(brain);
@@ -282,5 +302,12 @@
 	case DSYNC_BOX_STATE_DONE:
 		break;
 	}
+	if (brain->debug) {
+		i_debug("brain %c: out box '%s' recv_state=%s send_state=%s changed=%d",
+			brain->master_brain ? 'M' : 'S',
+			brain->box == NULL ? "" : mailbox_get_vname(brain->box),
+			dsync_box_state_names[brain->box_recv_state],
+			dsync_box_state_names[brain->box_send_state], changed);
+	}
 	return changed;
 }
diff -r f9e8cbb2792d -r af3b86a16ac3 src/doveadm/dsync/dsync-brain-private.h
--- a/src/doveadm/dsync/dsync-brain-private.h	Fri Dec 14 11:17:19 2012 +0200
+++ b/src/doveadm/dsync/dsync-brain-private.h	Fri Dec 14 11:20:04 2012 +0200
@@ -80,6 +80,7 @@
 	unsigned int mails_have_guids:1;
 	unsigned int backup_send:1;
 	unsigned int backup_recv:1;
+	unsigned int debug:1;
 	unsigned int changes_during_sync:1;
 	unsigned int failed:1;
 };
diff -r f9e8cbb2792d -r af3b86a16ac3 src/doveadm/dsync/dsync-brain.c
--- a/src/doveadm/dsync/dsync-brain.c	Fri Dec 14 11:17:19 2012 +0200
+++ b/src/doveadm/dsync/dsync-brain.c	Fri Dec 14 11:20:04 2012 +0200
@@ -8,6 +8,20 @@
 #include "dsync-ibc.h"
 #include "dsync-brain-private.h"
 
+static const char *dsync_state_names[DSYNC_STATE_DONE+1] = {
+	"recv_handshake",
+	"send_last_common",
+	"recv_last_common",
+	"send_mailbox_tree",
+	"send_mailbox_tree_deletes",
+	"recv_mailbox_tree",
+	"recv_mailbox_tree_deletes",
+	"master_send_mailbox",
+	"slave_recv_mailbox",
+	"sync_mails",
+	"done"
+};
+
 static void dsync_brain_run_io(void *context)
 {
 	struct dsync_brain *brain = context;
@@ -62,6 +76,7 @@
 		(flags & DSYNC_BRAIN_FLAG_MAILS_HAVE_GUIDS) != 0;
 	brain->backup_send = (flags & DSYNC_BRAIN_FLAG_BACKUP_SEND) != 0;
 	brain->backup_recv = (flags & DSYNC_BRAIN_FLAG_BACKUP_RECV) != 0;
+	brain->debug = (flags & DSYNC_BRAIN_FLAG_DEBUG) != 0;
 }
 
 struct dsync_brain *
@@ -244,6 +259,10 @@
 	if (brain->failed)
 		return FALSE;
 
+	if (brain->debug) {
+		i_debug("brain %c: in state=%s", brain->master_brain ? 'M' : 'S',
+			dsync_state_names[brain->state]);
+	}
 	switch (brain->state) {
 	case DSYNC_STATE_SLAVE_RECV_HANDSHAKE:
 		changed = dsync_brain_slave_recv_handshake(brain);
@@ -284,6 +303,11 @@
 		ret = FALSE;
 		break;
 	}
+	if (brain->debug) {
+		i_debug("brain %c: out state=%s changed=%d",
+			brain->master_brain ? 'M' : 'S',
+			dsync_state_names[brain->state], changed);
+	}
 
 	*changed_r = changed;
 	return brain->failed ? FALSE : ret;
diff -r f9e8cbb2792d -r af3b86a16ac3 src/doveadm/dsync/dsync-brain.h
--- a/src/doveadm/dsync/dsync-brain.h	Fri Dec 14 11:17:19 2012 +0200
+++ b/src/doveadm/dsync/dsync-brain.h	Fri Dec 14 11:20:04 2012 +0200
@@ -9,7 +9,8 @@
 	DSYNC_BRAIN_FLAG_MAILS_HAVE_GUIDS	= 0x01,
 	DSYNC_BRAIN_FLAG_SEND_GUID_REQUESTS	= 0x02,
 	DSYNC_BRAIN_FLAG_BACKUP_SEND		= 0x04,
-	DSYNC_BRAIN_FLAG_BACKUP_RECV		= 0x08
+	DSYNC_BRAIN_FLAG_BACKUP_RECV		= 0x08,
+	DSYNC_BRAIN_FLAG_DEBUG			= 0x10
 };
 
 enum dsync_brain_sync_type {
diff -r f9e8cbb2792d -r af3b86a16ac3 src/doveadm/dsync/dsync-ibc-stream.c
--- a/src/doveadm/dsync/dsync-ibc-stream.c	Fri Dec 14 11:17:19 2012 +0200
+++ b/src/doveadm/dsync/dsync-ibc-stream.c	Fri Dec 14 11:20:04 2012 +0200
@@ -60,7 +60,7 @@
 	{ NULL, '\0', NULL, NULL },
 	{ .name = "handshake",
 	  .chr = 'H',
-	  .optional_keys = "sync_ns_prefix sync_type "
+	  .optional_keys = "sync_ns_prefix sync_type debug "
 	  	"mails_have_guids send_guid_requests backup_send backup_recv"
 	},
 	{ .name = "mailbox_state",
@@ -267,11 +267,6 @@
 {


More information about the dovecot-cvs mailing list