Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 0B026431FD0 for ; Sat, 11 Jun 2011 13:06:27 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: -0.7 X-Spam-Level: X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id GTgG32r8oQ3P for ; Sat, 11 Jun 2011 13:06:26 -0700 (PDT) Received: from dmz-mailsec-scanner-2.mit.edu (DMZ-MAILSEC-SCANNER-2.MIT.EDU [18.9.25.13]) by olra.theworths.org (Postfix) with ESMTP id 4D1BD431FB6 for ; Sat, 11 Jun 2011 13:06:26 -0700 (PDT) X-AuditID: 1209190d-b7bdeae0000004f8-c0-4df3ca7bb595 Received: from mailhub-auth-3.mit.edu ( [18.9.21.43]) by dmz-mailsec-scanner-2.mit.edu (Symantec Messaging Gateway) with SMTP id C6.C5.01272.B7AC3FD4; Sat, 11 Jun 2011 16:05:15 -0400 (EDT) Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) by mailhub-auth-3.mit.edu (8.13.8/8.9.2) with ESMTP id p5BK6P0X013127; Sat, 11 Jun 2011 16:06:25 -0400 Received: from drake.mit.edu (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com [209.6.116.242]) (authenticated bits=0) (User authenticated as amdragon@ATHENA.MIT.EDU) by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id p5BK6OG7005976 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); Sat, 11 Jun 2011 16:06:25 -0400 (EDT) Received: from amthrax by drake.mit.edu with local (Exim 4.76) (envelope-from ) id 1QVURs-0000IB-Id; Sat, 11 Jun 2011 16:06:24 -0400 From: Austin Clements To: notmuch@notmuchmail.org Subject: [PATCH 08/17] lib: Add support for nested atomic sections. Date: Sat, 11 Jun 2011 16:04:34 -0400 Message-Id: <1307822683-848-9-git-send-email-amdragon@mit.edu> X-Mailer: git-send-email 1.7.5.1 In-Reply-To: <1307822683-848-1-git-send-email-amdragon@mit.edu> References: <87ei34rnc5.fsf@yoom.home.cworth.org> <1307822683-848-1-git-send-email-amdragon@mit.edu> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrLIsWRmVeSWpSXmKPExsUixCmqrVt96rOvwbfF5hbXb85kdmD0eLbq FnMAYxSXTUpqTmZZapG+XQJXxtsWy4L5GhXfNn9la2D8p9DFyMkhIWAi8WfbK1YIW0ziwr31 bF2MXBxCAvsYJQ7/OcsM4WxglHjzaStYlZDAfSaJ/os5EIn5jBL3j7xnB0mwCWhIbNu/nBHE FhGQlth5dzZQAwcHs4CaxJ8uFZCwsICzxNRvB8FKWARUJU6dmMsGYvMK2EncvjCLDeIKBYkr V+axgNicAvYS8w5eZYHYmyax5NZu9gmM/AsYGVYxyqbkVunmJmbmFKcm6xYnJ+blpRbpGunl ZpbopaaUbmIEh4wk7w7GdweVDjEKcDAq8fCqrP3sK8SaWFZcmXuIUZKDSUmUV+cEUIgvKT+l MiOxOCO+qDQntfgQowQHs5II7/r2T75CvCmJlVWpRfkwKWkOFiVx3pmS6r5CAumJJanZqakF qUUwWRkODiUJ3s0ngYYKFqWmp1akZeaUIKSZODhBhvMADT8KUsNbXJCYW5yZDpE/xajL8XjD pkOMQix5+XmpUuK890GKBECKMkrz4ObAYv0VozjQW8K8P0CqeIBpAm7SK6AlTEBLBErBlpQk IqSkGhjZp144NmFj+BVHjjmn+ZRaRC1K5vqxzc74eyxy/fQtJcyVzsz5jC6XJufHKgRcmLOz 9eEPjg5t22NCnxZqWx6f/eS0qN47Y0bFJGbFlvJjIbvO7PW3uP9B/tLc+zNUnIJyvn0PrU9a 3sS4ubzz15Ie6yf/svKN3SKUs+slc1M2ZfROu5JZPFeJpTgj0VCLuag4EQAGniNb0AIAAA== Cc: Austin Clements X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 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: Sat, 11 Jun 2011 20:06:27 -0000 notmuch_database_t now keeps a nesting count and we only start a transaction or commit for the outermost atomic section. Introduces a new error, NOTMUCH_STATUS_UNBALANCED_ATOMIC. --- lib/database-private.h | 1 + lib/database.cc | 22 ++++++++++++++++++---- lib/notmuch.h | 10 ++++++++++ notmuch-new.c | 1 + 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/lib/database-private.h b/lib/database-private.h index f705009..88532d5 100644 --- a/lib/database-private.h +++ b/lib/database-private.h @@ -43,6 +43,7 @@ struct _notmuch_database { notmuch_bool_t needs_upgrade; notmuch_database_mode_t mode; + int atomic_nesting; Xapian::Database *xapian_db; unsigned int last_doc_id; diff --git a/lib/database.cc b/lib/database.cc index ddb6167..b766e94 100644 --- a/lib/database.cc +++ b/lib/database.cc @@ -273,6 +273,8 @@ notmuch_status_to_string (notmuch_status_t status) return "Tag value is too long (exceeds NOTMUCH_TAG_MAX)"; case NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW: return "Unbalanced number of calls to notmuch_message_freeze/thaw"; + case NOTMUCH_STATUS_UNBALANCED_ATOMIC: + return "Unbalanced number of calls to notmuch_database_begin_atomic/end_atomic"; default: case NOTMUCH_STATUS_LAST_STATUS: return "Unknown error status value"; @@ -611,6 +613,7 @@ notmuch_database_open (const char *path, notmuch->needs_upgrade = FALSE; notmuch->mode = mode; + notmuch->atomic_nesting = 0; try { string last_thread_id; @@ -977,8 +980,9 @@ notmuch_database_upgrade (notmuch_database_t *notmuch, notmuch_status_t notmuch_database_begin_atomic (notmuch_database_t *notmuch) { - if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) - return NOTMUCH_STATUS_SUCCESS; + if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY || + notmuch->atomic_nesting > 0) + goto DONE; try { (static_cast (notmuch->xapian_db))->begin_transaction (false); @@ -988,6 +992,9 @@ notmuch_database_begin_atomic (notmuch_database_t *notmuch) notmuch->exception_reported = TRUE; return NOTMUCH_STATUS_XAPIAN_EXCEPTION; } + +DONE: + notmuch->atomic_nesting++; return NOTMUCH_STATUS_SUCCESS; } @@ -996,8 +1003,12 @@ notmuch_database_end_atomic (notmuch_database_t *notmuch) { Xapian::WritableDatabase *db; - if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY) - return NOTMUCH_STATUS_SUCCESS; + if (notmuch->atomic_nesting == 0) + return NOTMUCH_STATUS_UNBALANCED_ATOMIC; + + if (notmuch->mode == NOTMUCH_DATABASE_MODE_READ_ONLY || + notmuch->atomic_nesting > 1) + goto DONE; db = static_cast (notmuch->xapian_db); try { @@ -1015,6 +1026,9 @@ notmuch_database_end_atomic (notmuch_database_t *notmuch) notmuch->exception_reported = TRUE; return NOTMUCH_STATUS_XAPIAN_EXCEPTION; } + +DONE: + notmuch->atomic_nesting--; return NOTMUCH_STATUS_SUCCESS; } diff --git a/lib/notmuch.h b/lib/notmuch.h index 208d22c..830aa41 100644 --- a/lib/notmuch.h +++ b/lib/notmuch.h @@ -81,6 +81,9 @@ typedef int notmuch_bool_t; * NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW: The notmuch_message_thaw * function has been called more times than notmuch_message_freeze. * + * NOTMUCH_STATUS_UNBALANCED_ATOMIC: notmuch_database_end_atomic has + * been called more times than notmuch_database_begin_atomic. + * * And finally: * * NOTMUCH_STATUS_LAST_STATUS: Not an actual status value. Just a way @@ -97,6 +100,7 @@ typedef enum _notmuch_status { NOTMUCH_STATUS_NULL_POINTER, NOTMUCH_STATUS_TAG_TOO_LONG, NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW, + NOTMUCH_STATUS_UNBALANCED_ATOMIC, NOTMUCH_STATUS_LAST_STATUS } notmuch_status_t; @@ -222,6 +226,9 @@ notmuch_database_upgrade (notmuch_database_t *database, * only ensures atomicity, not durability; neither begin nor end * necessarily flush modifications to disk. * + * Atomic sections may be nested. begin_atomic and end_atomic must + * always be called in pairs. + * * Return value: * * NOTMUCH_STATUS_SUCCESS: Successfully entered atomic section. @@ -240,6 +247,9 @@ notmuch_database_begin_atomic (notmuch_database_t *notmuch); * * NOTMUCH_STATUS_XAPIAN_EXCEPTION: A Xapian exception occurred; * atomic section not ended. + * + * NOTMUCH_STATUS_UNBALANCED_ATOMIC: The database is not currently in + * an atomic section. */ notmuch_status_t notmuch_database_end_atomic (notmuch_database_t *notmuch); diff --git a/notmuch-new.c b/notmuch-new.c index b76b608..d1bea55 100644 --- a/notmuch-new.c +++ b/notmuch-new.c @@ -466,6 +466,7 @@ add_files_recursive (notmuch_database_t *notmuch, case NOTMUCH_STATUS_NULL_POINTER: case NOTMUCH_STATUS_TAG_TOO_LONG: case NOTMUCH_STATUS_UNBALANCED_FREEZE_THAW: + case NOTMUCH_STATUS_UNBALANCED_ATOMIC: case NOTMUCH_STATUS_LAST_STATUS: INTERNAL_ERROR ("add_message returned unexpected value: %d", status); goto DONE; -- 1.7.5.1