Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id AFEB5431FAE for ; Thu, 31 Jul 2014 19:10:41 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: -2.3 X-Spam-Level: X-Spam-Status: No, score=-2.3 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_MED=-2.3] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id DBTBiPRJjygY for ; Thu, 31 Jul 2014 19:10:35 -0700 (PDT) Received: from dmz-mailsec-scanner-4.mit.edu (dmz-mailsec-scanner-4.mit.edu [18.9.25.15]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id E2879431FC7 for ; Thu, 31 Jul 2014 19:10:13 -0700 (PDT) X-AuditID: 1209190f-f79f86d0000061c8-52-53daf705e6da Received: from mailhub-auth-4.mit.edu ( [18.7.62.39]) (using TLS with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by dmz-mailsec-scanner-4.mit.edu (Symantec Messaging Gateway) with SMTP id C3.6F.25032.507FAD35; Thu, 31 Jul 2014 22:10:13 -0400 (EDT) Received: from outgoing.mit.edu (outgoing-auth-1.mit.edu [18.9.28.11]) by mailhub-auth-4.mit.edu (8.13.8/8.9.2) with ESMTP id s712ABwd010410; Thu, 31 Jul 2014 22:10:11 -0400 Received: from drake.dyndns.org (216-15-114-40.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com [216.15.114.40]) (authenticated bits=0) (User authenticated as amdragon@ATHENA.MIT.EDU) by outgoing.mit.edu (8.13.8/8.12.4) with ESMTP id s712A9pU030240 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); Thu, 31 Jul 2014 22:10:10 -0400 Received: from amthrax by drake.dyndns.org with local (Exim 4.77) (envelope-from ) id 1XD2II-00033l-1t; Thu, 31 Jul 2014 22:10:06 -0400 From: Austin Clements To: notmuch@notmuchmail.org Subject: [PATCH v3 07/13] lib: Simplify upgrade code using a transaction Date: Thu, 31 Jul 2014 22:09:57 -0400 Message-Id: <1406859003-11561-8-git-send-email-amdragon@mit.edu> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1406859003-11561-1-git-send-email-amdragon@mit.edu> References: <1406859003-11561-1-git-send-email-amdragon@mit.edu> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrLIsWRmVeSWpSXmKPExsUixG6nrsv6/VawQetibovVc3ksrt+cyezA 5LFz1l12j2erbjEHMEVx2aSk5mSWpRbp2yVwZez9+oe94J5sxZGPf5gbGJeLdzFyckgImEis /tTPBmGLSVy4tx7I5uIQEpjNJNG0/BkrhLORUWLx+w2MEM4dJonPry5BOXMZJR59aAHrZxPQ kNi2fzkjiC0iIC2x8+5sVhCbWcBR4vP+RWA1wgIeEj97pjKD2CwCqhIv5pwAs3kFHCRmflzL BHGHnETDjU9g9ZxAvf//LQCbIwRU03p6K/MERv4FjAyrGGVTcqt0cxMzc4pTk3WLkxPz8lKL dE30cjNL9FJTSjcxgkKJU5J/B+O3g0qHGAU4GJV4eB1CbwULsSaWFVfmHmKU5GBSEuW1+QgU 4kvKT6nMSCzOiC8qzUktPsQowcGsJML78gNQjjclsbIqtSgfJiXNwaIkzvvW2ipYSCA9sSQ1 OzW1ILUIJivDwaEkwXvmK1CjYFFqempFWmZOCUKaiYMTZDgP0PBrIDW8xQWJucWZ6RD5U4yK UuK8e0ASAiCJjNI8uF5YrL9iFAd6RZj3IUgVDzBNwHW/AhrMBDT4+a3rIINLEhFSUg2MboHP T10SNroyY+feXI9lZi/iLm/pqGhwfjS97fR5IaPq2ROcdhfN/1I650SS9M17kxp/yl50SlRh fHrs5lzHCbq3/uTs6PBWD11d90OpovX+40tr2cN0V67+OXPapInbGpaLxDv+D36+JqDVhiO0 fevZ/W0b2HiUM6TPV7PutatjLH+T/VvBXYmlOCPRUIu5qDgRACnh8izQAgAA X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 01 Aug 2014 02:10:42 -0000 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. --- lib/database.cc | 67 ++++++--------------------------------------------------- 1 file changed, 7 insertions(+), 60 deletions(-) diff --git a/lib/database.cc b/lib/database.cc index 29a56db..faeab51 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -1232,6 +1232,9 @@ notmuch_database_upgrade (notmuch_database_t *notmuch, timer_is_active = TRUE; } + /* Perform the upgrade in a transaction. */ + db->begin_transaction (true); + /* Set the target features so we write out changes in the desired * format. */ notmuch->features |= NOTMUCH_FEATURES_CURRENT; @@ -1263,6 +1266,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); @@ -1310,6 +1314,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); } } } @@ -1350,67 +1356,8 @@ notmuch_database_upgrade (notmuch_database_t *notmuch, 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