Mercurial > dovecot > core-2.2
changeset 16376:c6fee677172a
dsync: Don't try to sync with GUIDs if we can't set them on the needed side.
With two-way syncing both sides need to have writable GUIDs. With one-way
syncing only the writing side needs to have writable GUIDs.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 20 May 2013 02:01:02 +0300 |
parents | 096054ae8584 |
children | 7aa929edd551 |
files | src/doveadm/dsync/dsync-brain-mailbox.c src/doveadm/dsync/dsync-ibc-stream.c src/doveadm/dsync/dsync-mailbox.h |
diffstat | 3 files changed, 13 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/doveadm/dsync/dsync-brain-mailbox.c Mon May 20 01:52:25 2013 +0300 +++ b/src/doveadm/dsync/dsync-brain-mailbox.c Mon May 20 02:01:02 2013 +0300 @@ -173,8 +173,9 @@ import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_REVERT_LOCAL_CHANGES; if (brain->debug) import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_DEBUG; - if (brain->local_dsync_box.have_guids && - remote_dsync_box->have_guids) + if (brain->local_dsync_box.have_save_guids && + (remote_dsync_box->have_save_guids || + (brain->backup_recv && remote_dsync_box->have_guids))) import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_MAILS_HAVE_GUIDS; brain->box_importer = brain->backup_send ? NULL : @@ -216,8 +217,9 @@ if (!brain->mail_requests) exporter_flags |= DSYNC_MAILBOX_EXPORTER_FLAG_AUTO_EXPORT_MAILS; - if (brain->local_dsync_box.have_guids && - remote_dsync_box->have_guids) + if (remote_dsync_box->have_save_guids && + (brain->local_dsync_box.have_save_guids || + (brain->backup_send && brain->local_dsync_box.have_guids))) exporter_flags |= DSYNC_MAILBOX_EXPORTER_FLAG_MAILS_HAVE_GUIDS; brain->box_exporter = brain->backup_recv ? NULL : @@ -303,6 +305,7 @@ dsync_box_r->highest_pvt_modseq = status.highest_pvt_modseq; dsync_box_r->cache_fields = *metadata.cache_fields; dsync_box_r->have_guids = status.have_guids; + dsync_box_r->have_save_guids = status.have_save_guids; return 1; }
--- a/src/doveadm/dsync/dsync-ibc-stream.c Mon May 20 01:52:25 2013 +0300 +++ b/src/doveadm/dsync/dsync-ibc-stream.c Mon May 20 02:01:02 2013 +0300 @@ -96,7 +96,7 @@ .chr = 'B', .required_keys = "mailbox_guid uid_validity uid_next messages_count " "first_recent_uid highest_modseq highest_pvt_modseq", - .optional_keys = "mailbox_lost cache_fields have_guids" + .optional_keys = "mailbox_lost cache_fields have_guids have_save_guids" }, { .name = "mailbox_attribute", .chr = 'A', @@ -1110,6 +1110,8 @@ dsync_serializer_encode_add(encoder, "mailbox_lost", ""); if (dsync_box->have_guids) dsync_serializer_encode_add(encoder, "have_guids", ""); + if (dsync_box->have_save_guids) + dsync_serializer_encode_add(encoder, "have_save_guids", ""); dsync_serializer_encode_add(encoder, "uid_validity", dec2str(dsync_box->uid_validity)); dsync_serializer_encode_add(encoder, "uid_next", @@ -1210,6 +1212,8 @@ box->mailbox_lost = TRUE; if (dsync_deserializer_decode_try(decoder, "have_guids", &value)) box->have_guids = TRUE; + if (dsync_deserializer_decode_try(decoder, "have_save_guids", &value)) + box->have_save_guids = TRUE; value = dsync_deserializer_decode_get(decoder, "uid_validity"); if (str_to_uint32(value, &box->uid_validity) < 0) { dsync_ibc_input_error(ibc, decoder, "Invalid uid_validity");
--- a/src/doveadm/dsync/dsync-mailbox.h Mon May 20 01:52:25 2013 +0300 +++ b/src/doveadm/dsync/dsync-mailbox.h Mon May 20 02:01:02 2013 +0300 @@ -8,7 +8,7 @@ struct dsync_mailbox { guid_128_t mailbox_guid; bool mailbox_lost; - bool have_guids; + bool have_guids, have_save_guids; uint32_t uid_validity, uid_next, messages_count, first_recent_uid; uint64_t highest_modseq, highest_pvt_modseq;