From: Mark Walters <markwalters1009@gmail.com>
To: Austin Clements <amdragon@MIT.EDU>, notmuch@notmuchmail.org
Subject: Re: [PATCH 08/14] lib: Simplify upgrade code using a transaction
Date: Sun, 27 Jul 2014 10:35:53 +0100 [thread overview]
Message-ID: <87vbqjywhy.fsf@qmul.ac.uk> (raw)
In-Reply-To: <1406433173-19169-9-git-send-email-amdragon@mit.edu>
Hi
On Sun, 27 Jul 2014, Austin Clements <amdragon@MIT.EDU> wrote:
> Previously, the upgrade was organized as two passes -- an upgrade
> pass, and a separate cleanup pass -- so the database was always in a
> valid state. This change substantially simplifies this code by
> performing the upgrade in a transaction and combining both passes in
> to one. This 1) eliminates a lot of duplicate code between the
> passes, 2) speeds up the upgrade process, 3) makes progress reporting
> more accurate, 4) eliminates the potential for stale data if the
> upgrade is interrupted during the cleanup pass, and 5) makes it easier
> to reason about the safety of the upgrade code.
I like this but I wonder if it has a side effect: I think with the
current code the user can interrupt the upgrade (ctrl-c) and continue
roughly where it left off. This looks like it means the whole upgrade
needs to be done in one go. Will this be a problem on large mail stores
(eg rlb with over 1M messages)?
I am not sure what could be done during the interrupted upgrade before
so maybe this is not a problem.
Best wishes
Mark
> ---
> lib/database.cc | 67 ++++++---------------------------------------------------
> 1 file changed, 7 insertions(+), 60 deletions(-)
>
> diff --git a/lib/database.cc b/lib/database.cc
> index 03eef3e..0be7180 100644
> --- a/lib/database.cc
> +++ b/lib/database.cc
> @@ -1238,6 +1238,9 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
> timer_is_active = TRUE;
> }
>
> + /* Perform the upgrade in a transaction. */
> + db->begin_transaction (true);
> +
> /* Before version 1, each message document had its filename in the
> * data field. Copy that into the new format by calling
> * notmuch_message_add_filename.
> @@ -1265,6 +1268,7 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
> filename = _notmuch_message_talloc_copy_data (message);
> if (filename && *filename != '\0') {
> _notmuch_message_add_filename (message, filename);
> + _notmuch_message_clear_data (message);
> _notmuch_message_sync (message);
> }
> talloc_free (filename);
> @@ -1312,6 +1316,8 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
> NOTMUCH_FIND_CREATE, &status);
> notmuch_directory_set_mtime (directory, mtime);
> notmuch_directory_destroy (directory);
> +
> + db->delete_document (*p);
> }
> }
> }
> @@ -1353,67 +1359,8 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,
> notmuch->features |= NOTMUCH_FEATURES_CURRENT;
> db->set_metadata ("features", _print_features (local, notmuch->features));
> db->set_metadata ("version", STRINGIFY (NOTMUCH_DATABASE_VERSION));
> - db->flush ();
> -
> - /* Now that the upgrade is complete we can remove the old data
> - * and documents that are no longer needed. */
> - if (version < 1) {
> - notmuch_query_t *query = notmuch_query_create (notmuch, "");
> - notmuch_messages_t *messages;
> - notmuch_message_t *message;
> - char *filename;
> -
> - for (messages = notmuch_query_search_messages (query);
> - notmuch_messages_valid (messages);
> - notmuch_messages_move_to_next (messages))
> - {
> - if (do_progress_notify) {
> - progress_notify (closure, (double) count / total);
> - do_progress_notify = 0;
> - }
> -
> - message = notmuch_messages_get (messages);
> -
> - filename = _notmuch_message_talloc_copy_data (message);
> - if (filename && *filename != '\0') {
> - _notmuch_message_clear_data (message);
> - _notmuch_message_sync (message);
> - }
> - talloc_free (filename);
> -
> - notmuch_message_destroy (message);
> - }
>
> - notmuch_query_destroy (query);
> - }
> -
> - if (version < 1) {
> - Xapian::TermIterator t, t_end;
> -
> - t_end = notmuch->xapian_db->allterms_end ("XTIMESTAMP");
> -
> - for (t = notmuch->xapian_db->allterms_begin ("XTIMESTAMP");
> - t != t_end;
> - t++)
> - {
> - Xapian::PostingIterator p, p_end;
> - std::string term = *t;
> -
> - p_end = notmuch->xapian_db->postlist_end (term);
> -
> - for (p = notmuch->xapian_db->postlist_begin (term);
> - p != p_end;
> - p++)
> - {
> - if (do_progress_notify) {
> - progress_notify (closure, (double) count / total);
> - do_progress_notify = 0;
> - }
> -
> - db->delete_document (*p);
> - }
> - }
> - }
> + db->commit_transaction ();
>
> if (timer_is_active) {
> /* Now stop the timer. */
> --
> 2.0.0
>
> _______________________________________________
> notmuch mailing list
> notmuch@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch
next prev parent reply other threads:[~2014-07-27 9:36 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-07-27 3:52 [PATCH 0/14] Implement and use database "features" Austin Clements
2014-07-27 3:52 ` [PATCH 01/14] test: Include generated dependencies for test sources Austin Clements
2014-07-27 3:52 ` [PATCH 02/14] util: Make string-util.h C++-compatible Austin Clements
2014-07-27 3:52 ` [PATCH 03/14] util: Const version of strtok_len Austin Clements
2014-07-27 3:52 ` [PATCH 04/14] new: Don't report version after upgrade Austin Clements
2014-07-27 9:33 ` Mark Walters
2014-07-27 16:24 ` Austin Clements
2014-07-27 3:52 ` [PATCH 05/14] lib: Database version 3: Introduce fine-grained "features" Austin Clements
2014-07-27 9:53 ` Mark Walters
2014-07-27 16:58 ` Austin Clements
2014-07-27 3:52 ` [PATCH 06/14] test: Tool to build DB with specific version and features Austin Clements
2014-07-27 3:52 ` [PATCH 07/14] test: Tests for future version and unknown feature handling Austin Clements
2014-07-27 8:51 ` Mark Walters
2014-07-27 16:12 ` Austin Clements
2014-07-27 3:52 ` [PATCH 08/14] lib: Simplify upgrade code using a transaction Austin Clements
2014-07-27 9:35 ` Mark Walters [this message]
2014-07-27 16:42 ` Austin Clements
2014-07-27 3:52 ` [PATCH 09/14] lib: Use database features to drive upgrade Austin Clements
2014-07-27 3:52 ` [PATCH 10/14] lib: Reorganize upgrade around document types Austin Clements
2014-07-27 3:52 ` [PATCH 11/14] lib: Report progress for combined upgrade operation Austin Clements
2014-07-27 3:52 ` [PATCH 12/14] lib: Support empty header values in database Austin Clements
2014-07-27 3:52 ` [PATCH 13/14] lib: Return an error from operations that require an upgrade Austin Clements
2014-07-27 3:52 ` [PATCH 14/14] lib: Update doc of notmuch_database_{needs_upgrade, upgrade} Austin Clements
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://notmuchmail.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87vbqjywhy.fsf@qmul.ac.uk \
--to=markwalters1009@gmail.com \
--cc=amdragon@MIT.EDU \
--cc=notmuch@notmuchmail.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://yhetil.org/notmuch.git/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).