diff options
author | Volker Lendecke <vl@samba.org> | 2010-03-25 16:01:54 +0100 |
---|---|---|
committer | Volker Lendecke <vl@samba.org> | 2010-03-25 16:40:44 +0100 |
commit | ed189459b9d7776700ffd353f81b283232940199 (patch) | |
tree | 3e46a1b3c44dd8d66ace3a586918a3aebd3414fd | |
parent | 4cdbe07b2563b56c2d8b9a5733eedf25245ba86b (diff) | |
download | samba-ed189459b9d7776700ffd353f81b283232940199.tar.gz samba-ed189459b9d7776700ffd353f81b283232940199.tar.bz2 samba-ed189459b9d7776700ffd353f81b283232940199.zip |
s3: Make sure our CLEAR_IF_FIRST optimization works for the notify tdbs
The notify tdb files are opened at tconX time, which leads to one fcntl lock
for CLEAR_IF_FIRST detection per smbd. This opens the tdbs in the parent and
holds it, so that tdb_reopen_all correctly catches the CLEAR_IF_FIRST bit.
-rw-r--r-- | source3/include/proto.h | 1 | ||||
-rw-r--r-- | source3/smbd/notify_internal.c | 27 | ||||
-rw-r--r-- | source3/smbd/server.c | 4 |
3 files changed, 32 insertions, 0 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index e8f99859b8..dca58cc733 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -6545,6 +6545,7 @@ struct notify_context *notify_init(TALLOC_CTX *mem_ctx, struct server_id server, struct messaging_context *messaging_ctx, struct event_context *ev, connection_struct *conn); +bool notify_internal_parent_init(void); NTSTATUS notify_add(struct notify_context *notify, struct notify_entry *e0, void (*callback)(void *, const struct notify_event *), void *private_data); diff --git a/source3/smbd/notify_internal.c b/source3/smbd/notify_internal.c index 0467e672c1..0e38da6a8c 100644 --- a/source3/smbd/notify_internal.c +++ b/source3/smbd/notify_internal.c @@ -128,6 +128,33 @@ struct notify_context *notify_init(TALLOC_CTX *mem_ctx, struct server_id server, return notify; } +bool notify_internal_parent_init(void) +{ + struct tdb_wrap *db1, *db2; + + if (lp_clustering()) { + return true; + } + + db1 = tdb_wrap_open(talloc_autofree_context(), lock_path("notify.tdb"), + 0, TDB_SEQNUM|TDB_CLEAR_IF_FIRST, + O_RDWR|O_CREAT, 0644); + if (db1 == NULL) { + DEBUG(1, ("could not open notify.tdb: %s\n", strerror(errno))); + return false; + } + db2 = tdb_wrap_open(talloc_autofree_context(), + lock_path("notify_onelevel.tdb"), + 0, TDB_CLEAR_IF_FIRST, O_RDWR|O_CREAT, 0644); + if (db2 == NULL) { + DEBUG(1, ("could not open notify_onelevel.tdb: %s\n", + strerror(errno))); + TALLOC_FREE(db1); + return false; + } + return true; +} + /* lock and fetch the record */ diff --git a/source3/smbd/server.c b/source3/smbd/server.c index 0a6d66c180..145dd5f5d5 100644 --- a/source3/smbd/server.c +++ b/source3/smbd/server.c @@ -1300,6 +1300,10 @@ extern void build_options(bool screen); exit(1); } + if (!notify_internal_parent_init()) { + exit(1); + } + namecache_enable(); if (!W_ERROR_IS_OK(registry_init_full())) |