]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
authorTimo Sirainen <tss@iki.fi>
Sat, 29 Nov 2008 20:52:54 +0000 (22:52 +0200)
committerTimo Sirainen <tss@iki.fi>
Sat, 29 Nov 2008 20:52:54 +0000 (22:52 +0200)
--HG--
branch : HEAD

src/plugins/fts/fts-storage.c
src/plugins/fts/fts-storage.h

index ffa3a9024f52c1f2a28a914deacd0c124e5bf436..36c1c217e7631ae9d81668f19a0b0676292a877d 100644 (file)
@@ -380,15 +380,35 @@ static int fts_build_init_virtual(struct fts_search_context *fctx)
 
 static int fts_build_init(struct fts_search_context *fctx)
 {
+       struct mailbox_status status;
+       int ret;
+
+       mailbox_get_status(fctx->t->box, STATUS_MESSAGES | STATUS_UIDNEXT,
+                          &status);
+       if (status.messages == fctx->fbox->last_messages_count &&
+           status.uidnext == fctx->fbox->last_uidnext) {
+               /* no new messages since last check */
+               return 0;
+       }
+
        if (fctx->fbox->virtual)
-               return fts_build_init_virtual(fctx);
-       return fts_build_init_trans(fctx, fctx->t);
+               ret = fts_build_init_virtual(fctx);
+       else
+               ret = fts_build_init_trans(fctx, fctx->t);
+       if (ret == 0 && fctx->build_ctx == NULL) {
+               /* index was up-to-date */
+               fctx->fbox->last_messages_count = status.messages;
+               fctx->fbox->last_uidnext = status.uidnext;
+       }
+       return ret;
 }
 
 static int fts_build_deinit(struct fts_storage_build_context **_ctx)
 {
        struct fts_storage_build_context *ctx = *_ctx;
        struct mailbox *box = ctx->mail->transaction->box;
+       struct fts_mailbox *fbox = FTS_CONTEXT(box);
+       struct mailbox_status status;
        int ret = 0;
 
        *_ctx = NULL;
@@ -400,6 +420,13 @@ static int fts_build_deinit(struct fts_storage_build_context **_ctx)
        if (fts_backend_build_deinit(&ctx->build) < 0)
                ret = -1;
 
+       if (ret == 0) {
+               mailbox_get_status(box, STATUS_MESSAGES | STATUS_UIDNEXT,
+                                  &status);
+               fbox->last_messages_count = status.messages;
+               fbox->last_uidnext = status.uidnext;
+       }
+
        if (ioloop_time - ctx->search_start_time.tv_sec >=
            FTS_BUILD_NOTIFY_INTERVAL_SECS) {
                /* we notified at least once */
index d03b33d8cc0fcdcbaeaa5f2d4382d80ff43dcbef..5b553bc1e9ff0a197a53ddb801f617120147120c 100644 (file)
@@ -6,6 +6,8 @@ struct fts_mailbox {
        struct fts_backend *backend_substr;
        struct fts_backend *backend_fast;
 
+       unsigned int last_messages_count, last_uidnext;
+
        const char *env;
        unsigned int virtual:1;
        unsigned int backend_set:1;