]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dsync: Preserve \Recent flags state (instead of setting everything \Recent).
authorTimo Sirainen <tss@iki.fi>
Wed, 16 Mar 2011 15:46:29 +0000 (17:46 +0200)
committerTimo Sirainen <tss@iki.fi>
Wed, 16 Mar 2011 15:46:29 +0000 (17:46 +0200)
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 8083d4e3e54cd703abe6cf62d36aa6d574a68c92..7ad27939f1eb7424acea13fbe4a2c1c1448c2da0 100644 (file)
@@ -290,6 +290,7 @@ dsync_brain_mailbox_action(struct dsync_brain *brain,
        case DSYNC_BRAIN_MAILBOX_ACTION_CREATE:
                new_box = *action_box;
                new_box.uid_next = action_box->uid_validity == 0 ? 0 : 1;
+               new_box.first_recent_uid = 0;
                new_box.highest_modseq = 0;
                dsync_worker_create_mailbox(action_worker, &new_box);
                break;
index 6c4e1569ecf873f349ae22b2ce857f270c6471e0..4d046340f8adc5c2323c48f4d12bd17f2e5ec3ed 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, message_count;
+       uint32_t uid_validity, uid_next, message_count, first_recent_uid;
        uint64_t highest_modseq;
        /* if mailbox is deleted, this is the deletion timestamp.
           otherwise it's the last rename timestamp. */
index e2a95bf6617037d85458940d2441abf574a1c62a..bab578c0f4957234d2ddfb633da3549d4c0f7081 100644 (file)
@@ -174,9 +174,10 @@ 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%u\t%llu",
+       str_printfa(str, "\t%u\t%u\t%u\t%llu\t%u",
                    box->uid_validity, box->uid_next, box->message_count,
-                   (unsigned long long)box->highest_modseq);
+                   (unsigned long long)box->highest_modseq,
+                   box->first_recent_uid);
        dsync_proxy_strings_export(str, &box->cache_fields);
 }
 
@@ -261,6 +262,12 @@ int dsync_proxy_mailbox_import_unescaped(pool_t pool, const char *const *args,
                return -1;
        }
 
+       box_r->first_recent_uid = strtoul(args[i++], &p, 10);
+       if (*p != '\0') {
+               *error_r = "Invalid mailbox first_recent_uid";
+               return -1;
+       }
+
        args += i;
        count -= i;
        p_array_init(&box_r->cache_fields, pool, count + 1);
