]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dsync: Find changed mailboxes also based on number of messages in them.
authorTimo Sirainen <tss@iki.fi>
Thu, 1 Jul 2010 17:02:06 +0000 (18:02 +0100)
committerTimo Sirainen <tss@iki.fi>
Thu, 1 Jul 2010 17:02:06 +0000 (18:02 +0100)
--HG--
branch : HEAD

src/dsync/dsync-brain.c
src/dsync/dsync-data.h
src/dsync/dsync-proxy.c
src/dsync/dsync-worker-local.c
src/dsync/test-dsync-brain.c
src/dsync/test-dsync-proxy-server-cmd.c

index 63aea4269670a877a8112ed923c2a6a849591fd4..b254b06df975fd1db1eb1acb8accbc1e77f306c7 100644 (file)
@@ -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;
 }
 
index a5e3a1df63d3437b4cee1f276e9ed98df31d1391..6c4e1569ecf873f349ae22b2ce857f270c6471e0 100644 (file)
@@ -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. */
index dd6da9863dbe682004524c06a905a57a08e1e8c5..126fb14c83ea681fbf18f9f8932ea52d2cdff55e 100644 (file)
@@ -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";
index ec5fe2b4f9a1cee9d246331cdfe8a0da9f124fc6..69fc1cf7e74c87207462981c2424b885b5db72db 100644 (file)
@@ -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);
index c7d17ef1aed7cbc31d45a8c4535f22ce4a7be8f8..ee56546fcad707fc9502cc2f27b89e9e6ebb673d 100644 (file)
@@ -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;
index ac130e90ba7d289482935d74d7b171ed1cab771c..c66ade0af11b3bc244b0711ff7032650941cd02f 100644 (file)
@@ -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);