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