diff options
author | Volker Lendecke <vl@samba.org> | 2010-03-25 15:59:41 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2010-03-25 16:40:44 +0100 |
commit | 4cdbe07b2563b56c2d8b9a5733eedf25245ba86b (patch) | |
tree | 4d1bfeb88718fa894ff00ac02b17b2404548babd | |
parent | f20bdd32ddabf79800c876fa94b65b928bea3c30 (diff) | |
download | samba-4cdbe07b2563b56c2d8b9a5733eedf25245ba86b.tar.gz samba-4cdbe07b2563b56c2d8b9a5733eedf25245ba86b.tar.bz2 samba-4cdbe07b2563b56c2d8b9a5733eedf25245ba86b.zip |
s3: Make sure our CLEAR_IF_FIRST optimization works for messaging.tdb
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.
-rw-r--r-- | source3/include/messages.h | 2 | ||||
-rw-r--r-- | source3/lib/messages_local.c | 16 | ||||
-rw-r--r-- | source3/smbd/server.c | 4 |
3 files changed, 22 insertions, 0 deletions
diff --git a/source3/include/messages.h b/source3/include/messages.h index 6063d358ea..865ffd4822 100644 --- a/source3/include/messages.h +++ b/source3/include/messages.h @@ -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); diff --git a/source3/lib/messages_local.c b/source3/lib/messages_local.c index a58c7eb95f..b1712823a1 100644 --- a/source3/lib/messages_local.c +++ b/source3/lib/messages_local.c @@ -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. ******************************************************************/ diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 81d75b13a0..0a6d66c180 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -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())) |