Re: DatabaseModifiedErrors causing troubles
authorGaute Hope <eg@gaute.vetsj.com>
Thu, 21 Aug 2014 08:59:11 +0000 (10:59 +0200)
committerW. Trevor King <wking@tremily.us>
Fri, 7 Nov 2014 18:04:15 +0000 (10:04 -0800)
eb/f8375f7ac6b88451429e2f7ef0d83d632e4296 [new file with mode: 0644]

diff --git a/eb/f8375f7ac6b88451429e2f7ef0d83d632e4296 b/eb/f8375f7ac6b88451429e2f7ef0d83d632e4296
new file mode 100644 (file)
index 0000000..4874c9a
--- /dev/null
@@ -0,0 +1,164 @@
+Return-Path: <eg@gaute.vetsj.com>\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 D4EA4431FB6\r
+       for <notmuch@notmuchmail.org>; Thu, 21 Aug 2014 01:58:59 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at olra.theworths.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.7\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5\r
+       tests=[RCVD_IN_DNSWL_LOW=-0.7] 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 u74j+oLJijAa for <notmuch@notmuchmail.org>;\r
+       Thu, 21 Aug 2014 01:58:50 -0700 (PDT)\r
+Received: from mail-la0-f42.google.com (mail-la0-f42.google.com\r
+       [209.85.215.42]) (using TLSv1 with cipher RC4-SHA (128/128 bits))\r
+       (No client certificate requested)\r
+       by olra.theworths.org (Postfix) with ESMTPS id 4CE73431FAF\r
+       for <notmuch@notmuchmail.org>; Thu, 21 Aug 2014 01:58:50 -0700 (PDT)\r
+Received: by mail-la0-f42.google.com with SMTP id pv20so8377135lab.29\r
+       for <notmuch@notmuchmail.org>; Thu, 21 Aug 2014 01:58:47 -0700 (PDT)\r
+X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\r
+       d=1e100.net; s=20130820;\r
+       h=x-gm-message-state:date:from:subject:to:references:in-reply-to\r
+       :user-agent:message-id:mime-version:content-type\r
+       :content-transfer-encoding;\r
+       bh=FxjRwAOO9beMJyXC9fBjjP4FY/NPHbGPl/peq+7npwE=;\r
+       b=S3X240f/Yq3GDLrLFQyT+RHQ4FJsImxGKnIFgio9v0Fd9AQOWeQiDIiJ5Kox5hRDj/\r
+       tB8eprKSYm4Vh1SMr47e7VoKXTXrMqIp5UUDR+bkxUEGmzTKPkKrixjSM8jbIn0esB8u\r
+       HhJ9A2rNtIdPDZNixYpAGXOnzxI9C+thqUdyW71pBxDMrEmY6L6qXt+jDtfMS1l3Iyfw\r
+       DxFFybvl+dXEhhcXUan1JpmQrqUsyEkHYkHxIKVtaTMAKdZ45KfqZQF3uv0vpDH8dK9E\r
+       +9vbnvRSkPWWo8DqbHncei2Ntp5bgoaZZEerxX7sjwppFOwjGAmcNHHuQetqJKScjdf+\r
+       GEvA==\r
+X-Gm-Message-State:\r
+ ALoCoQn6Ew1NUatZ9EOFm1SXqYGsSs/5sutLGt/7T1qRGTTTLn/VuLhJ5FMsQWvs5+Me6xX8CpjE\r
+X-Received: by 10.112.138.102 with SMTP id qp6mr44401999lbb.60.1408611527400; \r
+       Thu, 21 Aug 2014 01:58:47 -0700 (PDT)\r
+Received: from localhost (cD572BF51.dhcp.as2116.net. [81.191.114.213])\r
+       by mx.google.com with ESMTPSA id y8sm666676lad.30.2014.08.21.01.58.45\r
+       for <notmuch@notmuchmail.org>\r
+       (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\r
+       Thu, 21 Aug 2014 01:58:46 -0700 (PDT)\r
+Date: Thu, 21 Aug 2014 10:59:11 +0200\r
+From: Gaute Hope <eg@gaute.vetsj.com>\r
+Subject: Re: DatabaseModifiedErrors causing troubles\r
+To: notmuch@notmuchmail.org\r
+References:\r
+ <CABKe4MvEdcsq8BZ-vq6R0Vnw87zEgBvqW_2F-Wysf5GNchqweg@mail.gmail.com>\r
+In-Reply-To:\r
+ <CABKe4MvEdcsq8BZ-vq6R0Vnw87zEgBvqW_2F-Wysf5GNchqweg@mail.gmail.com>\r
+User-Agent: astroid/v3f318711 (https://github.com/gauteh/astroid)\r
+Message-Id: <1408610770-astroid-0-4on2jlyj8n-28086@strange>\r
+MIME-Version: 1.0\r
+Content-Type: text/plain; charset=utf-8; format=flowed\r
+Content-Transfer-Encoding: quoted-printable\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: Thu, 21 Aug 2014 08:59:00 -0000\r
+\r
+Gaute Hope <eg@gaute.vetsj.com> wrote on Mon, 11 Aug 2014 14:17:54 +0200:\r
+> Hi,\r
+>\r
+> I've been working on an application that keeps a read-only handle on\r
+> the notmuch database open for a long time. In some cases when a new\r
+> message is added along with some renames of other messages using\r
+> 'notmuch new' while the application is running I get an Xapian\r
+> exception: DatabaseModifiedError:\r
+>\r
+>   A Xapian exception occurred performing query: The revision being\r
+> read has been discarded - you\r
+>   should call Xapian::Database::reopen() and retry the operation.\r
+>\r
+> Which seems to be printed from: notmuch_query_search_threads ->\r
+> notmuch_query_search_messages:294.\r
+>\r
+> I have not been able to make a smaller test case at the moment (this\r
+> happens with offlineimap updating an maildir and notmuch new run\r
+> afterwards + some tagging).\r
+>\r
+> I can work around this by checking for a NULL pointer returned from\r
+> notmuch_query_search_threads () and re-open the database\r
+> (notmuch_database_close () -> notmuch_database_open ()). But I have no\r
+> way of knowing programatically if this really is the error that has\r
+> happened. There should be some way of propagating the error\r
+> information or (even better for my case; for notmuch to reopen the\r
+> database), one option is the Gmime way of passing an pointer to an\r
+> error structure that is filled up by the notmuch interface function.\r
+\r
+Hi again,\r
+\r
+I have not yet been able to create a test for this with a fresh db (I\r
+must be missing out on some of the parts triggering this).\r
+\r
+I need to keep a query open for a while (because running it takes a\r
+while), and this keeps coming back and biting me. I currently do a test\r
+every time I need to access the query further (load more threads..). The\r
+test is as follows, which is the easiest and quickest test I've found to\r
+work reliably:\r
+\r
+\r
+    /* tries to provoke an Xapian::DatabaseModifiedError\r
+     *\r
+     * returns true if db is invalid. queries will be invalid\r
+     * afterwards, but might still respond true to notmuch_valid\r
+     * calls.\r
+     *\r
+     */\r
+\r
+    time_t start =3D clock ();\r
+    bool invalid =3D false;\r
+\r
+    /* testing */\r
+    notmuch_query_t * q =3D notmuch_query_create (nm_db, "thread:fail");\r
+\r
+    /* this will produce an error, but no way to ensure failure */\r
+    notmuch_query_count_threads (q);\r
+\r
+    /* this returns NULL when error */\r
+    notmuch_threads_t * threads =3D notmuch_query_search_threads (q);\r
+\r
+    if (threads =3D=3D NULL) invalid =3D true;\r
+\r
+    notmuch_query_destroy (q);\r
+\r
+    float diff =3D (clock () - start) * 1000.0 / CLOCKS_PER_SEC;\r
+    cout << "db: test query time: " << diff << " ms." << endl;\r
+\r
+    if (invalid) {\r
+      cout << "db: no longer valid, reopen required." << endl;\r
+    } else {\r
+      cout << "db: valid." << endl;\r
+    }\r
+\r
+As mentioned before, I am basically guessing that the reason I get\r
+threads =3D=3D NULL is the DatabaseModifiedError. There is no way to know\r
+for sure.\r
+\r
+For portability I would suggest starting to move towards the GError\r
+scheme provided by glib (also used by gmime). This is a somewhat major\r
+effort though since ensuring that error propagation is done right [0] is\r
+somewhat tricky. It provides more or less the same functionality as\r
+exceptions do in C++.\r
+\r
+There is also the problem of having to change the API - one way to avoid\r
+that is to create wrappers that behave like the old API, but don't\r
+handle errors that good. This requires the addition of addiontal _error\r
+variations of the current set of functions. It will be a mess.\r
+\r
+Cheers, Gaute\r
+\r
+[0] https://developer.gnome.org/glib/stable/glib-Error-Reporting.html\r
+=\r