Re: [PATCH v4 13/16] add indexopts to notmuch python bindings.
[notmuch-archives.git] / fb / 0beb007120ef10e4983abaf3ab6045f32b06c6
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 7D774431FAE\r
6         for <notmuch@notmuchmail.org>; Mon, 25 Aug 2014 10:27:08 -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 ny5HVBsOmgFa for <notmuch@notmuchmail.org>;\r
16         Mon, 25 Aug 2014 10:27:02 -0700 (PDT)\r
17 Received: from dmz-mailsec-scanner-6.mit.edu (dmz-mailsec-scanner-6.mit.edu\r
18         [18.7.68.35])\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 0013C431FD0\r
22         for <notmuch@notmuchmail.org>; Mon, 25 Aug 2014 10:26:25 -0700 (PDT)\r
23 X-AuditID: 12074423-f799d6d00000337c-c4-53fb71c11795\r
24 Received: from mailhub-auth-1.mit.edu ( [18.9.21.35])\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-6.mit.edu (Symantec Messaging Gateway) with SMTP\r
28         id 6C.A0.13180.1C17BF35; Mon, 25 Aug 2014 13:26:25 -0400 (EDT)\r
29 Received: from outgoing.mit.edu (outgoing-auth-1.mit.edu [18.9.28.11])\r
30         by mailhub-auth-1.mit.edu (8.13.8/8.9.2) with ESMTP id s7PHQEWx007794; \r
31         Mon, 25 Aug 2014 13:26:14 -0400\r
32 Received: from drake.dyndns.org (31-35-14.wireless.csail.mit.edu\r
33         [128.31.35.14]) (authenticated bits=0)\r
34         (User authenticated as amdragon@ATHENA.MIT.EDU)\r
35         by outgoing.mit.edu (8.13.8/8.12.4) with ESMTP id s7PHQC45029613\r
36         (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT);\r
37         Mon, 25 Aug 2014 13:26:13 -0400\r
38 Received: from amthrax by drake.dyndns.org with local (Exim 4.77)\r
39         (envelope-from <amdragon@mit.edu>)\r
40         id 1XLy1z-0003jV-W5; Mon, 25 Aug 2014 13:26:11 -0400\r
41 From: Austin Clements <amdragon@mit.edu>\r
42 To: notmuch@notmuchmail.org\r
43 Subject: [PATCH v4 05/11] lib: Simplify upgrade code using a transaction\r
44 Date: Mon, 25 Aug 2014 13:26:03 -0400\r
45 Message-Id: <1408987569-14146-6-git-send-email-amdragon@mit.edu>\r
46 X-Mailer: git-send-email 2.0.0\r
47 In-Reply-To: <1408987569-14146-1-git-send-email-amdragon@mit.edu>\r
48 References: <1408987569-14146-1-git-send-email-amdragon@mit.edu>\r
49 X-Brightmail-Tracker:\r
50  H4sIAAAAAAAAA+NgFjrKIsWRmVeSWpSXmKPExsUixCmqrHuw8Hewwa1Ofosbrd2MFk3TnS2u\r
51         35zJ7MDscev+a3aPZ6tuMXtsOfSeOYA5issmJTUnsyy1SN8ugStjbV9JwT3ZihN3LjM2MC4X\r
52         72Lk5JAQMJHYfvEvE4QtJnHh3nq2LkYuDiGB2UwSx4++ZoJwNjJK3O7cApU5xiTxe9FuRpAW\r
53         IYG5jBLr/jqA2GwCGhK/by0GGyUiIC2x8+5sVhCbWcBLYtmFfjBbWMBDYuahFrBeFgFViV1b\r
54         usHivAIOErtmrWCEOENOouHGJzYQm1PAUWL6wtlMELscJL5fPs88gZF/ASPDKkbZlNwq3dzE\r
55         zJzi1GTd4uTEvLzUIl0zvdzMEr3UlNJNjKDQYndR3sH456DSIUYBDkYlHt4b8b+DhVgTy4or\r
56         cw8xSnIwKYnyTssHCvEl5adUZiQWZ8QXleakFh9ilOBgVhLhbQbJ8aYkVlalFuXDpKQ5WJTE\r
57         ed9aWwULCaQnlqRmp6YWpBbBZGU4OJQkeHMLgBoFi1LTUyvSMnNKENJMHJwgw3mAhseD1PAW\r
58         FyTmFmemQ+RPMSpKifOuBdkqAJLIKM2D64XF/itGcaBXhHmPgrTzANMGXPcroMFMQINNe36C\r
59         DC5JREhJNTAekyiWtjzKP5l12Yq1SxaLnRY4F36geNWWt3M9H4tvnRe7a0fS2nW9TVUlq14n\r
60         /pDgXJ47Lzqb5WNjDkdm+PZZOw+yLbzCt3PyTr0Hq6Q+26x4Z9HAUnFf5IT9rvdeE65sNFm4\r
61         onq/l+fRRVdfecgc31Z6esrFrRN6eRInrfkms/q+0AHV+dO+nVFiKc5INNRiLipOBADOjV+J\r
62         2AIAAA==\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: Mon, 25 Aug 2014 17:27:09 -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 2b566f7..1e46fc8 100644\r
92 --- a/lib/database.cc\r
93 +++ b/lib/database.cc\r
94 @@ -1239,6 +1239,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 @@ -1270,6 +1273,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 @@ -1317,6 +1321,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 @@ -1357,67 +1363,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