dovecot-2.0-sslstream: dsync: Several fixes

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 13 02:55:59 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0-sslstream/rev/df908e821744
changeset: 10248:df908e821744
user:      Timo Sirainen <tss at iki.fi>
date:      Wed Nov 04 18:51:10 2009 -0500
description:
dsync: Several fixes

diffstat:

8 files changed, 72 insertions(+), 20 deletions(-)
src/dsync/dsync-brain-msgs-new.c   |   15 +++++++++++++--
src/dsync/dsync-brain-msgs.c       |   12 ++++++++++--
src/dsync/dsync-proxy-client.c     |   30 ++++++++++++++++++++++--------
src/dsync/dsync-proxy-server-cmd.c |   15 +++++++++------
src/dsync/dsync-proxy-server.c     |    2 ++
src/dsync/dsync-proxy-server.h     |    1 +
src/dsync/dsync-worker-local.c     |    4 ++++
src/dsync/dsync-worker.c           |   13 +++++++++++--

diffs (truncated from 312 to 300 lines):

diff -r 5a4318e65ba7 -r df908e821744 src/dsync/dsync-brain-msgs-new.c
--- a/src/dsync/dsync-brain-msgs-new.c	Mon Nov 02 18:11:48 2009 -0500
+++ b/src/dsync/dsync-brain-msgs-new.c	Wed Nov 04 18:51:10 2009 -0500
@@ -15,6 +15,7 @@ struct dsync_brain_msg_save_context {
 struct dsync_brain_msg_save_context {
 	struct dsync_brain_msg_iter *iter;
 	const struct dsync_message *msg;
+	unsigned int mailbox_idx;
 };
 
 static void
@@ -25,10 +26,18 @@ static void msg_get_callback(enum dsync_
 			     void *context)
 {
 	struct dsync_brain_msg_save_context *ctx = context;
+	const struct dsync_brain_mailbox *mailbox;
+	const mailbox_guid_t *mailbox_guid;
 	struct istream *input;
 
+	mailbox = array_idx(&ctx->iter->sync->mailboxes, ctx->mailbox_idx);
 	switch (result) {
 	case DSYNC_MSG_GET_RESULT_SUCCESS:
+		/* the mailbox may have changed, make sure we've the
+		   right one */
+		mailbox_guid = &mailbox->box.mailbox_guid;
+		dsync_worker_select_mailbox(ctx->iter->worker, mailbox_guid);
+
 		input = data->input;
 		dsync_worker_msg_save(ctx->iter->worker, ctx->msg, data);
 		i_stream_unref(&input);
@@ -37,8 +46,8 @@ static void msg_get_callback(enum dsync_
 		/* mail got expunged during sync. just skip this. */
 		break;
 	case DSYNC_MSG_GET_RESULT_FAILED:
-		i_error("msg-get failed: uid=%u guid=%s",
-			ctx->msg->uid, ctx->msg->guid);
+		i_error("msg-get failed: box=%s uid=%u guid=%s",
+			mailbox->box.name, ctx->msg->uid, ctx->msg->guid);
 		dsync_brain_fail(ctx->iter->sync->brain);
 		break;
 	}
@@ -102,6 +111,7 @@ dsync_brain_msg_sync_add_new_msg(struct 
 		save_ctx->iter = dest_iter;
 		save_ctx->msg = dsync_message_dup(src_iter->sync->pool,
 						  msg->msg);
+		save_ctx->mailbox_idx = dest_iter->mailbox_idx;
 
 		dest_iter->adding_msgs = TRUE;
 		dest_iter->save_results_left++;
@@ -201,6 +211,7 @@ dsync_brain_mailbox_retry_copies(struct 
 	   worry about filling output buffer. */
 	for (i = 0; i < idx_count; i++) {
 		msg_idx = indexes[i];
+		// FIXME: if buffer fills, we assert-crash
 		(void)dsync_brain_msg_sync_add_new_msg(iter, mailbox_guid,
 						       msg_idx, &msgs[msg_idx]);
 	}
diff -r 5a4318e65ba7 -r df908e821744 src/dsync/dsync-brain-msgs.c
--- a/src/dsync/dsync-brain-msgs.c	Mon Nov 02 18:11:48 2009 -0500
+++ b/src/dsync/dsync-brain-msgs.c	Wed Nov 04 18:51:10 2009 -0500
@@ -9,6 +9,9 @@ static void dsync_brain_guid_add(struct 
 static void dsync_brain_guid_add(struct dsync_brain_msg_iter *iter)
 {
 	struct dsync_brain_guid_instance *inst, *prev_inst;
+
+	if ((iter->msg.flags & DSYNC_MAIL_FLAG_EXPUNGED) != 0)
+		return;
 
 	inst = p_new(iter->sync->pool, struct dsync_brain_guid_instance, 1);
 	inst->mailbox_idx = iter->mailbox_idx;
@@ -60,6 +63,9 @@ dsync_brain_msg_sync_save(struct dsync_b
 			  const struct dsync_message *msg)
 {
 	struct dsync_brain_new_msg *new_msg;
+
+	if ((msg->flags & DSYNC_MAIL_FLAG_EXPUNGED) != 0)
+		return;
 
 	new_msg = array_append_space(&iter->new_msgs);
 	new_msg->mailbox_idx = mailbox_idx;
@@ -230,8 +236,10 @@ dsync_brain_msg_sync_mailbox_more(struct
 	while ((ret = dsync_brain_msg_iter_next_pair(sync)) > 0) {
 		if (dsync_brain_msg_sync_pair(sync) < 0)
 			break;
-		if (dsync_worker_is_output_full(sync->dest_worker))
-			return FALSE;
+		if (dsync_worker_is_output_full(sync->dest_worker)) {
+			if (dsync_worker_output_flush(sync->dest_worker) <= 0)
+				return FALSE;
+		}
 	}
  	if (ret == 0)
 		return FALSE;
diff -r 5a4318e65ba7 -r df908e821744 src/dsync/dsync-proxy-client.c
--- a/src/dsync/dsync-proxy-client.c	Mon Nov 02 18:11:48 2009 -0500
+++ b/src/dsync/dsync-proxy-client.c	Wed Nov 04 18:51:10 2009 -0500
@@ -130,14 +130,24 @@ proxy_client_worker_next_msg_get(struct 
 				 const struct proxy_client_request *request,
 				 const char *line)
 {
-	enum dsync_msg_get_result result;
-	const char *error;
+	enum dsync_msg_get_result result = DSYNC_MSG_GET_RESULT_FAILED;
+	const char *p, *error;
+	uint32_t uid;
 
 	i_assert(worker->msg_get_data.input == NULL);
 	p_clear(worker->msg_get_pool);
 	switch (line[0]) {
 	case '1':
 		/* ok */
+		if (line[1] != '\t')
+			break;
+		line += 2;
+
+		if ((p = strchr(line, '\t')) == NULL)
+			break;
+		uid = strtoul(t_strcut(line, '\t'), NULL, 10);
+		line = p + 1;
+
 		if (dsync_proxy_msg_static_import(worker->msg_get_pool,
 						  line, &worker->msg_get_data,
 						  &error) < 0) {
@@ -159,7 +169,6 @@ proxy_client_worker_next_msg_get(struct 
 		break;
 	default:
 		/* failure */
-		result = DSYNC_MSG_GET_RESULT_FAILED;
 		break;
 	}
 
@@ -293,6 +302,13 @@ static void proxy_client_worker_deinit(s
 	i_free(worker);
 }
 
+static bool
+worker_is_output_stream_full(struct proxy_client_dsync_worker *worker)
+{
+	return o_stream_get_buffer_used_size(worker->output) >=
+		OUTBUF_THROTTLE_SIZE;
+}
+
 static bool proxy_client_worker_is_output_full(struct dsync_worker *_worker)
 {
 	struct proxy_client_dsync_worker *worker =
@@ -302,9 +318,7 @@ static bool proxy_client_worker_is_outpu
 		/* we haven't finished sending a message save, so we're full. */
 		return TRUE;
 	}
-
-	return o_stream_get_buffer_used_size(worker->output) >=
-		OUTBUF_THROTTLE_SIZE;
+	return worker_is_output_stream_full(worker);
 }
 
 static int proxy_client_worker_output_flush(struct dsync_worker *_worker)
@@ -677,9 +691,9 @@ static void proxy_client_send_stream(str
 					    data, size);
 		i_stream_skip(worker->save_input, size);
 
-		if (proxy_client_worker_is_output_full(&worker->worker)) {
+		if (worker_is_output_stream_full(worker)) {
 			o_stream_uncork(worker->output);
-			if (proxy_client_worker_is_output_full(&worker->worker))
+			if (worker_is_output_stream_full(worker))
 				return;
 			o_stream_cork(worker->output);
 		}
diff -r 5a4318e65ba7 -r df908e821744 src/dsync/dsync-proxy-server-cmd.c
--- a/src/dsync/dsync-proxy-server-cmd.c	Mon Nov 02 18:11:48 2009 -0500
+++ b/src/dsync/dsync-proxy-server-cmd.c	Wed Nov 04 18:51:10 2009 -0500
@@ -49,6 +49,7 @@ cmd_box_list(struct dsync_proxy_server *
 	}
 	if (ret >= 0) {
 		/* continue later */
+		o_stream_set_flush_pending(server->output, TRUE);
 		return 0;
 	}
 	if (dsync_worker_mailbox_iter_deinit(&server->mailbox_iter) < 0) {
@@ -111,6 +112,7 @@ cmd_msg_list(struct dsync_proxy_server *
 	}
 	if (ret >= 0) {
 		/* continue later */
+		o_stream_set_flush_pending(server->output, TRUE);
 		return 0;
 	}
 	if (dsync_worker_msg_iter_deinit(&server->msg_iter) < 0) {
@@ -319,7 +321,7 @@ static void cmd_msg_get_send_more(struct
 			/* done */
 			o_stream_send(server->output, "\n.\n", 3);
 			i_stream_unref(&server->get_input);
-			break;
+			return;
 		} else {
 			/* for now we assume input is blocking */
 			i_assert(ret != 0);
@@ -330,6 +332,7 @@ static void cmd_msg_get_send_more(struct
 					    data, size);
 		i_stream_skip(server->get_input, size);
 	}
+	o_stream_set_flush_pending(server->output, TRUE);
 }
 
 static void
@@ -351,7 +354,7 @@ cmd_msg_get_callback(enum dsync_msg_get_
 	}
 
 	str = t_str_new(128);
-	str_append(str, "1\t");
+	str_printfa(str, "1\t%u\t", server->get_uid);
 	dsync_proxy_msg_static_export(str, data);
 	str_append_c(str, '\n');
 	o_stream_send(server->output, str_data(str), str_len(str));
@@ -379,13 +382,13 @@ cmd_msg_get(struct dsync_proxy_server *s
 	if (uid == 0)
 		return -1;
 
-	if (server->get_input != NULL)
+	if (server->get_input != NULL) {
+		i_assert(server->get_uid == uid);
 		cmd_msg_get_send_more(server);
-	else {
+	} else {
+		server->get_uid = uid;
 		dsync_worker_msg_get(server->worker, &mailbox_guid, uid,
 				     cmd_msg_get_callback, server);
-		/* FIXME: why? this shouldn't be needed.. */
-		o_stream_uncork(server->output);
 	}
 	return server->get_input == NULL ? 1 : 0;
 }
diff -r 5a4318e65ba7 -r df908e821744 src/dsync/dsync-proxy-server.c
--- a/src/dsync/dsync-proxy-server.c	Mon Nov 02 18:11:48 2009 -0500
+++ b/src/dsync/dsync-proxy-server.c	Wed Nov 04 18:51:10 2009 -0500
@@ -124,6 +124,8 @@ static int proxy_server_output(struct ds
 		if (server->cur_cmd == NULL && server->io == NULL) {
 			server->io = io_add(server->fd_in, IO_READ,
 					    proxy_server_input, server);
+			/* handle pending input */
+			proxy_server_input(server);
 		}
 	}
 	return ret;
diff -r 5a4318e65ba7 -r df908e821744 src/dsync/dsync-proxy-server.h
--- a/src/dsync/dsync-proxy-server.h	Mon Nov 02 18:11:48 2009 -0500
+++ b/src/dsync/dsync-proxy-server.h	Wed Nov 04 18:51:10 2009 -0500
@@ -26,6 +26,7 @@ struct dsync_proxy_server {
 
 	struct istream *get_input;
 	bool get_input_last_lf;
+	uint32_t get_uid;
 
 	unsigned int finished:1;
 };
diff -r 5a4318e65ba7 -r df908e821744 src/dsync/dsync-worker-local.c
--- a/src/dsync/dsync-worker-local.c	Mon Nov 02 18:11:48 2009 -0500
+++ b/src/dsync/dsync-worker-local.c	Wed Nov 04 18:51:10 2009 -0500
@@ -529,6 +529,7 @@ iter_local_mailbox_next_expunge(struct l
 				     MAIL_GUID_128_SIZE);
 		msg_r->guid = str_c(iter->tmp_guid_str);
 		msg_r->uid = expunges[iter->expunge_idx].uid;
+		msg_r->flags = DSYNC_MAIL_FLAG_EXPUNGED;
 		iter->expunge_idx++;
 		return TRUE;
 	}
@@ -1067,6 +1068,7 @@ static void local_worker_msg_box_close(s
 	mail_free(&worker->get_mail);
 	(void)mailbox_transaction_commit(&trans);
 	mailbox_close(&box);
+	memset(&worker->get_mailbox, 0, sizeof(worker->get_mailbox));
 }
 
 static void
@@ -1088,6 +1090,8 @@ local_worker_msg_get(struct dsync_worker
 			callback(DSYNC_MSG_GET_RESULT_FAILED, NULL, context);
 			return;
 		}
+		worker->get_mailbox = *mailbox;
+
 		trans = mailbox_transaction_begin(box, 0);
 		worker->get_mail = mail_alloc(trans, 0, NULL);
 	}
diff -r 5a4318e65ba7 -r df908e821744 src/dsync/dsync-worker.c
--- a/src/dsync/dsync-worker.c	Mon Nov 02 18:11:48 2009 -0500
+++ b/src/dsync/dsync-worker.c	Wed Nov 04 18:51:10 2009 -0500
@@ -1,6 +1,7 @@
 /* Copyright (c) 2009 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
+#include "istream.h"
 #include "dsync-worker-private.h"
 
 void dsync_worker_deinit(struct dsync_worker **_worker)
@@ -165,8 +166,16 @@ void dsync_worker_msg_save(struct dsync_
 			   const struct dsync_message *msg,
 			   const struct dsync_msg_static_data *data)
 {
-	if (!worker->failed && !worker->readonly)
-		worker->v.msg_save(worker, msg, data);
+	if (!worker->readonly) {


More information about the dovecot-cvs mailing list