Re: [PATCH 1/2] Add Google Inc. to AUTHORS as a contributor.
[notmuch-archives.git] / 0f / 0119d8312252dd8410545835aab14cfe939469
1 Return-Path: <amdragon@mit.edu>\r
2 X-Original-To: notmuch@notmuchmail.org\r
3 Delivered-To: notmuch@notmuchmail.org\r
4 Received: from localhost (localhost [127.0.0.1])\r
5         by olra.theworths.org (Postfix) with ESMTP id AFEB5431FAE\r
6         for <notmuch@notmuchmail.org>; Thu, 31 Jul 2014 19:10:41 -0700 (PDT)\r
7 X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
8 X-Spam-Flag: NO\r
9 X-Spam-Score: -2.3\r
10 X-Spam-Level: \r
11 X-Spam-Status: No, score=-2.3 tagged_above=-999 required=5\r
12         tests=[RCVD_IN_DNSWL_MED=-2.3] autolearn=disabled\r
13 Received: from olra.theworths.org ([127.0.0.1])\r
14         by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
15         with ESMTP id DBTBiPRJjygY for <notmuch@notmuchmail.org>;\r
16         Thu, 31 Jul 2014 19:10:35 -0700 (PDT)\r
17 Received: from dmz-mailsec-scanner-4.mit.edu (dmz-mailsec-scanner-4.mit.edu\r
18         [18.9.25.15])\r
19         (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))\r
20         (No client certificate requested)\r
21         by olra.theworths.org (Postfix) with ESMTPS id E2879431FC7\r
22         for <notmuch@notmuchmail.org>; Thu, 31 Jul 2014 19:10:13 -0700 (PDT)\r
23 X-AuditID: 1209190f-f79f86d0000061c8-52-53daf705e6da\r
24 Received: from mailhub-auth-4.mit.edu ( [18.7.62.39])\r
25         (using TLS with cipher AES256-SHA (256/256 bits))\r
26         (Client did not present a certificate)\r
27         by dmz-mailsec-scanner-4.mit.edu (Symantec Messaging Gateway) with SMTP\r
28         id C3.6F.25032.507FAD35; Thu, 31 Jul 2014 22:10:13 -0400 (EDT)\r
29 Received: from outgoing.mit.edu (outgoing-auth-1.mit.edu [18.9.28.11])\r
30         by mailhub-auth-4.mit.edu (8.13.8/8.9.2) with ESMTP id s712ABwd010410; \r
31         Thu, 31 Jul 2014 22:10:11 -0400\r
32 Received: from drake.dyndns.org\r
33         (216-15-114-40.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com\r
34         [216.15.114.40]) (authenticated bits=0)\r
35         (User authenticated as amdragon@ATHENA.MIT.EDU)\r
36         by outgoing.mit.edu (8.13.8/8.12.4) with ESMTP id s712A9pU030240\r
37         (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
38         Thu, 31 Jul 2014 22:10:10 -0400\r
39 Received: from amthrax by drake.dyndns.org with local (Exim 4.77)\r
40         (envelope-from <amdragon@mit.edu>)\r
41         id 1XD2II-00033l-1t; Thu, 31 Jul 2014 22:10:06 -0400\r
42 From: Austin Clements <amdragon@MIT.EDU>\r
43 To: notmuch@notmuchmail.org\r
44 Subject: [PATCH v3 07/13] lib: Simplify upgrade code using a transaction\r
45 Date: Thu, 31 Jul 2014 22:09:57 -0400\r
46 Message-Id: <1406859003-11561-8-git-send-email-amdragon@mit.edu>\r
47 X-Mailer: git-send-email 2.0.0\r
48 In-Reply-To: <1406859003-11561-1-git-send-email-amdragon@mit.edu>\r
49 References: <1406859003-11561-1-git-send-email-amdragon@mit.edu>\r
50 X-Brightmail-Tracker:\r
51  H4sIAAAAAAAAA+NgFtrLIsWRmVeSWpSXmKPExsUixG6nrsv6/VawQetibovVc3ksrt+cyezA\r
52         5LFz1l12j2erbjEHMEVx2aSk5mSWpRbp2yVwZez9+oe94J5sxZGPf5gbGJeLdzFyckgImEis\r
53         /tTPBmGLSVy4tx7I5uIQEpjNJNG0/BkrhLORUWLx+w2MEM4dJonPry5BOXMZJR59aAHrZxPQ\r
54         kNi2fzkjiC0iIC2x8+5sVhCbWcBR4vP+RWA1wgIeEj97pjKD2CwCqhIv5pwAs3kFHCRmflzL\r
55         BHGHnETDjU9g9ZxAvf//LQCbIwRU03p6K/MERv4FjAyrGGVTcqt0cxMzc4pTk3WLkxPz8lKL\r
56         dE30cjNL9FJTSjcxgkKJU5J/B+O3g0qHGAU4GJV4eB1CbwULsSaWFVfmHmKU5GBSEuW1+QgU\r
57         4kvKT6nMSCzOiC8qzUktPsQowcGsJML78gNQjjclsbIqtSgfJiXNwaIkzvvW2ipYSCA9sSQ1\r
58         OzW1ILUIJivDwaEkwXvmK1CjYFFqempFWmZOCUKaiYMTZDgP0PBrIDW8xQWJucWZ6RD5U4yK\r
59         UuK8e0ASAiCJjNI8uF5YrL9iFAd6RZj3IUgVDzBNwHW/AhrMBDT4+a3rIINLEhFSUg2MboHP\r
60         T10SNroyY+feXI9lZi/iLm/pqGhwfjS97fR5IaPq2ROcdhfN/1I650SS9M17kxp/yl50SlRh\r
61         fHrs5lzHCbq3/uTs6PBWD11d90OpovX+40tr2cN0V67+OXPapInbGpaLxDv+D36+JqDVhiO0\r
62         fevZ/W0b2HiUM6TPV7PutatjLH+T/VvBXYmlOCPRUIu5qDgRACnh8izQAgAA\r
63 X-BeenThere: notmuch@notmuchmail.org\r
64 X-Mailman-Version: 2.1.13\r
65 Precedence: list\r
66 List-Id: "Use and development of the notmuch mail system."\r
67         <notmuch.notmuchmail.org>\r
68 List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
69         <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
70 List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
71 List-Post: <mailto:notmuch@notmuchmail.org>\r
72 List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
73 List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
74         <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
75 X-List-Received-Date: Fri, 01 Aug 2014 02:10:42 -0000\r
76 \r
77 Previously, the upgrade was organized as two passes -- an upgrade\r
78 pass, and a separate cleanup pass -- so the database was always in a\r
79 valid state.  This change substantially simplifies this code by\r
80 performing the upgrade in a transaction and combining both passes in\r
81 to one.  This 1) eliminates a lot of duplicate code between the\r
82 passes, 2) speeds up the upgrade process, 3) makes progress reporting\r
83 more accurate, 4) eliminates the potential for stale data if the\r
84 upgrade is interrupted during the cleanup pass, and 5) makes it easier\r
85 to reason about the safety of the upgrade code.\r
86 ---\r
87  lib/database.cc | 67 ++++++---------------------------------------------------\r
88  1 file changed, 7 insertions(+), 60 deletions(-)\r
89 \r
90 diff --git a/lib/database.cc b/lib/database.cc\r
91 index 29a56db..faeab51 100644\r
92 --- a/lib/database.cc\r
93 +++ b/lib/database.cc\r
94 @@ -1232,6 +1232,9 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,\r
95         timer_is_active = TRUE;\r
96      }\r
97  \r
98 +    /* Perform the upgrade in a transaction. */\r
99 +    db->begin_transaction (true);\r
100 +\r
101      /* Set the target features so we write out changes in the desired\r
102       * format. */\r
103      notmuch->features |= NOTMUCH_FEATURES_CURRENT;\r
104 @@ -1263,6 +1266,7 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,\r
105             filename = _notmuch_message_talloc_copy_data (message);\r
106             if (filename && *filename != '\0') {\r
107                 _notmuch_message_add_filename (message, filename);\r
108 +               _notmuch_message_clear_data (message);\r
109                 _notmuch_message_sync (message);\r
110             }\r
111             talloc_free (filename);\r
112 @@ -1310,6 +1314,8 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,\r
113                                                        NOTMUCH_FIND_CREATE, &status);\r
114                 notmuch_directory_set_mtime (directory, mtime);\r
115                 notmuch_directory_destroy (directory);\r
116 +\r
117 +               db->delete_document (*p);\r
118             }\r
119         }\r
120      }\r
121 @@ -1350,67 +1356,8 @@ notmuch_database_upgrade (notmuch_database_t *notmuch,\r
122  \r
123      db->set_metadata ("features", _print_features (local, notmuch->features));\r
124      db->set_metadata ("version", STRINGIFY (NOTMUCH_DATABASE_VERSION));\r
125 -    db->flush ();\r
126 -\r
127 -    /* Now that the upgrade is complete we can remove the old data\r
128 -     * and documents that are no longer needed. */\r
129 -    if (version < 1) {\r
130 -       notmuch_query_t *query = notmuch_query_create (notmuch, "");\r
131 -       notmuch_messages_t *messages;\r
132 -       notmuch_message_t *message;\r
133 -       char *filename;\r
134 -\r
135 -       for (messages = notmuch_query_search_messages (query);\r
136 -            notmuch_messages_valid (messages);\r
137 -            notmuch_messages_move_to_next (messages))\r
138 -       {\r
139 -           if (do_progress_notify) {\r
140 -               progress_notify (closure, (double) count / total);\r
141 -               do_progress_notify = 0;\r
142 -           }\r
143 -\r
144 -           message = notmuch_messages_get (messages);\r
145 -\r
146 -           filename = _notmuch_message_talloc_copy_data (message);\r
147 -           if (filename && *filename != '\0') {\r
148 -               _notmuch_message_clear_data (message);\r
149 -               _notmuch_message_sync (message);\r
150 -           }\r
151 -           talloc_free (filename);\r
152 -\r
153 -           notmuch_message_destroy (message);\r
154 -       }\r
155  \r
156 -       notmuch_query_destroy (query);\r
157 -    }\r
158 -\r
159 -    if (version < 1) {\r
160 -       Xapian::TermIterator t, t_end;\r
161 -\r
162 -       t_end = notmuch->xapian_db->allterms_end ("XTIMESTAMP");\r
163 -\r
164 -       for (t = notmuch->xapian_db->allterms_begin ("XTIMESTAMP");\r
165 -            t != t_end;\r
166 -            t++)\r
167 -       {\r
168 -           Xapian::PostingIterator p, p_end;\r
169 -           std::string term = *t;\r
170 -\r
171 -           p_end = notmuch->xapian_db->postlist_end (term);\r
172 -\r
173 -           for (p = notmuch->xapian_db->postlist_begin (term);\r
174 -                p != p_end;\r
175 -                p++)\r
176 -           {\r
177 -               if (do_progress_notify) {\r
178 -                   progress_notify (closure, (double) count / total);\r
179 -                   do_progress_notify = 0;\r
180 -               }\r
181 -\r
182 -               db->delete_document (*p);\r
183 -           }\r
184 -       }\r
185 -    }\r
186 +    db->commit_transaction ();\r
187  \r
188      if (timer_is_active) {\r
189         /* Now stop the timer. */\r
190 -- \r
191 2.0.0\r
192 \r