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