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