dovecot-2.2: dsync: Support syncing storages with 128bit GUIDs <...
dovecot at dovecot.org
dovecot at dovecot.org
Sun Nov 17 17:59:21 EET 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/8a7ecddca4ad
changeset: 16977:8a7ecddca4ad
user: Timo Sirainen <tss at iki.fi>
date: Sun Nov 17 17:59:05 2013 +0200
description:
dsync: Support syncing storages with 128bit GUIDs <-> string GUIDs.
diffstat:
src/doveadm/dsync/dsync-brain-mailbox.c | 3 +++
src/doveadm/dsync/dsync-ibc-stream.c | 6 +++++-
src/doveadm/dsync/dsync-mailbox-import.c | 22 +++++++++++++++-------
src/doveadm/dsync/dsync-mailbox-import.h | 3 ++-
src/doveadm/dsync/dsync-mailbox.h | 2 +-
src/lib-storage/mail-storage-private.h | 5 ++++-
src/lib-storage/mail-storage.c | 2 ++
src/lib-storage/mail-storage.h | 2 ++
8 files changed, 34 insertions(+), 11 deletions(-)
diffs (192 lines):
diff -r a04c7365299e -r 8a7ecddca4ad src/doveadm/dsync/dsync-brain-mailbox.c
--- a/src/doveadm/dsync/dsync-brain-mailbox.c Sun Nov 17 17:15:42 2013 +0200
+++ b/src/doveadm/dsync/dsync-brain-mailbox.c Sun Nov 17 17:59:05 2013 +0200
@@ -184,6 +184,9 @@
(remote_dsync_box->have_save_guids ||
(brain->backup_recv && remote_dsync_box->have_guids)))
import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_MAILS_HAVE_GUIDS;
+ if (brain->local_dsync_box.have_only_guid128 ||
+ remote_dsync_box->have_only_guid128)
+ import_flags |= DSYNC_MAILBOX_IMPORT_FLAG_MAILS_USE_GUID128;
brain->box_importer = brain->backup_send ? NULL :
dsync_mailbox_import_init(brain->box, brain->log_scan,
diff -r a04c7365299e -r 8a7ecddca4ad src/doveadm/dsync/dsync-ibc-stream.c
--- a/src/doveadm/dsync/dsync-ibc-stream.c Sun Nov 17 17:15:42 2013 +0200
+++ b/src/doveadm/dsync/dsync-ibc-stream.c Sun Nov 17 17:59:05 2013 +0200
@@ -98,7 +98,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 have_save_guids"
+ .optional_keys = "mailbox_lost cache_fields have_guids have_save_guids have_only_guid128"
},
{ .name = "mailbox_attribute",
.chr = 'A',
@@ -1178,6 +1178,8 @@
dsync_serializer_encode_add(encoder, "have_guids", "");
if (dsync_box->have_save_guids)
dsync_serializer_encode_add(encoder, "have_save_guids", "");
+ if (dsync_box->have_only_guid128)
+ dsync_serializer_encode_add(encoder, "have_only_guid128", "");
dsync_serializer_encode_add(encoder, "uid_validity",
dec2str(dsync_box->uid_validity));
dsync_serializer_encode_add(encoder, "uid_next",
@@ -1281,6 +1283,8 @@
if (dsync_deserializer_decode_try(decoder, "have_save_guids", &value) ||
(box->have_guids && ibc->minor_version < DSYNC_PROTOCOL_MINOR_HAVE_SAVE_GUID))
box->have_save_guids = TRUE;
+ if (dsync_deserializer_decode_try(decoder, "have_only_guid128", &value))
+ box->have_only_guid128 = 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");
diff -r a04c7365299e -r 8a7ecddca4ad src/doveadm/dsync/dsync-mailbox-import.c
--- a/src/doveadm/dsync/dsync-mailbox-import.c Sun Nov 17 17:15:42 2013 +0200
+++ b/src/doveadm/dsync/dsync-mailbox-import.c Sun Nov 17 17:59:05 2013 +0200
@@ -103,6 +103,7 @@
unsigned int master_brain:1;
unsigned int revert_local_changes:1;
unsigned int mails_have_guids:1;
+ unsigned int mails_use_guid128:1;
};
static void dsync_mailbox_save_newmails(struct dsync_mailbox_importer *importer,
@@ -218,6 +219,8 @@
importer->debug = (flags & DSYNC_MAILBOX_IMPORT_FLAG_DEBUG) != 0;
importer->mails_have_guids =
(flags & DSYNC_MAILBOX_IMPORT_FLAG_MAILS_HAVE_GUIDS) != 0;
+ importer->mails_use_guid128 =
+ (flags & DSYNC_MAILBOX_IMPORT_FLAG_MAILS_USE_GUID128) != 0;
mailbox_get_open_status(importer->box, STATUS_UIDNEXT |
STATUS_HIGHESTMODSEQ | STATUS_HIGHESTPVTMODSEQ,
@@ -463,12 +466,14 @@
}
static bool
-dsync_mail_change_guid_equals(const struct dsync_mail_change *change,
+dsync_mail_change_guid_equals(struct dsync_mailbox_importer *importer,
+ const struct dsync_mail_change *change,
const char *guid, const char **cmp_guid_r)
{
guid_128_t guid_128, change_guid_128;
- if (change->type != DSYNC_MAIL_CHANGE_TYPE_EXPUNGE) {
+ if (change->type != DSYNC_MAIL_CHANGE_TYPE_EXPUNGE &&
+ !importer->mails_use_guid128) {
if (cmp_guid_r != NULL)
*cmp_guid_r = change->guid;
return strcmp(change->guid, guid) == 0;
@@ -480,7 +485,7 @@
mail_generate_guid_128_hash(guid, guid_128);
if (memcmp(change_guid_128, guid_128, GUID_128_SIZE) != 0) {
if (cmp_guid_r != NULL) {
- *cmp_guid_r = t_strdup_printf("%s(expunged, orig=%s)",
+ *cmp_guid_r = t_strdup_printf("%s(guid128, orig=%s)",
binary_to_hex(change_guid_128, sizeof(change_guid_128)),
change->guid);
}
@@ -760,7 +765,7 @@
dsync_mail_error(importer, importer->mail, "GUID");
return FALSE;
}
- if (!dsync_mail_change_guid_equals(change, guid, &cmp_guid)) {
+ if (!dsync_mail_change_guid_equals(importer, change, guid, &cmp_guid)) {
dsync_import_unexpected_state(importer, t_strdup_printf(
"Unexpected GUID mismatch for UID=%u: %s != %s",
change->uid, guid, cmp_guid));
@@ -778,7 +783,8 @@
if (change->guid == NULL || change->guid[0] == '\0' ||
importer->cur_guid[0] == '\0')
return TRUE;
- if (!dsync_mail_change_guid_equals(change, importer->cur_guid, &cmp_guid)) {
+ if (!dsync_mail_change_guid_equals(importer, change,
+ importer->cur_guid, &cmp_guid)) {
dsync_import_unexpected_state(importer, t_strdup_printf(
"Unexpected GUID mismatch (2) for UID=%u: %s != %s",
change->uid, importer->cur_guid, cmp_guid));
@@ -1294,7 +1300,8 @@
if (*change->guid != '\0' && *importer->cur_guid != '\0') {
/* we have GUIDs, verify them */
- if (dsync_mail_change_guid_equals(change, importer->cur_guid, NULL))
+ if (dsync_mail_change_guid_equals(importer, change,
+ importer->cur_guid, NULL))
return 1;
else
return 0;
@@ -1343,7 +1350,8 @@
return FALSE;
i_assert(local_change->type == DSYNC_MAIL_CHANGE_TYPE_EXPUNGE);
- if (dsync_mail_change_guid_equals(local_change, change->guid, NULL))
+ if (dsync_mail_change_guid_equals(importer, local_change,
+ change->guid, NULL))
importer->last_common_uid = change->uid;
else if (change->type != DSYNC_MAIL_CHANGE_TYPE_EXPUNGE)
dsync_mailbox_common_uid_found(importer);
diff -r a04c7365299e -r 8a7ecddca4ad src/doveadm/dsync/dsync-mailbox-import.h
--- a/src/doveadm/dsync/dsync-mailbox-import.h Sun Nov 17 17:15:42 2013 +0200
+++ b/src/doveadm/dsync/dsync-mailbox-import.h Sun Nov 17 17:59:05 2013 +0200
@@ -6,7 +6,8 @@
DSYNC_MAILBOX_IMPORT_FLAG_WANT_MAIL_REQUESTS = 0x02,
DSYNC_MAILBOX_IMPORT_FLAG_REVERT_LOCAL_CHANGES = 0x04,
DSYNC_MAILBOX_IMPORT_FLAG_DEBUG = 0x08,
- DSYNC_MAILBOX_IMPORT_FLAG_MAILS_HAVE_GUIDS = 0x10
+ DSYNC_MAILBOX_IMPORT_FLAG_MAILS_HAVE_GUIDS = 0x10,
+ DSYNC_MAILBOX_IMPORT_FLAG_MAILS_USE_GUID128 = 0x20
};
struct mailbox;
diff -r a04c7365299e -r 8a7ecddca4ad src/doveadm/dsync/dsync-mailbox.h
--- a/src/doveadm/dsync/dsync-mailbox.h Sun Nov 17 17:15:42 2013 +0200
+++ b/src/doveadm/dsync/dsync-mailbox.h Sun Nov 17 17:59:05 2013 +0200
@@ -8,7 +8,7 @@
struct dsync_mailbox {
guid_128_t mailbox_guid;
bool mailbox_lost;
- bool have_guids, have_save_guids;
+ bool have_guids, have_save_guids, have_only_guid128;
uint32_t uid_validity, uid_next, messages_count, first_recent_uid;
uint64_t highest_modseq, highest_pvt_modseq;
diff -r a04c7365299e -r 8a7ecddca4ad src/lib-storage/mail-storage-private.h
--- a/src/lib-storage/mail-storage-private.h Sun Nov 17 17:15:42 2013 +0200
+++ b/src/lib-storage/mail-storage-private.h Sun Nov 17 17:59:05 2013 +0200
@@ -72,7 +72,10 @@
MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_SAVE_GUIDS = 0x80,
/* message content can be unstructured binary data
(e.g. zlib plugin is allowed to compress/decompress mails) */
- MAIL_STORAGE_CLASS_FLAG_BINARY_DATA = 0x100
+ MAIL_STORAGE_CLASS_FLAG_BINARY_DATA = 0x100,
+ /* Message GUIDs can only be 128bit (always set
+ mailbox_status.have_only_guid128) */
+ MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUID128 = 0x200
};
struct mail_binary_cache {
diff -r a04c7365299e -r 8a7ecddca4ad src/lib-storage/mail-storage.c
--- a/src/lib-storage/mail-storage.c Sun Nov 17 17:15:42 2013 +0200
+++ b/src/lib-storage/mail-storage.c Sun Nov 17 17:59:05 2013 +0200
@@ -1502,6 +1502,8 @@
status_r->have_guids = TRUE;
if ((box->storage->class_flags & MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_SAVE_GUIDS) != 0)
status_r->have_save_guids = TRUE;
+ if ((box->storage->class_flags & MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUID128) != 0)
+ status_r->have_only_guid128 = TRUE;
}
int mailbox_get_status(struct mailbox *box,
diff -r a04c7365299e -r 8a7ecddca4ad src/lib-storage/mail-storage.h
--- a/src/lib-storage/mail-storage.h Sun Nov 17 17:15:42 2013 +0200
+++ b/src/lib-storage/mail-storage.h Sun Nov 17 17:59:05 2013 +0200
@@ -282,6 +282,8 @@
unsigned int have_guids:1;
/* mailbox_save_set_guid() works (always set) */
unsigned int have_save_guids:1;
+ /* GUIDs are always 128bit (always set) */
+ unsigned int have_only_guid128:1;
};
struct mailbox_cache_field {
More information about the dovecot-cvs
mailing list