compactor adjustments

Tomi Ollila tomi.ollila at iki.fi
Tue Nov 12 10:58:24 PST 2013


On Mon, Nov 11 2013, Tomi Ollila <tomi.ollila at iki.fi> wrote:

> Hi
>
> I think these changes would be good to have in use before notmuch compact
> is in wider usage.
>
> All tests pass. I plan to test all of these code paths manually tomorrow.
> If anyone comes up with good plan how to add automatic tests I'll add
> those too (I also think myself, haven't got any good ones yet).

I made this change to the code:

diff --git a/lib/database.cc b/lib/database.cc
index 40272dc..ad7002b 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -933,2 +933,2 @@ notmuch_database_compact (const char* path,
-    } catch (Xapian::InvalidArgumentError e) {
-       fprintf (stderr, "Error while compacting: %s\n", e.get_msg().c_str());
+    } catch (Xapian::Error &error) {
+       fprintf (stderr, "Error while compacting: %s\n", error.get_msg().c_str());

Now it is consistent with other code and also doesn't crash on other errors

I did the following tests:


$ pwd
/path/to/.notmuch


$ mkdir xapian.old
$ notmuch compact
Compacting database...
Backup path already exists: /path/to/.notmuch/xapian.old
Compaction failed: Something went wrong trying to read or write a file
zsh: exit 1     ./notmuch compact


$ : tried to make compact fail by doing:
$ : mkdir xapian.compact / touch xapian.compact + chmod 000 xapian.compact
$ : notmuch compact worked OK after the above.


$ chmod 555 .
$ notmuch compact
Compacting database...
Error while compacting: /path/to/.notmuch/xapian.compact:
cannot create directory
Compaction failed: A Xapian exception occurred
zsh: exit 1     ./notmuch compact


$ chmod 755 .
$ notmuch compact --backup=/tmp/exdev
Compacting database...
...
...
...
Error moving old database out of the way:
Old database: /path/to/.notmuch/xapian
Backup database: /tmp/exdev
Error: Invalid cross-device link
Compaction failed: Something went wrong trying to read or write a file
zsh: exit 1     ./notmuch compact --backup=/tmp/exdev


$ : here I tried all I could think of (that doesn't include modifying
$ : permissions on the fly (perhaps in lib/database.cc code!), but
$ : could not get  if (rename(compact_xapian_path, xapian_path)) {
$ : fail. i.e. it is possible although highly unlikely (which is good). 


$ chmod 555 xapian
Compacting database...
...
...
...
Error removing backup database: Permission denied

Please remove the backup database with

   rm -rf '/path/to/.notmuch/xapian.old'

Compaction failed: Something went wrong trying to read or write a file
zsh: exit 1     ./notmuch compact


$ chmod 755 xapian
$ notmuch compact --backup=xapian.backup
Compacting database...
...
...
...
The old database has been moved to xapian.backup.
Done.
$ ls xapian.backup
flintlock       postlist.baseB  record.baseB    termlist.baseB
iamchert        postlist.DB     record.DB       termlist.DB
postlist.baseA  record.baseA    termlist.baseA


---

Unless there are other comments I'll make new patch series where
 } catch (Xapian::Error &error) { and submit it for inclusion to 0.17.
we'd better have somewhat decent 'notmuch compact' from day one.


Tomi


More information about the notmuch mailing list