From: Timo Sirainen Date: Sat, 29 Nov 2008 20:52:54 +0000 (+0200) Subject: fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox. X-Git-Tag: 1.2.alpha5~60 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d0ef8bc2b961a68dd0f75662c2160bd296b9476b;p=thirdparty%2Fdovecot%2Fcore.git fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox. --HG-- branch : HEAD --- diff --git a/src/plugins/fts/fts-storage.c b/src/plugins/fts/fts-storage.c index ffa3a9024f..36c1c217e7 100644 --- a/src/plugins/fts/fts-storage.c +++ b/src/plugins/fts/fts-storage.c @@ -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 */ diff --git a/src/plugins/fts/fts-storage.h b/src/plugins/fts/fts-storage.h index d03b33d8cc..5b553bc1e9 100644 --- a/src/plugins/fts/fts-storage.h +++ b/src/plugins/fts/fts-storage.h @@ -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;