summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2010-03-25 16:01:54 +0100
committerVolker Lendecke <vl@samba.org>2010-03-25 16:40:44 +0100
commited189459b9d7776700ffd353f81b283232940199 (patch)
tree3e46a1b3c44dd8d66ace3a586918a3aebd3414fd
parent4cdbe07b2563b56c2d8b9a5733eedf25245ba86b (diff)
downloadsamba-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.h1
-rw-r--r--source3/smbd/notify_internal.c27
-rw-r--r--source3/smbd/server.c4
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()))