s3: Make sure our CLEAR_IF_FIRST optimization works for messaging.tdb
authorVolker Lendecke <vl@samba.org>
Thu, 25 Mar 2010 14:59:41 +0000 (15:59 +0100)
committerVolker Lendecke <vl@samba.org>
Thu, 25 Mar 2010 15:40:44 +0000 (16:40 +0100)
In the child, we fully re-open messaging.tdb, which leads to one fcntl lock for
CLEAR_IF_FIRST detection per smbd. This opens the tdb in the parent and holds
it, so that tdb_reopen_all correctly catches the CLEAR_IF_FIRST bit.

source3/include/messages.h
source3/lib/messages_local.c
source3/smbd/server.c

index 6063d358ea7fe1469946b463342b01466116e182..865ffd48220586e2f8e4e223592ec84f81c2ed06 100644 (file)
@@ -111,6 +111,8 @@ NTSTATUS messaging_tdb_init(struct messaging_context *msg_ctx,
                            TALLOC_CTX *mem_ctx,
                            struct messaging_backend **presult);
 
+bool messaging_tdb_parent_init(void);
+
 NTSTATUS messaging_ctdbd_init(struct messaging_context *msg_ctx,
                              TALLOC_CTX *mem_ctx,
                              struct messaging_backend **presult);
index a58c7eb95f97e4e2f5865aa9ccd247278229fb5a..b1712823a127ea90c05bc784e93d2f799bd82f41 100644 (file)
@@ -133,6 +133,22 @@ NTSTATUS messaging_tdb_init(struct messaging_context *msg_ctx,
        return NT_STATUS_OK;
 }
 
+bool messaging_tdb_parent_init(void)
+{
+       struct tdb_wrap *db;
+
+       db = tdb_wrap_open(talloc_autofree_context(),
+                          lock_path("messages.tdb"), 0,
+                          TDB_CLEAR_IF_FIRST|TDB_DEFAULT|TDB_VOLATILE,
+                          O_RDWR|O_CREAT,0600);
+       if (db == NULL) {
+               DEBUG(1, ("could not open messaging.tdb: %s\n",
+                         strerror(errno)));
+               return false;
+       }
+       return true;
+}
+
 /*******************************************************************
  Form a static tdb key from a pid.
 ******************************************************************/
index 81d75b13a003ffa9185ba03ac865698eb20fe238..0a6d66c180542eb25b60267c4f2a4403b0afd058 100644 (file)
@@ -1296,6 +1296,10 @@ extern void build_options(bool screen);
        if (!locking_init())
                exit(1);
 
+       if (!messaging_tdb_parent_init()) {
+               exit(1);
+       }
+
        namecache_enable();
 
        if (!W_ERROR_IS_OK(registry_init_full()))