[PATCH v2] Use the Xapian::DB_RETRY_LOCK flag when available
authorIstvan Marko <notmuch@kismala.com>
Tue, 3 May 2016 19:12:57 +0000 (12:12 +1700)
committerW. Trevor King <wking@tremily.us>
Sat, 20 Aug 2016 23:21:45 +0000 (16:21 -0700)
cc/0bf04abb795887d8cffcf4de1a8821f8f1cd3c [new file with mode: 0644]

diff --git a/cc/0bf04abb795887d8cffcf4de1a8821f8f1cd3c b/cc/0bf04abb795887d8cffcf4de1a8821f8f1cd3c
new file mode 100644 (file)
index 0000000..74a775d
--- /dev/null
@@ -0,0 +1,149 @@
+Return-Path: <notmuch@kismala.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 arlo.cworth.org (Postfix) with ESMTP id D96FD6DE01F7\r
+ for <notmuch@notmuchmail.org>; Tue,  3 May 2016 12:13:06 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at cworth.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: 0.103\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=0.103 tagged_above=-999 required=5 tests=[AWL=0.103]\r
+ autolearn=disabled\r
+Received: from arlo.cworth.org ([127.0.0.1])\r
+ by localhost (arlo.cworth.org [127.0.0.1]) (amavisd-new, port 10024)\r
+ with ESMTP id uAvVGx1RDjgi for <notmuch@notmuchmail.org>;\r
+ Tue,  3 May 2016 12:12:58 -0700 (PDT)\r
+Received: from imarko.xen.prgmr.com (imarko.xen.prgmr.com [71.19.158.228])\r
+ by arlo.cworth.org (Postfix) with ESMTP id BEA246DE00DF\r
+ for <notmuch@notmuchmail.org>; Tue,  3 May 2016 12:12:58 -0700 (PDT)\r
+Received: from localhost ([127.0.0.1] helo=zsu.kismala.com)\r
+ by imarko.xen.prgmr.com with esmtp (Exim 4.85)\r
+ (envelope-from <notmuch@kismala.com>)\r
+ id 1axfkf-0002jF-Al; Tue, 03 May 2016 12:12:57 -0700\r
+From: Istvan Marko <notmuch@kismala.com>\r
+To: Jani Nikula <jani@nikula.org>, notmuch@notmuchmail.org\r
+Subject: [PATCH v2] Use the Xapian::DB_RETRY_LOCK flag when available\r
+In-Reply-To: <87k2jbgl2b.fsf@nikula.org>\r
+References: <m38tzr2n6v.fsf@zsu.kismala.com> <87k2jbgl2b.fsf@nikula.org>\r
+User-Agent: Notmuch/0.21+69~gd27d908 (http://notmuchmail.org) Emacs/25.0.92.2\r
+ (x86_64-unknown-linux-gnu)\r
+Date: Tue, 03 May 2016 12:12:57 -0700\r
+Message-ID: <m3wpnb0xc6.fsf@zsu.kismala.com>\r
+MIME-Version: 1.0\r
+Content-Type: text/plain\r
+X-BeenThere: notmuch@notmuchmail.org\r
+X-Mailman-Version: 2.1.20\r
+Precedence: list\r
+List-Id: "Use and development of the notmuch mail system."\r
+ <notmuch.notmuchmail.org>\r
+List-Unsubscribe: <https://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: <https://notmuchmail.org/mailman/listinfo/notmuch>,\r
+ <mailto:notmuch-request@notmuchmail.org?subject=subscribe>\r
+X-List-Received-Date: Tue, 03 May 2016 19:13:07 -0000\r
+\r
+Xapian 1.3 has introduced the DB_RETRY_LOCK flag (Xapian bug\r
+275). Detect it in configure and use it if available. With this flag\r
+commands that need the write lock will wait for their turn instead of\r
+aborting when it's not immediately available.\r
+---\r
+\r
+Updated based on Jani's feedback.\r
+\r
+Regarding tests, I couldn't think of a meaningful test for this. We get\r
+different behaviors depending on the Xapian version and if we try do\r
+some kind of a concurrent locking test we'd really be just testing\r
+Xapian's locking code rather than notmuch.\r
+\r
+ configure       | 20 ++++++++++++++++++++\r
+ lib/database.cc |  8 +++++++-\r
+ 2 files changed, 27 insertions(+), 1 deletion(-)\r
+\r
+diff --git a/configure b/configure\r
+index 6231d2b..8ef96b4 100755\r
+--- a/configure\r
++++ b/configure\r
+@@ -371,6 +371,21 @@ if [ ${have_xapian} = "1" ]; then\r
+     esac\r
+ fi\r
\r
++# DB_RETRY_LOCK is only supported on Xapian > 1.3.2\r
++have_xapian_db_retry_lock=0\r
++if [ ${have_xapian} = "1" ]; then\r
++    printf "Checking for Xapian lock retry support... "\r
++    case "${xapian_version}" in\r
++      0.*|1.[012].*|1.3.[0-2])\r
++          printf "No (only available with Xapian > 1.3.2).\n" ;;\r
++      [1-9]*.[0-9]*.[0-9]*)\r
++          have_xapian_db_retry_lock=1\r
++          printf "Yes.\n" ;;\r
++      *)\r
++          printf "Unknown version.\n" ;;\r
++    esac\r
++fi\r
++\r
+ default_xapian_backend=""\r
+ if [ ${have_xapian} = "1" ]; then\r
+     printf "Testing default Xapian backend... "\r
+@@ -998,6 +1013,9 @@ HAVE_D_TYPE = ${have_d_type}\r
+ # Whether the Xapian version in use supports compaction\r
+ HAVE_XAPIAN_COMPACT = ${have_xapian_compact}\r
\r
++# Whether the Xapian version in use supports DB_RETRY_LOCK\r
++HAVE_XAPIAN_DB_RETRY_LOCK = ${have_xapian_db_retry_lock}\r
++\r
+ # Whether the getpwuid_r function is standards-compliant\r
+ # (if not, then notmuch will #define _POSIX_PTHREAD_SEMANTICS\r
+ # to enable the standards-compliant version -- needed for Solaris)\r
+@@ -1072,6 +1090,7 @@ CONFIGURE_CFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)      \\\r
+                  -DSTD_GETPWUID=\$(STD_GETPWUID)                       \\\r
+                  -DSTD_ASCTIME=\$(STD_ASCTIME)                         \\\r
+                  -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)         \\\r
++                 -DHAVE_XAPIAN_DB_RETRY_LOCK=\$(HAVE_XAPIAN_DB_RETRY_LOCK) \\\r
+                  -DUTIL_BYTE_ORDER=\$(UTIL_BYTE_ORDER)\r
\r
+ CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)    \\\r
+@@ -1086,6 +1105,7 @@ CONFIGURE_CXXFLAGS = -DHAVE_GETLINE=\$(HAVE_GETLINE) \$(GMIME_CFLAGS)    \\\r
+                    -DSTD_GETPWUID=\$(STD_GETPWUID)                     \\\r
+                    -DSTD_ASCTIME=\$(STD_ASCTIME)                       \\\r
+                    -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)       \\\r
++                     -DHAVE_XAPIAN_DB_RETRY_LOCK=\$(HAVE_XAPIAN_DB_RETRY_LOCK) \\\r
+                    -DUTIL_BYTE_ORDER=\$(UTIL_BYTE_ORDER)\r
\r
+ CONFIGURE_LDFLAGS =  \$(GMIME_LDFLAGS) \$(TALLOC_LDFLAGS) \$(ZLIB_LDFLAGS) \$(XAPIAN_LDFLAGS)\r
+diff --git a/lib/database.cc b/lib/database.cc\r
+index c8c5e26..c0fcb29 100644\r
+--- a/lib/database.cc\r
++++ b/lib/database.cc\r
+@@ -48,6 +48,12 @@ typedef struct {\r
+ #define STRINGIFY(s) _SUB_STRINGIFY(s)\r
+ #define _SUB_STRINGIFY(s) #s\r
\r
++#if HAVE_XAPIAN_DB_RETRY_LOCK\r
++#define DB_ACTION (Xapian::DB_CREATE_OR_OPEN | Xapian::DB_RETRY_LOCK)\r
++#else\r
++#define DB_ACTION Xapian::DB_CREATE_OR_OPEN\r
++#endif\r
++\r
+ /* Here's the current schema for our database (for NOTMUCH_DATABASE_VERSION):\r
+  *\r
+  * We currently have three different types of documents (mail, ghost,\r
+@@ -930,7 +936,7 @@ notmuch_database_open_verbose (const char *path,\r
\r
+       if (mode == NOTMUCH_DATABASE_MODE_READ_WRITE) {\r
+           notmuch->xapian_db = new Xapian::WritableDatabase (xapian_path,\r
+-                                                             Xapian::DB_CREATE_OR_OPEN);\r
++                                                             DB_ACTION);\r
+       } else {\r
+           notmuch->xapian_db = new Xapian::Database (xapian_path);\r
+       }\r
+-- \r
+2.4.10\r
+\r
+\r
+-- \r
+       Istvan\r