s3: Make sure our CLEAR_IF_FIRST optimization works for the notify tdbs
authorVolker Lendecke <vl@samba.org>
Thu, 25 Mar 2010 15:01:54 +0000 (16:01 +0100)
committerVolker Lendecke <vl@samba.org>
Thu, 25 Mar 2010 15:40:44 +0000 (16:40 +0100)
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.

source3/include/proto.h
source3/smbd/notify_internal.c
source3/smbd/server.c

index e8f99859b8e0e5f543238434dc3ba2e2b869eec9..dca58cc7334778895ecc20dad734387d14dab693 100644 (file)
@@ -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);
index 0467e672c1610e5cd749aed3f72100fc0c364722..0e38da6a8cd6e58957f431c7e05d637d2088e3aa 100644 (file)
@@ -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
 */
index 0a6d66c180542eb25b60267c4f2a4403b0afd058..145dd5f5d527c4f409c314b97dfdf49d89ced4b8 100644 (file)
@@ -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()))