[SCM] Samba Shared Repository - branch v3-4-test updated - release-4-0-0alpha7-1213-g5d1e254

Karolin Seeger kseeger at samba.org
Fri Aug 14 02:16:11 MDT 2009


The branch, v3-4-test has been updated
       via  5d1e254188373de838cfe046118267701ee6cd5a (commit)
       via  f1cf84c9b9abc48a58355400acb63fd79e1d60c4 (commit)
      from  b1dd075c6819a3fb0f00bdb93104c307505ec8ba (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-4-test


- Log -----------------------------------------------------------------
commit 5d1e254188373de838cfe046118267701ee6cd5a
Author: Rusty Russell <rusty at rustcorp.com.au>
Date:   Thu Jul 30 11:52:08 2009 +0930

    tdb: Reimplementation of Metze's "lib/tdb: if we know pwrite and pread are thread/fork safe tdb_reopen_all() should be a noop".
    
    This version just wraps the reopen code, so we still re-grab the lock and do
    the normal sanity checks.
    
    The reason we do this at all is to avoid global fd limits, see:
    http://forums.fedoraforum.org/showthread.php?t=210393
    
    Note also that this whole reopen concept is fundamentally racy: if the parent
    goes away before the child calls tdb_reopen_all, the database can be left
    without an active lock and another TDB_CLEAR_IF_FIRST opener will clear it.
    A fork_with_tdbs() wrapper could use a pipe to solve this, but it's hardly
    elegant (what if there are other independent things which have similar needs?).
    
    Signed-off-by: Rusty Russell <rusty at rustcorp.com.au>
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit 3b2f074bda8734a0b30a3e31117c0217d890809c)
    
    Addresses bug #6601.

commit f1cf84c9b9abc48a58355400acb63fd79e1d60c4
Author: Rusty Russell <rusty at rustcorp.com.au>
Date:   Thu Jul 30 11:51:28 2009 +0930

    tdb: Revert "lib/tdb: if we know pwrite and pread are thread/fork safe tdb_reopen_all() should be a noop"
    
    This reverts commit e17df483fbedb81aededdef5fbb6ae1d034bc2dd.
    
    tdb_reopen_all also restores the active lock, required for TDB_CLEAR_IF_FIRST.
    
    Signed-off-by: Stefan Metzmacher <metze at samba.org>
    (cherry picked from commit fa91bc67199f0d45a0e570b43aeafd816a5491bf)

-----------------------------------------------------------------------

Summary of changes:
 lib/tdb/common/open.c |   20 ++++++++++----------
 1 files changed, 10 insertions(+), 10 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/tdb/common/open.c b/lib/tdb/common/open.c
index e58c8ca..49b8e85 100644
--- a/lib/tdb/common/open.c
+++ b/lib/tdb/common/open.c
@@ -425,6 +425,9 @@ int tdb_reopen(struct tdb_context *tdb)
 		goto fail;
 	}
 
+/* If we have real pread & pwrite, we can skip reopen. */
+#if !defined(LIBREPLACE_PREAD_NOT_REPLACED) || \
+	!defined(LIBREPLACE_PWRITE_NOT_REPLACED)
 	if (tdb_munmap(tdb) != 0) {
 		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: munmap failed (%s)\n", strerror(errno)));
 		goto fail;
@@ -436,11 +439,6 @@ int tdb_reopen(struct tdb_context *tdb)
 		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: open failed (%s)\n", strerror(errno)));
 		goto fail;
 	}
-	if ((tdb->flags & TDB_CLEAR_IF_FIRST) && 
-	    (tdb->methods->tdb_brlock(tdb, ACTIVE_LOCK, F_RDLCK, F_SETLKW, 0, 1) == -1)) {
-		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: failed to obtain active lock\n"));
-		goto fail;
-	}
 	if (fstat(tdb->fd, &st) != 0) {
 		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: fstat failed (%s)\n", strerror(errno)));
 		goto fail;
@@ -450,6 +448,13 @@ int tdb_reopen(struct tdb_context *tdb)
 		goto fail;
 	}
 	tdb_mmap(tdb);
+#endif /* fake pread or pwrite */
+
+	if ((tdb->flags & TDB_CLEAR_IF_FIRST) &&
+	    (tdb->methods->tdb_brlock(tdb, ACTIVE_LOCK, F_RDLCK, F_SETLKW, 0, 1) == -1)) {
+		TDB_LOG((tdb, TDB_DEBUG_FATAL, "tdb_reopen: failed to obtain active lock\n"));
+		goto fail;
+	}
 
 	return 0;
 
@@ -461,10 +466,6 @@ fail:
 /* reopen all tdb's */
 int tdb_reopen_all(int parent_longlived)
 {
-#if defined(LIBREPLACE_PREAD_NOT_REPLACED) && \
-	defined(LIBREPLACE_PWRITE_NOT_REPLACED)
-	return 0;
-#else
 	struct tdb_context *tdb;
 
 	for (tdb=tdbs; tdb; tdb = tdb->next) {
@@ -487,7 +488,6 @@ int tdb_reopen_all(int parent_longlived)
 		if (tdb_reopen(tdb) != 0)
 			return -1;
 	}
-#endif
 
 	return 0;
 }


-- 
Samba Shared Repository


More information about the samba-cvs mailing list