From: Timo Sirainen Date: Thu, 1 Jul 2010 17:02:06 +0000 (+0100) Subject: dsync: Find changed mailboxes also based on number of messages in them. X-Git-Tag: 2.0.rc1~37 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e5c06841c1965894f798dfbabc8dfe4258b9a62a;p=thirdparty%2Fdovecot%2Fcore.git dsync: Find changed mailboxes also based on number of messages in them. --HG-- branch : HEAD --- diff --git a/src/dsync/dsync-brain.c b/src/dsync/dsync-brain.c index 63aea42696..b254b06df9 100644 --- a/src/dsync/dsync-brain.c +++ b/src/dsync/dsync-brain.c @@ -562,6 +562,13 @@ static bool dsync_mailbox_has_changed_msgs(struct dsync_brain *brain, } return TRUE; } + if (box1->message_count != box2->message_count) { + if (brain->verbose) { + i_info("%s: message_count changed %u -> %u", name, + box1->message_count, box2->message_count); + } + return TRUE; + } return FALSE; } diff --git a/src/dsync/dsync-data.h b/src/dsync/dsync-data.h index a5e3a1df63..6c4e1569ec 100644 --- a/src/dsync/dsync-data.h +++ b/src/dsync/dsync-data.h @@ -22,7 +22,7 @@ struct dsync_mailbox { /* Mailbox's GUID. Full of zero with \Noselect mailboxes. */ mailbox_guid_t mailbox_guid; - uint32_t uid_validity, uid_next; + uint32_t uid_validity, uid_next, message_count; uint64_t highest_modseq; /* if mailbox is deleted, this is the deletion timestamp. otherwise it's the last rename timestamp. */ diff --git a/src/dsync/dsync-proxy.c b/src/dsync/dsync-proxy.c index dd6da9863d..126fb14c83 100644 --- a/src/dsync/dsync-proxy.c +++ b/src/dsync/dsync-proxy.c @@ -172,8 +172,8 @@ void dsync_proxy_mailbox_export(string_t *str, str_append_c(str, '\t'); dsync_proxy_mailbox_guid_export(str, &box->mailbox_guid); - str_printfa(str, "\t%u\t%u\t%llu", - box->uid_validity, box->uid_next, + str_printfa(str, "\t%u\t%u\t%u\t%llu", + box->uid_validity, box->uid_next, box->message_count, (unsigned long long)box->highest_modseq); dsync_proxy_strings_export(str, &box->cache_fields); } @@ -193,7 +193,8 @@ int dsync_proxy_mailbox_import_unescaped(pool_t pool, const char *const *args, return -1; } - /* name dir_guid mailbox_guid uid_validity uid_next highest_modseq */ + /* name dir_guid mailbox_guid uid_validity uid_next + message_count highest_modseq */ box_r->name = p_strdup(pool, args[i++]); dsync_str_sha_to_guid(box_r->name, &box_r->name_sha1); @@ -238,6 +239,12 @@ int dsync_proxy_mailbox_import_unescaped(pool_t pool, const char *const *args, return -1; } + box_r->message_count = strtoul(args[i++], &p, 10); + if (*p != '\0') { + *error_r = "Invalid mailbox message_count"; + return -1; + } + box_r->highest_modseq = strtoull(args[i++], &p, 10); if (*p != '\0') { *error_r = "Invalid mailbox highest_modseq"; diff --git a/src/dsync/dsync-worker-local.c b/src/dsync/dsync-worker-local.c index ec5fe2b4f9..69fc1cf7e7 100644 --- a/src/dsync/dsync-worker-local.c +++ b/src/dsync/dsync-worker-local.c @@ -538,6 +538,7 @@ local_worker_mailbox_iter_next(struct dsync_worker_mailbox_iter *_iter, sizeof(dsync_box_r->mailbox_guid.guid)); dsync_box_r->uid_validity = status.uidvalidity; dsync_box_r->uid_next = status.uidnext; + dsync_box_r->message_count = status.messages; dsync_box_r->highest_modseq = status.highest_modseq; p_clear(iter->ret_pool); diff --git a/src/dsync/test-dsync-brain.c b/src/dsync/test-dsync-brain.c index c7d17ef1ae..ee56546fca 100644 --- a/src/dsync/test-dsync-brain.c +++ b/src/dsync/test-dsync-brain.c @@ -111,28 +111,28 @@ dsync_brain_mailbox_name_cmp(const struct dsync_brain_mailbox *box1, static void test_dsync_brain(void) { static struct dsync_mailbox src_boxes[] = { - { "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "box2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "box3", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "box4", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "box5", '/', { { 0, } }, { { 0, } }, 1234567890, 5433, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "box6", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123124ULL, 3636, 0, ARRAY_INIT }, - { "boxx", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "boxd1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "boxd2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, DSYNC_MAILBOX_FLAG_DELETED_MAILBOX, ARRAY_INIT }, - { NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, ARRAY_INIT } + { "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "box2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "box3", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "box4", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "box5", '/', { { 0, } }, { { 0, } }, 1234567890, 5433, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "box6", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123124ULL, 3636, 0, ARRAY_INIT }, + { "boxx", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "boxd1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "boxd2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, DSYNC_MAILBOX_FLAG_DELETED_MAILBOX, ARRAY_INIT }, + { NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, 0, ARRAY_INIT } }; static struct dsync_mailbox dest_boxes[] = { - { "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "box2", '/', { { 0, } }, { { 0, } }, 1234567891, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "box3", '/', { { 0, } }, { { 0, } }, 1234567890, 5433, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "box4", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123124ULL, 3636, 0, ARRAY_INIT }, - { "box5", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "box6", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "boxy", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { "boxd1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, DSYNC_MAILBOX_FLAG_DELETED_MAILBOX, ARRAY_INIT }, - { "boxd2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 3636, 0, ARRAY_INIT }, - { NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, ARRAY_INIT } + { "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "box2", '/', { { 0, } }, { { 0, } }, 1234567891, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "box3", '/', { { 0, } }, { { 0, } }, 1234567890, 5433, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "box4", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123124ULL, 3636, 0, ARRAY_INIT }, + { "box5", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "box6", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "boxy", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { "boxd1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, DSYNC_MAILBOX_FLAG_DELETED_MAILBOX, ARRAY_INIT }, + { "boxd2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 3636, 0, ARRAY_INIT }, + { NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, 0, ARRAY_INIT } }; struct dsync_brain *brain; struct dsync_worker *src_worker, *dest_worker; @@ -221,8 +221,8 @@ static void test_dsync_brain(void) static void test_dsync_brain_full(void) { static struct dsync_mailbox boxes[] = { - { "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 123123123123ULL, 2352, 0, ARRAY_INIT }, - { NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, ARRAY_INIT } + { "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 2352, 0, ARRAY_INIT }, + { NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, 0, ARRAY_INIT } }; struct dsync_brain *brain; struct dsync_worker *src_worker, *dest_worker; diff --git a/src/dsync/test-dsync-proxy-server-cmd.c b/src/dsync/test-dsync-proxy-server-cmd.c index ac130e90ba..c66ade0af1 100644 --- a/src/dsync/test-dsync-proxy-server-cmd.c +++ b/src/dsync/test-dsync-proxy-server-cmd.c @@ -90,6 +90,7 @@ static void test_dsync_proxy_box_list(void) memcpy(box.mailbox_guid.guid, test_mailbox_guid1, MAIL_GUID_128_SIZE); box.uid_validity = 4275878552; box.uid_next = 4023233417; + box.message_count = 4525; box.highest_modseq = 18080787909545915012ULL; test_worker->box_iter.next_box = &box; @@ -99,6 +100,7 @@ static void test_dsync_proxy_box_list(void) TEST_MAILBOX_GUID1"\t" "4275878552\t" "4023233417\t" + "4525\t" "18080787909545915012\n") == 0); out_clear(); @@ -229,7 +231,7 @@ static void test_dsync_proxy_box_create(void) test_assert(run_cmd("BOX-CREATE", "selectable", "?", "61", "2", TEST_MAILBOX_GUID2, "1234567890", "9876", - "28427847284728", NULL) == 1); + "4610", "28427847284728", NULL) == 1); test_assert(test_dsync_worker_next_box_event(test_worker, &event)); test_assert(event.type == LAST_BOX_TYPE_CREATE); test_assert(strcmp(event.box.name, "selectable") == 0); @@ -238,6 +240,7 @@ static void test_dsync_proxy_box_create(void) test_assert(event.box.flags == 2); test_assert(event.box.uid_validity == 1234567890); test_assert(event.box.uid_next == 9876); + test_assert(event.box.message_count == 4610); test_assert(event.box.highest_modseq == 28427847284728); test_assert(event.box.last_change == 61); @@ -296,7 +299,7 @@ static void test_dsync_proxy_box_update(void) test_assert(run_cmd("BOX-UPDATE", "updated", "/", "53", "2", TEST_MAILBOX_GUID1, "34343", "22", - "2238427847284728", NULL) == 1); + "58293", "2238427847284728", NULL) == 1); test_assert(test_dsync_worker_next_box_event(test_worker, &event)); test_assert(event.type == LAST_BOX_TYPE_UPDATE); test_assert(strcmp(event.box.name, "updated") == 0); @@ -305,6 +308,7 @@ static void test_dsync_proxy_box_update(void) test_assert(event.box.flags == DSYNC_MAILBOX_FLAG_DELETED_MAILBOX); test_assert(event.box.uid_validity == 34343); test_assert(event.box.uid_next == 22); + test_assert(event.box.message_count == 58293); test_assert(event.box.highest_modseq == 2238427847284728); test_assert(event.box.last_change == 53);