Mercurial > dovecot > core-2.2
changeset 16222:d79cf48f1072
dsync: Fixed talking to earlier dsync without mailbox attribute support.
Most importantly it can now be used as an example how to add more features
to dsync.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 07 Apr 2013 15:36:35 +0300 |
parents | cb2e3676547d |
children | 3c4712bcf473 |
files | src/doveadm/dsync/dsync-brain-mailbox-tree.c src/doveadm/dsync/dsync-brain-mailbox.c src/doveadm/dsync/dsync-brain-mails.c src/doveadm/dsync/dsync-brain.c src/doveadm/dsync/dsync-ibc-pipe.c src/doveadm/dsync/dsync-ibc-private.h src/doveadm/dsync/dsync-ibc-stream.c src/doveadm/dsync/dsync-ibc.c src/doveadm/dsync/dsync-ibc.h |
diffstat | 9 files changed, 41 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doveadm/dsync/dsync-brain-mailbox-tree.c Sun Apr 07 15:10:36 2013 +0300 +++ b/src/doveadm/dsync/dsync-brain-mailbox-tree.c Sun Apr 07 15:36:35 2013 +0300 @@ -124,7 +124,7 @@ return; } dsync_mailbox_tree_iter_deinit(&brain->local_tree_iter); - dsync_ibc_send_end_of_list(brain->ibc); + dsync_ibc_send_end_of_list(brain->ibc, DSYNC_IBC_EOL_MAILBOX_TREE); brain->state = DSYNC_STATE_SEND_MAILBOX_TREE_DELETES; }
--- a/src/doveadm/dsync/dsync-brain-mailbox.c Sun Apr 07 15:10:36 2013 +0300 +++ b/src/doveadm/dsync/dsync-brain-mailbox.c Sun Apr 07 15:36:35 2013 +0300 @@ -412,7 +412,7 @@ if (!dsync_brain_next_mailbox(brain, &box, &dsync_box)) { brain->state = DSYNC_STATE_DONE; - dsync_ibc_send_end_of_list(brain->ibc); + dsync_ibc_send_end_of_list(brain->ibc, DSYNC_IBC_EOL_MAILBOX); return; }
--- a/src/doveadm/dsync/dsync-brain-mails.c Sun Apr 07 15:10:36 2013 +0300 +++ b/src/doveadm/dsync/dsync-brain-mails.c Sun Apr 07 15:36:35 2013 +0300 @@ -87,7 +87,7 @@ if (dsync_ibc_send_mailbox_attribute(brain->ibc, attr) == 0) return; } - dsync_ibc_send_end_of_list(brain->ibc); + dsync_ibc_send_end_of_list(brain->ibc, DSYNC_IBC_EOL_MAILBOX_ATTRIBUTE); brain->box_send_state = DSYNC_BOX_STATE_CHANGES; } @@ -119,7 +119,7 @@ if (dsync_ibc_send_change(brain->ibc, change) == 0) return; } - dsync_ibc_send_end_of_list(brain->ibc); + dsync_ibc_send_end_of_list(brain->ibc, DSYNC_IBC_EOL_MAIL_CHANGES); if (brain->mail_requests && brain->box_importer != NULL) brain->box_send_state = DSYNC_BOX_STATE_MAIL_REQUESTS; else @@ -159,7 +159,7 @@ if (brain->box_recv_state < DSYNC_BOX_STATE_MAIL_REQUESTS) return FALSE; - dsync_ibc_send_end_of_list(brain->ibc); + dsync_ibc_send_end_of_list(brain->ibc, DSYNC_IBC_EOL_MAIL_REQUESTS); if (brain->box_exporter != NULL) brain->box_send_state = DSYNC_BOX_STATE_MAILS; else { @@ -257,7 +257,7 @@ } brain->box_send_state = DSYNC_BOX_STATE_DONE; - dsync_ibc_send_end_of_list(brain->ibc); + dsync_ibc_send_end_of_list(brain->ibc, DSYNC_IBC_EOL_MAILS); dsync_brain_sync_half_finished(brain); return TRUE;
--- a/src/doveadm/dsync/dsync-brain.c Sun Apr 07 15:10:36 2013 +0300 +++ b/src/doveadm/dsync/dsync-brain.c Sun Apr 07 15:36:35 2013 +0300 @@ -344,7 +344,7 @@ } hash_table_iterate_deinit(&brain->mailbox_states_iter); - dsync_ibc_send_end_of_list(brain->ibc); + dsync_ibc_send_end_of_list(brain->ibc, DSYNC_IBC_EOL_MAILBOX_STATE); brain->state = DSYNC_STATE_SEND_MAILBOX_TREE; }
--- a/src/doveadm/dsync/dsync-ibc-pipe.c Sun Apr 07 15:10:36 2013 +0300 +++ b/src/doveadm/dsync/dsync-ibc-pipe.c Sun Apr 07 15:36:35 2013 +0300 @@ -195,7 +195,8 @@ } static void -dsync_ibc_pipe_send_end_of_list(struct dsync_ibc *ibc) +dsync_ibc_pipe_send_end_of_list(struct dsync_ibc *ibc, + enum dsync_ibc_eol_type type ATTR_UNUSED) { struct dsync_ibc_pipe *pipe = (struct dsync_ibc_pipe *)ibc;
--- a/src/doveadm/dsync/dsync-ibc-private.h Sun Apr 07 15:10:36 2013 +0300 +++ b/src/doveadm/dsync/dsync-ibc-private.h Sun Apr 07 15:36:35 2013 +0300 @@ -12,7 +12,8 @@ (*recv_handshake)(struct dsync_ibc *ibc, const struct dsync_ibc_settings **set_r); - void (*send_end_of_list)(struct dsync_ibc *ibc); + void (*send_end_of_list)(struct dsync_ibc *ibc, + enum dsync_ibc_eol_type type); void (*send_mailbox_state)(struct dsync_ibc *ibc, const struct dsync_mailbox_state *state);
--- a/src/doveadm/dsync/dsync-ibc-stream.c Sun Apr 07 15:10:36 2013 +0300 +++ b/src/doveadm/dsync/dsync-ibc-stream.c Sun Apr 07 15:36:35 2013 +0300 @@ -61,8 +61,9 @@ char chr; const char *required_keys; const char *optional_keys; + unsigned int min_minor_version; } items[ITEM_END_OF_LIST+1] = { - { NULL, '\0', NULL, NULL }, + { NULL, '\0', NULL, NULL, 0 }, { .name = "done", .chr = 'X', .optional_keys = "" @@ -100,7 +101,8 @@ { .name = "mailbox_attribute", .chr = 'A', .required_keys = "type key", - .optional_keys = "value stream deleted last_change modseq" + .optional_keys = "value stream deleted last_change modseq", + .min_minor_version = DSYNC_PROTOCOL_MINOR_HAVE_ATTRIBUTES }, { .name = "mail_change", .chr = 'C', @@ -123,7 +125,7 @@ .optional_keys = "last_used" }, - { "end_of_list", '\0', NULL, NULL } + { "end_of_list", '\0', NULL, NULL, 0 } }; struct dsync_ibc_stream { @@ -453,6 +455,7 @@ for (i = ITEM_DONE + 1; i < ITEM_END_OF_LIST; i++) { if (ibc->deserializers[i] == NULL && + ibc->minor_version >= items[i].min_minor_version && (items[i].required_keys != NULL || items[i].optional_keys != NULL)) { dsync_ibc_input_error(ibc, NULL, @@ -707,12 +710,22 @@ } static void -dsync_ibc_stream_send_end_of_list(struct dsync_ibc *_ibc) +dsync_ibc_stream_send_end_of_list(struct dsync_ibc *_ibc, + enum dsync_ibc_eol_type type) { struct dsync_ibc_stream *ibc = (struct dsync_ibc_stream *)_ibc; i_assert(ibc->value_output == NULL); + switch (type) { + case DSYNC_IBC_EOL_MAILBOX_ATTRIBUTE: + if (ibc->minor_version < DSYNC_PROTOCOL_MINOR_HAVE_ATTRIBUTES) + return; + break; + default: + break; + } + o_stream_nsend_str(ibc->output, END_OF_LIST_LINE"\n"); }
--- a/src/doveadm/dsync/dsync-ibc.c Sun Apr 07 15:10:36 2013 +0300 +++ b/src/doveadm/dsync/dsync-ibc.c Sun Apr 07 15:36:35 2013 +0300 @@ -41,9 +41,9 @@ } enum dsync_ibc_send_ret -dsync_ibc_send_end_of_list(struct dsync_ibc *ibc) +dsync_ibc_send_end_of_list(struct dsync_ibc *ibc, enum dsync_ibc_eol_type type) { - ibc->v.send_end_of_list(ibc); + ibc->v.send_end_of_list(ibc, type); return dsync_ibc_send_ret(ibc); }
--- a/src/doveadm/dsync/dsync-ibc.h Sun Apr 07 15:10:36 2013 +0300 +++ b/src/doveadm/dsync/dsync-ibc.h Sun Apr 07 15:36:35 2013 +0300 @@ -29,6 +29,16 @@ DSYNC_IBC_RECV_RET_OK = 1 }; +enum dsync_ibc_eol_type { + DSYNC_IBC_EOL_MAILBOX_STATE, + DSYNC_IBC_EOL_MAILBOX_TREE, + DSYNC_IBC_EOL_MAILBOX_ATTRIBUTE, + DSYNC_IBC_EOL_MAILBOX, + DSYNC_IBC_EOL_MAIL_CHANGES, + DSYNC_IBC_EOL_MAIL_REQUESTS, + DSYNC_IBC_EOL_MAILS +}; + struct dsync_ibc_settings { /* Server hostname. Used for determining which server does the locking. */ @@ -64,7 +74,7 @@ const struct dsync_ibc_settings **set_r); enum dsync_ibc_send_ret ATTR_NOWARN_UNUSED_RESULT -dsync_ibc_send_end_of_list(struct dsync_ibc *ibc); +dsync_ibc_send_end_of_list(struct dsync_ibc *ibc, enum dsync_ibc_eol_type type); enum dsync_ibc_send_ret ATTR_NOWARN_UNUSED_RESULT dsync_ibc_send_mailbox_state(struct dsync_ibc *ibc,