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 11196431FCB for ; Sat, 26 Jul 2014 20:53:38 -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 unXTh991hghl for ; Sat, 26 Jul 2014 20:53:32 -0700 (PDT) Received: from dmz-mailsec-scanner-5.mit.edu (dmz-mailsec-scanner-5.mit.edu [18.7.68.34]) by olra.theworths.org (Postfix) with ESMTP id 344CD431FD2 for ; Sat, 26 Jul 2014 20:53:09 -0700 (PDT) X-AuditID: 12074422-f79be6d000007518-4f-53d477a2a55b Received: from mailhub-auth-2.mit.edu ( [18.7.62.36]) (using TLS with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by dmz-mailsec-scanner-5.mit.edu (Symantec Messaging Gateway) with SMTP id DD.39.29976.2A774D35; Sat, 26 Jul 2014 23:53:07 -0400 (EDT) Received: from outgoing.mit.edu (outgoing-auth-1.mit.edu [18.9.28.11]) by mailhub-auth-2.mit.edu (8.13.8/8.9.2) with ESMTP id s6R3r4xh014368; Sat, 26 Jul 2014 23:53:05 -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 s6R3r0xt016402 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); Sat, 26 Jul 2014 23:53:04 -0400 Received: from amthrax by drake.dyndns.org with local (Exim 4.77) (envelope-from ) id 1XBFW8-00051R-CS; Sat, 26 Jul 2014 23:53:00 -0400 From: Austin Clements To: notmuch@notmuchmail.org Subject: [PATCH 08/14] lib: Simplify upgrade code using a transaction Date: Sat, 26 Jul 2014 23:52:47 -0400 Message-Id: <1406433173-19169-9-git-send-email-amdragon@mit.edu> X-Mailer: git-send-email 2.0.0 In-Reply-To: <1406433173-19169-1-git-send-email-amdragon@mit.edu> References: <1406433173-19169-1-git-send-email-amdragon@mit.edu> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrHIsWRmVeSWpSXmKPExsUixG6noru4/EqwwbFJjBbXb85kdmD0eLbq FnMAYxSXTUpqTmZZapG+XQJXxovn0QVr5Sr6unrYGhhfincxcnBICJhIbJ3t1MXICWSKSVy4 t54NxBYSmM0kcfxkRBcjF5C9kVHi8/FbTBDOHSaJbasesUI4cxkljm/+yQTSwiagIbFt/3JG EFtEQFpi593ZrCAbmAXUJP50qYCEhQVcJSbefw+2gUVAVWLml72MICW8Ag4SV45XQxwhJ9Fw 4xNYCaeAo8TxZyfYQEqEgEpuXUqcwMi/gJFhFaNsSm6Vbm5iZk5xarJucXJiXl5qka6pXm5m iV5qSukmRnCwuCjtYPx5UOkQowAHoxIPbwbblWAh1sSy4srcQ4ySHExKorz7zYBCfEn5KZUZ icUZ8UWlOanFhxglOJiVRHiFioFyvCmJlVWpRfkwKWkOFiVx3rfWVsFCAumJJanZqakFqUUw WRkODiUJXilgVAgJFqWmp1akZeaUIKSZODhBhvMADd9QCjK8uCAxtzgzHSJ/ilFRSpz3F0hC ACSRUZoH1wuL5leM4kCvCPOylgFV8QATAVz3K6DBTECDWfwvgwwuSURISTUwxvznOXvj9+yW mOyZWR/3/61+PWu+U5zVv+M/Zhtbt7rw1UjMe+OtKhU6LWnPYYdVaaEvXz7qsPi86NJXM8sN TSaV5ytUFY7K996Rnn/3xGYzdgMLaeUDtxhnn4lPl3n1zs3bdlfElKKTE0WvLH5z8BBX/N8N r8qaLG7xX13j1npKk+lx39JVbEosxRmJhlrMRcWJAHRQWqLBAgAA 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: Sun, 27 Jul 2014 03:53:38 -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 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