unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH] lib: Simplify close and codify aborting atomic section
@ 2014-09-22 15:43 Austin Clements
  2014-09-22 16:59 ` W. Trevor King
  2014-09-24 21:20 ` [PATCH v2] " Austin Clements
  0 siblings, 2 replies; 20+ messages in thread
From: Austin Clements @ 2014-09-22 15:43 UTC (permalink / raw)
  To: notmuch

In Xapian, closing a database implicitly aborts any outstanding
transaction and commits changes.  For historical reasons,
notmuch_database_close had grown to almost, but not quite duplicate
this behavior.  Before closing the database, it would explicitly (and
unnecessarily) commit it.  However, if there was an outstanding
transaction (ie atomic section), commit would throw a Xapian
exception, which notmuch_database_close would unnecessarily print to
stderr, even though notmuch_database_close would ultimately abort the
transaction anyway when it called close.

This patch simplifies notmuch_database_close to just call
Database::close.  This works for both read-only and read/write
databases, takes care of committing changes, unifies the exception
handling path, and codifies aborting outstanding transactions.  This
is currently the only way to abort an atomic section (and may remain
so, since it would be difficult to roll back things we may have cached
from rolled-back modifications).
---
 lib/database.cc | 23 +++++++----------------
 lib/notmuch.h   |  5 +++++
 2 files changed, 12 insertions(+), 16 deletions(-)

diff --git a/lib/database.cc b/lib/database.cc
index a3a7cd3..1f7ff2a 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -903,28 +903,19 @@ notmuch_database_close (notmuch_database_t *notmuch)
 {
     notmuch_status_t status = NOTMUCH_STATUS_SUCCESS;
 
-    try {
-	if (notmuch->xapian_db != NULL &&
-	    notmuch->mode == NOTMUCH_DATABASE_MODE_READ_WRITE)
-	    (static_cast <Xapian::WritableDatabase *> (notmuch->xapian_db))->flush ();
-    } catch (const Xapian::Error &error) {
-	status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
-	if (! notmuch->exception_reported) {
-	    fprintf (stderr, "Error: A Xapian exception occurred flushing database: %s\n",
-		     error.get_msg().c_str());
-	}
-    }
-
     /* Many Xapian objects (and thus notmuch objects) hold references to
      * the database, so merely deleting the database may not suffice to
-     * close it.  Thus, we explicitly close it here. */
+     * close it.  Thus, we explicitly close it here.  This will
+     * implicitly abort any outstanding transaction and commit changes. */
     if (notmuch->xapian_db != NULL) {
 	try {
 	    notmuch->xapian_db->close();
 	} catch (const Xapian::Error &error) {
-	    /* don't clobber previous error status */
-	    if (status == NOTMUCH_STATUS_SUCCESS)
-		status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	    status = NOTMUCH_STATUS_XAPIAN_EXCEPTION;
+	    if (! notmuch->exception_reported) {
+		fprintf (stderr, "Error: A Xapian exception occurred closing database: %s\n",
+			 error.get_msg().c_str());
+	    }
 	}
     }
 
diff --git a/lib/notmuch.h b/lib/notmuch.h
index fe2340b..5c40c67 100644
--- a/lib/notmuch.h
+++ b/lib/notmuch.h
@@ -292,6 +292,11 @@ notmuch_database_open (const char *path,
  * notmuch_database_close can be called multiple times.  Later calls
  * have no effect.
  *
+ * If the caller is currently in an atomic section (there was a
+ * notmuch_database_begin_atomic without a matching
+ * notmuch_database_end_atomic), this will abort the atomic section,
+ * discarding any modifications made in the atomic section.
+ *
  * Return value:
  *
  * NOTMUCH_STATUS_SUCCESS: Successfully closed the database.
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2014-10-03  8:48 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-22 15:43 [PATCH] lib: Simplify close and codify aborting atomic section Austin Clements
2014-09-22 16:59 ` W. Trevor King
2014-09-22 18:50   ` Austin Clements
2014-09-22 19:00     ` W. Trevor King
2014-09-24 18:09       ` David Bremner
2014-09-24 18:18         ` W. Trevor King
2014-09-24 19:25           ` David Bremner
2014-09-24 19:44             ` W. Trevor King
2014-09-24 20:13               ` David Bremner
2014-09-24 20:29                 ` W. Trevor King
2014-09-24 21:20 ` [PATCH v2] " Austin Clements
2014-09-24 21:28   ` W. Trevor King
2014-09-24 21:32     ` [PATCH v3] " Austin Clements
2014-09-24 21:39       ` W. Trevor King
2014-10-02 19:18         ` Austin Clements
2014-10-02 19:19           ` [PATCH v4] " Austin Clements
2014-10-02 19:41             ` W. Trevor King
2014-10-02 20:39               ` Austin Clements
2014-10-02 20:48                 ` W. Trevor King
2014-10-03  8:48             ` David Bremner

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).