[PATCH 1/3] Use the Xapian::DB_RETRY_LOCK flag when available
authorDavid Bremner <david@tethera.net>
Sun, 26 Jun 2016 15:29:43 +0000 (17:29 +0200)
committerW. Trevor King <wking@tremily.us>
Sat, 20 Aug 2016 23:22:07 +0000 (16:22 -0700)
72/033582f32c1abe353a1aabcfe1e13655a729cc [new file with mode: 0644]

diff --git a/72/033582f32c1abe353a1aabcfe1e13655a729cc b/72/033582f32c1abe353a1aabcfe1e13655a729cc
new file mode 100644 (file)
index 0000000..d8f370d
--- /dev/null
@@ -0,0 +1,177 @@
+Return-Path: <bremner@tesseract.cs.unb.ca>\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 D26B16DE091F\r
+ for <notmuch@notmuchmail.org>; Sun, 26 Jun 2016 08:30:15 -0700 (PDT)\r
+X-Virus-Scanned: Debian amavisd-new at cworth.org\r
+X-Spam-Flag: NO\r
+X-Spam-Score: -0.005\r
+X-Spam-Level: \r
+X-Spam-Status: No, score=-0.005 tagged_above=-999 required=5\r
+ tests=[AWL=-0.006, HEADER_FROM_DIFFERENT_DOMAINS=0.001]\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 AexM4RKrpVXv for <notmuch@notmuchmail.org>;\r
+ Sun, 26 Jun 2016 08:30:06 -0700 (PDT)\r
+Received: from fethera.tethera.net (fethera.tethera.net [198.245.60.197])\r
+ by arlo.cworth.org (Postfix) with ESMTPS id 90D5A6DE01C2\r
+ for <notmuch@notmuchmail.org>; Sun, 26 Jun 2016 08:30:06 -0700 (PDT)\r
+Received: from remotemail by fethera.tethera.net with local (Exim 4.84)\r
+ (envelope-from <bremner@tesseract.cs.unb.ca>)\r
+ id 1bHC0K-00023H-9K; Sun, 26 Jun 2016 11:29:48 -0400\r
+Received: (nullmailer pid 26559 invoked by uid 1000);\r
+ Sun, 26 Jun 2016 15:29:48 -0000\r
+From: David Bremner <david@tethera.net>\r
+To: notmuch@notmuchmail.org\r
+Subject: [PATCH 1/3] Use the Xapian::DB_RETRY_LOCK flag when available\r
+Date: Sun, 26 Jun 2016 17:29:43 +0200\r
+Message-Id: <1466954985-25761-2-git-send-email-david@tethera.net>\r
+X-Mailer: git-send-email 2.8.1\r
+In-Reply-To: <1466954985-25761-1-git-send-email-david@tethera.net>\r
+References: <1466954985-25761-1-git-send-email-david@tethera.net>\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: Sun, 26 Jun 2016 15:30:16 -0000\r
+\r
+From: Istvan Marko <notmuch@kismala.com>\r
+\r
+Xapian 1.3 has introduced the DB_RETRY_LOCK flag (Xapian bug\r
+275). Detect it in configure and optionally use it. 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
+Amended by db: allow disabling in configure\r
+---\r
+ configure       | 35 +++++++++++++++++++++++++++++++++++\r
+ lib/database.cc |  8 +++++++-\r
+ 2 files changed, 42 insertions(+), 1 deletion(-)\r
+\r
+diff --git a/configure b/configure\r
+index 49fa5b9..ae0a027 100755\r
+--- a/configure\r
++++ b/configure\r
+@@ -72,6 +72,7 @@ WITH_EMACS=1\r
+ WITH_BASH=1\r
+ WITH_RUBY=1\r
+ WITH_ZSH=1\r
++WITH_RETRY_LOCK=1\r
\r
+ usage ()\r
+ {\r
+@@ -140,6 +141,7 @@ Some features can be disabled (--with-feature=no is equivalent to\r
+       --without-emacs                 Do not install lisp file\r
+       --without-ruby                  Do not install ruby bindings\r
+       --without-zsh-completion        Do not install zsh completions files\r
++      --without-retry-lock            Do not use blocking xapian opens, even if available\r
\r
+ Additional options are accepted for compatibility with other\r
+ configure-script calling conventions, but don't do anything yet:\r
+@@ -211,6 +213,14 @@ for option; do\r
+       fi\r
+     elif [ "${option}" = '--without-ruby' ] ; then\r
+       WITH_RUBY=0\r
++    elif [ "${option%%=*}" = '--with-retry-lock' ]; then\r
++      if [ "${option#*=}" = 'no' ]; then\r
++          WITH_RETRY_LOCK=0\r
++      else\r
++          WITH_RETRY_LOCK=1\r
++      fi\r
++    elif [ "${option}" = '--without-retry-lock' ] ; then\r
++      WITH_RETRY_LOCK=0\r
+     elif [ "${option%%=*}" = '--with-zsh-completion' ]; then\r
+       if [ "${option#*=}" = 'no' ]; then\r
+           WITH_ZSH=0\r
+@@ -392,6 +402,24 @@ EOF\r
+     rm -f _field_processor.o _field_processor.cc\r
\r
+     default_xapian_backend=""\r
++    # DB_RETRY_LOCK is only supported on Xapian > 1.3.2\r
++    have_xapian_db_retry_lock=0\r
++    if [ $WITH_RETRY_LOCK = "1" ]; then\r
++      printf "Checking for Xapian lock retry support... "\r
++      cat>_retry.cc<<EOF\r
++#include <xapian.h>\r
++int flag = Xapian::DB_RETRY_LOCK;\r
++EOF\r
++      if ${CXX} ${CXXFLAGS_for_sh} ${xapian_cxxflags} -c _retry.cc -o _retry.o > /dev/null 2>&1\r
++      then\r
++          have_xapian_db_retry_lock=1\r
++          printf "Yes.\n"\r
++      else\r
++          printf "No. (optional)\n"\r
++      fi\r
++      rm -f _retry.o _retry.cc\r
++    fi\r
++\r
+     printf "Testing default Xapian backend... "\r
+     cat >_default_backend.cc <<EOF\r
+ #include <xapian.h>\r
+@@ -1022,6 +1050,9 @@ HAVE_XAPIAN_COMPACT = ${have_xapian_compact}\r
+ # Whether the Xapian version in use supports field processors\r
+ HAVE_XAPIAN_FIELD_PROCESSOR = ${have_xapian_field_processor}\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
+@@ -1097,6 +1128,7 @@ COMMON_CONFIGURE_CFLAGS = \\\r
+       -DSTD_ASCTIME=\$(STD_ASCTIME)                           \\\r
+       -DHAVE_XAPIAN_COMPACT=\$(HAVE_XAPIAN_COMPACT)           \\\r
+       -DHAVE_XAPIAN_FIELD_PROCESSOR=\$(HAVE_XAPIAN_FIELD_PROCESSOR) \\\r
++      -DHAVE_XAPIAN_DB_RETRY_LOCK=\$(HAVE_XAPIAN_DB_RETRY_LOCK) \\\r
+       -DUTIL_BYTE_ORDER=\$(UTIL_BYTE_ORDER)\r
\r
+ CONFIGURE_CFLAGS = \$(COMMON_CONFIGURE_CFLAGS)\r
+@@ -1117,6 +1149,9 @@ NOTMUCH_HAVE_XAPIAN_COMPACT=${have_xapian_compact}\r
+ # Whether the Xapian version in use supports field processors\r
+ NOTMUCH_HAVE_XAPIAN_FIELD_PROCESSOR=${have_xapian_field_processor}\r
\r
++# Whether the Xapian version in use supports lock retry\r
++NOTMUCH_HAVE_XAPIAN_DB_RETRY_LOCK=${have_xapian_db_retry_lock}\r
++\r
+ # Which backend will Xapian use by default?\r
+ NOTMUCH_DEFAULT_XAPIAN_BACKEND=${default_xapian_backend}\r
\r
+diff --git a/lib/database.cc b/lib/database.cc\r
+index afafe88..66ee267 100644\r
+--- a/lib/database.cc\r
++++ b/lib/database.cc\r
+@@ -49,6 +49,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
+@@ -939,7 +945,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.8.1\r
+\r