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 16:34:12 +0000 (17:34 +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 be848ac8baca93903076bcfc888b4b19150a1bd0..066793ee2154f57728d3a4589c6eab5476de7e49 100644 (file)
@@ -136,6 +136,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 b06bf9084dab4016a90b93f43be50919d84212cd..65528e5720390f3cbe8fe181ca1e357f54e4bb1f 100644 (file)
@@ -1282,6 +1282,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()))