Re: compactor adjustments
authorTomi Ollila <tomi.ollila@iki.fi>
Tue, 12 Nov 2013 18:58:24 +0000 (20:58 +0200)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 17:58:11 +0000 (09:58 -0800)
02/2a8842aa8499286dfb646fc9b7289fe8ae6f7c [new file with mode: 0644]

diff --git a/02/2a8842aa8499286dfb646fc9b7289fe8ae6f7c b/02/2a8842aa8499286dfb646fc9b7289fe8ae6f7c
new file mode 100644 (file)
index 0000000..82a4948
--- /dev/null
@@ -0,0 +1,161 @@
+Return-Path: <tomi.ollila@iki.fi>\r
+X-Original-To: notmuch@notmuchmail.org\r
+Delivered-To: notmuch@notmuchmail.org\r
+Received: from localhost (localhost [127.0.0.1])\r
+       by olra.theworths.org (Postfix) with ESMTP id D63F5431FDA\r
+       for <notmuch@notmuchmail.org>; Tue, 12 Nov 2013 10:58:39 -0800 (PST)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: 0\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none]\r
+       autolearn=disabled\r
+Received: from olra.theworths.org ([127.0.0.1])\r
+       by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024)\r
+       with ESMTP id wx3KBlz2jj80 for <notmuch@notmuchmail.org>;\r
+       Tue, 12 Nov 2013 10:58:31 -0800 (PST)\r
+Received: from guru.guru-group.fi (guru.guru-group.fi [46.183.73.34])\r
+       by olra.theworths.org (Postfix) with ESMTP id C6414431FD7\r
+       for <notmuch@notmuchmail.org>; Tue, 12 Nov 2013 10:58:30 -0800 (PST)\r
+Received: from guru.guru-group.fi (localhost [IPv6:::1])\r
+       by guru.guru-group.fi (Postfix) with ESMTP id EBF34100033\r
+       for <notmuch@notmuchmail.org>; Tue, 12 Nov 2013 20:58:24 +0200 (EET)\r
+From: Tomi Ollila <tomi.ollila@iki.fi>\r
+To: notmuch@notmuchmail.org\r
+Subject: Re: compactor adjustments\r
+In-Reply-To: <1384192538-15291-1-git-send-email-tomi.ollila@iki.fi>\r
+References: <1384192538-15291-1-git-send-email-tomi.ollila@iki.fi>\r
+User-Agent: Notmuch/0.16+119~g219c55f (http://notmuchmail.org) Emacs/24.3.1\r
+       (x86_64-unknown-linux-gnu)\r
+X-Face: HhBM'cA~<r"^Xv\KRN0P{vn'Y"Kd;zg_y3S[4)KSN~s?O\"QPoL\r
+       $[Xv_BD:i/F$WiEWax}R(MPS`^UaptOGD`*/=@\1lKoVa9tnrg0TW?"r7aRtgk[F\r
+       !)g;OY^,BjTbr)Np:%c_o'jj,Z\r
+Date: Tue, 12 Nov 2013 20:58:24 +0200\r
+Message-ID: <m2fvr1tpkf.fsf@guru.guru-group.fi>\r
+MIME-Version: 1.0\r
+Content-Type: text/plain\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.13\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+       <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <http://notmuchmail.org/mailman/options/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=unsubscribe>\r
+List-Archive: <http://notmuchmail.org/pipermail/notmuch>\r
+List-Post: <mailto:notmuch@notmuchmail.org>\r
+List-Help: <mailto:notmuch-request@notmuchmail.org?subject=help>\r
+List-Subscribe: <http://notmuchmail.org/mailman/listinfo/notmuch>,\r
+       <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Tue, 12 Nov 2013 18:58:40 -0000\r
+\r
+On Mon, Nov 11 2013, Tomi Ollila <tomi.ollila@iki.fi> wrote:\r
+\r
+> Hi\r
+>\r
+> I think these changes would be good to have in use before notmuch compact\r
+> is in wider usage.\r
+>\r
+> All tests pass. I plan to test all of these code paths manually tomorrow.\r
+> If anyone comes up with good plan how to add automatic tests I'll add\r
+> those too (I also think myself, haven't got any good ones yet).\r
+\r
+I made this change to the code:\r
+\r
+diff --git a/lib/database.cc b/lib/database.cc\r
+index 40272dc..ad7002b 100644\r
+--- a/lib/database.cc\r
++++ b/lib/database.cc\r
+@@ -933,2 +933,2 @@ notmuch_database_compact (const char* path,\r
+-    } catch (Xapian::InvalidArgumentError e) {\r
+-       fprintf (stderr, "Error while compacting: %s\n", e.get_msg().c_str());\r
++    } catch (Xapian::Error &error) {\r
++       fprintf (stderr, "Error while compacting: %s\n", error.get_msg().c_str());\r
+\r
+Now it is consistent with other code and also doesn't crash on other errors\r
+\r
+I did the following tests:\r
+\r
+\r
+$ pwd\r
+/path/to/.notmuch\r
+\r
+\r
+$ mkdir xapian.old\r
+$ notmuch compact\r
+Compacting database...\r
+Backup path already exists: /path/to/.notmuch/xapian.old\r
+Compaction failed: Something went wrong trying to read or write a file\r
+zsh: exit 1     ./notmuch compact\r
+\r
+\r
+$ : tried to make compact fail by doing:\r
+$ : mkdir xapian.compact / touch xapian.compact + chmod 000 xapian.compact\r
+$ : notmuch compact worked OK after the above.\r
+\r
+\r
+$ chmod 555 .\r
+$ notmuch compact\r
+Compacting database...\r
+Error while compacting: /path/to/.notmuch/xapian.compact:\r
+cannot create directory\r
+Compaction failed: A Xapian exception occurred\r
+zsh: exit 1     ./notmuch compact\r
+\r
+\r
+$ chmod 755 .\r
+$ notmuch compact --backup=/tmp/exdev\r
+Compacting database...\r
+...\r
+...\r
+...\r
+Error moving old database out of the way:\r
+Old database: /path/to/.notmuch/xapian\r
+Backup database: /tmp/exdev\r
+Error: Invalid cross-device link\r
+Compaction failed: Something went wrong trying to read or write a file\r
+zsh: exit 1     ./notmuch compact --backup=/tmp/exdev\r
+\r
+\r
+$ : here I tried all I could think of (that doesn't include modifying\r
+$ : permissions on the fly (perhaps in lib/database.cc code!), but\r
+$ : could not get  if (rename(compact_xapian_path, xapian_path)) {\r
+$ : fail. i.e. it is possible although highly unlikely (which is good). \r
+\r
+\r
+$ chmod 555 xapian\r
+Compacting database...\r
+...\r
+...\r
+...\r
+Error removing backup database: Permission denied\r
+\r
+Please remove the backup database with\r
+\r
+   rm -rf '/path/to/.notmuch/xapian.old'\r
+\r
+Compaction failed: Something went wrong trying to read or write a file\r
+zsh: exit 1     ./notmuch compact\r
+\r
+\r
+$ chmod 755 xapian\r
+$ notmuch compact --backup=xapian.backup\r
+Compacting database...\r
+...\r
+...\r
+...\r
+The old database has been moved to xapian.backup.\r
+Done.\r
+$ ls xapian.backup\r
+flintlock       postlist.baseB  record.baseB    termlist.baseB\r
+iamchert        postlist.DB     record.DB       termlist.DB\r
+postlist.baseA  record.baseA    termlist.baseA\r
+\r
+\r
+---\r
+\r
+Unless there are other comments I'll make new patch series where\r
+ } catch (Xapian::Error &error) { and submit it for inclusion to 0.17.\r
+we'd better have somewhat decent 'notmuch compact' from day one.\r
+\r
+\r
+Tomi\r