index 2a7e729635407f4ae0fe3b1b3eb968f797e00033..1b26f04153f06a9a00875ab66b8237c3cca01712 100644 (file)
@@ -566,7 +566,8 @@ local_worker_mailbox_iter_next(struct dsync_worker_mailbox_iter *_iter,
        }
 
        mailbox_get_status(box, STATUS_UIDNEXT | STATUS_UIDVALIDITY |
-                          STATUS_HIGHESTMODSEQ | STATUS_CACHE_FIELDS, &status);
+                          STATUS_HIGHESTMODSEQ | STATUS_CACHE_FIELDS |
+                          STATUS_FIRST_RECENT_UID, &status);
 
        change = hash_table_lookup(worker->mailbox_changes_hash, mailbox_guid);
        if (change != NULL) {
@@ -579,6 +580,7 @@ local_worker_mailbox_iter_next(struct dsync_worker_mailbox_iter *_iter,
        dsync_box_r->uid_validity = status.uidvalidity;
        dsync_box_r->uid_next = status.uidnext;
        dsync_box_r->message_count = status.messages;
+       dsync_box_r->first_recent_uid = status.first_recent_uid;
        dsync_box_r->highest_modseq = status.highest_modseq;
 
        p_clear(iter->ret_pool);
@@ -1030,6 +1032,7 @@ local_worker_copy_mailbox_update(const struct dsync_mailbox *dsync_box,
               sizeof(update_r->mailbox_guid));
        update_r->uid_validity = dsync_box->uid_validity;
        update_r->min_next_uid = dsync_box->uid_next;
+       update_r->min_first_recent_uid = dsync_box->first_recent_uid;
        update_r->min_highest_modseq = dsync_box->highest_modseq;
 }
 
index 9e9245a58e10ae1ff61c4ed18e9f948d75765ce2..06fbe579eb2405033a0102275ad79532c06aa774 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, 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 }
+               { "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "box2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "box3", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "box4", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "box5", '/', { { 0, } }, { { 0, } }, 1234567890, 5433, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "box6", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123124ULL, 3636, 0, ARRAY_INIT },
+               { "boxx", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "boxd1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "boxd2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, DSYNC_MAILBOX_FLAG_DELETED_MAILBOX, ARRAY_INIT },
+               { NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, 0, 0, ARRAY_INIT }
        };
        static struct dsync_mailbox dest_boxes[] = {
-               { "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 }
+               { "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "box2", '/', { { 0, } }, { { 0, } }, 1234567891, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "box3", '/', { { 0, } }, { { 0, } }, 1234567890, 5433, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "box4", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123124ULL, 3636, 0, ARRAY_INIT },
+               { "box5", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "box6", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "boxy", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { "boxd1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, DSYNC_MAILBOX_FLAG_DELETED_MAILBOX, ARRAY_INIT },
+               { "boxd2", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 3636, 0, ARRAY_INIT },
+               { NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, 0, 0, ARRAY_INIT }
        };
        struct dsync_brain *brain;
        struct dsync_worker *src_worker, *dest_worker;
@@ -225,8 +225,8 @@ static void test_dsync_brain(void)
 static void test_dsync_brain_full(void)
 {
        static struct dsync_mailbox boxes[] = {
-               { "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 123123123123ULL, 2352, 0, ARRAY_INIT },
-               { NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, 0, ARRAY_INIT }
+               { "box1", '/', { { 0, } }, { { 0, } }, 1234567890, 5432, 0, 1, 123123123123ULL, 2352, 0, ARRAY_INIT },
+               { NULL, 0, { { 0, } }, { { 0, } }, 0, 0, 0, 0, 0, 0, 0, ARRAY_INIT }
        };
        struct dsync_brain *brain;
        struct dsync_worker *src_worker, *dest_worker;
index e0b8fcbf8c347218b90c1860245288772847465d..acb3b03d8aa5f098abd9e0b7bc775bd3ba23f3e2 100644 (file)
@@ -92,6 +92,7 @@ static void test_dsync_proxy_box_list(void)
        box.uid_next = 4023233417;
        box.message_count = 4525;
        box.highest_modseq = 18080787909545915012ULL;
+       box.first_recent_uid = 353;
        test_worker->box_iter.next_box = &box;
 
        test_assert(run_more() == 0);
@@ -101,7 +102,8 @@ static void test_dsync_proxy_box_list(void)
                           "4275878552\t"
                           "4023233417\t"
                           "4525\t"
-                          "18080787909545915012\n") == 0);
+                          "18080787909545915012\t"
+                          "353\n") == 0);
        out_clear();
 
        /* last mailbox */
@@ -231,7 +233,7 @@ static void test_dsync_proxy_box_create(void)
 
        test_assert(run_cmd("BOX-CREATE", "selectable", "?",
                            "61", "2", TEST_MAILBOX_GUID2, "1234567890", "9876",
-                           "4610", "28427847284728", NULL) == 1);
+                           "4610", "28427847284728", "853", 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);
@@ -242,6 +244,7 @@ static void test_dsync_proxy_box_create(void)
        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.first_recent_uid == 853);
        test_assert(event.box.last_change == 61);
 
        test_end();
@@ -299,7 +302,7 @@ static void test_dsync_proxy_box_update(void)
 
        test_assert(run_cmd("BOX-UPDATE", "updated", "/",
                            "53", "2", TEST_MAILBOX_GUID1, "34343", "22",
-                           "58293", "2238427847284728", NULL) == 1);
+                           "58293", "2238427847284728", "2482", 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);
@@ -310,6 +313,7 @@ static void test_dsync_proxy_box_update(void)
        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.first_recent_uid == 2482);
        test_assert(event.box.last_change == 53);
 
        test_end();