[SCM] Samba Shared Repository - branch master updated

Björn Baumbach bbaumbach at samba.org
Tue Feb 18 13:06:02 UTC 2020


The branch, master has been updated
       via  f1577c2bc13 lib: Fix a shutdown crash with "clustering = yes"
       via  7209357f9ba lib: Introduce messaging_context->per_process_talloc_ctx
       via  dab982d88e9 lib: Add a TALLOC_CTX to base register_msg_pool_usage() on
       via  8a23031b7bf lib: Simplify register_msg_pool_usage()
      from  4de1e3207ba ctdb-docs: Provide example commands for "ctdb event ..."

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit f1577c2bc13c91ea912ae461870e470065f250c1
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Feb 11 22:10:32 2020 +0100

    lib: Fix a shutdown crash with "clustering = yes"
    
    This is a bit confusing now, sorry for that:
    
    register_msg_pool_usage() in the ctdb case uses
    messaging_ctdb_register_tevent_context(), which talloc_reference()s
    the central struct messaging_ctdb_fde_ev of the
    messaging_ctdb_context. In messaging_reinit(), we talloc_free only one
    of those references and allocate a new messaging_ctdb_fde_ev. The
    remaining messaging_ctdb_fde_ev should have been deleted as well, but
    due to the second reference this does not happen. When doing the
    shutdown messaging_ctdb_fde_ev_destructor() is called twice, once on
    the properly reinitialized fde_ev, and once much later on the leftover
    one which references invalid data structures.
    
    By the way, this is not a problem with talloc_reference(), this would
    have happened with explicit refcounting too.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14281
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    
    Autobuild-User(master): Björn Baumbach <bb at sernet.de>
    Autobuild-Date(master): Tue Feb 18 13:05:53 UTC 2020 on sn-devel-184

commit 7209357f9ba5525a207d301b299931d6bdee9c2f
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Feb 11 21:57:42 2020 +0100

    lib: Introduce messaging_context->per_process_talloc_ctx
    
    Consolidate "msg_dgm_ref" and "msg_ctdb_ref": The only purpose of
    those pointers was to TALLOC_FREE() them in messaging_reinit(). We'll
    have a third entity to talloc_free() in the next commit, make that
    simpler.
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14281
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit dab982d88e9132cbff52db22f441c08ee59bb159
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Feb 11 21:47:39 2020 +0100

    lib: Add a TALLOC_CTX to base register_msg_pool_usage() on
    
    Add a simple way to deactivate the registration
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14281
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 8a23031b7bfea4cdaa71d6815bca24dcc3685b22
Author: Volker Lendecke <vl at samba.org>
Date:   Tue Feb 11 21:26:18 2020 +0100

    lib: Simplify register_msg_pool_usage()
    
    We can do as much as we want in the filter. This gives us automatic
    retry, we don't have to do the messaging_filtered_read_send() over and
    over again
    
    Bug: https://bugzilla.samba.org/show_bug.cgi?id=14281
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/include/proto.h |  3 +-
 source3/lib/messages.c  | 87 ++++++++++++++++++++++++++++++++-----------------
 source3/lib/tallocmsg.c | 62 +++++++++++++----------------------
 3 files changed, 81 insertions(+), 71 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/include/proto.h b/source3/include/proto.h
index e03486f07ab..6ac70a22beb 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -266,7 +266,8 @@ bool getgroups_unix_user(TALLOC_CTX *mem_ctx, const char *user,
 
 /* The following definitions come from lib/tallocmsg.c  */
 
-void register_msg_pool_usage(struct messaging_context *msg_ctx);
+void register_msg_pool_usage(TALLOC_CTX *mem_ctx,
+			     struct messaging_context *msg_ctx);
 
 /* The following definitions come from lib/time.c  */
 
diff --git a/source3/lib/messages.c b/source3/lib/messages.c
index a6bf99578b6..63d6362e0c9 100644
--- a/source3/lib/messages.c
+++ b/source3/lib/messages.c
@@ -97,10 +97,9 @@ struct messaging_context {
 	struct tevent_req **waiters;
 	size_t num_waiters;
 
-	void *msg_dgm_ref;
-	void *msg_ctdb_ref;
-
 	struct server_id_db *names_db;
+
+	TALLOC_CTX *per_process_talloc_ctx;
 };
 
 static struct messaging_rec *messaging_rec_dup(TALLOC_CTX *mem_ctx,
@@ -484,6 +483,7 @@ static NTSTATUS messaging_init_internal(TALLOC_CTX *mem_ctx,
 	int ret;
 	const char *lck_path;
 	const char *priv_path;
+	void *ref;
 	bool ok;
 
 	/*
@@ -537,21 +537,28 @@ static NTSTATUS messaging_init_internal(TALLOC_CTX *mem_ctx,
 
 	ctx->event_ctx = ev;
 
+	ctx->per_process_talloc_ctx = talloc_new(ctx);
+	if (ctx->per_process_talloc_ctx == NULL) {
+		status = NT_STATUS_NO_MEMORY;
+		goto done;
+	}
+
 	ok = messaging_register_event_context(ctx, ev);
 	if (!ok) {
 		status = NT_STATUS_NO_MEMORY;
 		goto done;
 	}
 
-	ctx->msg_dgm_ref = messaging_dgm_ref(ctx,
-					     ctx->event_ctx,
-					     &ctx->id.unique_id,
-					     priv_path,
-					     lck_path,
-					     messaging_recv_cb,
-					     ctx,
-					     &ret);
-	if (ctx->msg_dgm_ref == NULL) {
+	ref = messaging_dgm_ref(
+		ctx->per_process_talloc_ctx,
+		ctx->event_ctx,
+		&ctx->id.unique_id,
+		priv_path,
+		lck_path,
+		messaging_recv_cb,
+		ctx,
+		&ret);
+	if (ref == NULL) {
 		DEBUG(2, ("messaging_dgm_ref failed: %s\n", strerror(ret)));
 		status = map_nt_error_from_unix(ret);
 		goto done;
@@ -560,11 +567,16 @@ static NTSTATUS messaging_init_internal(TALLOC_CTX *mem_ctx,
 
 #ifdef CLUSTER_SUPPORT
 	if (lp_clustering()) {
-		ctx->msg_ctdb_ref = messaging_ctdb_ref(
-			ctx, ctx->event_ctx,
-			lp_ctdbd_socket(), lp_ctdb_timeout(),
-			ctx->id.unique_id, messaging_recv_cb, ctx, &ret);
-		if (ctx->msg_ctdb_ref == NULL) {
+		ref = messaging_ctdb_ref(
+			ctx->per_process_talloc_ctx,
+			ctx->event_ctx,
+			lp_ctdbd_socket(),
+			lp_ctdb_timeout(),
+			ctx->id.unique_id,
+			messaging_recv_cb,
+			ctx,
+			&ret);
+		if (ref == NULL) {
 			DBG_NOTICE("messaging_ctdb_ref failed: %s\n",
 				   strerror(ret));
 			status = map_nt_error_from_unix(ret);
@@ -590,7 +602,7 @@ static NTSTATUS messaging_init_internal(TALLOC_CTX *mem_ctx,
 
 	/* Register some debugging related messages */
 
-	register_msg_pool_usage(ctx);
+	register_msg_pool_usage(ctx->per_process_talloc_ctx, ctx);
 	register_dmalloc_msgs(ctx);
 	debug_register_msgs(ctx);
 
@@ -636,9 +648,14 @@ NTSTATUS messaging_reinit(struct messaging_context *msg_ctx)
 {
 	int ret;
 	char *lck_path;
+	void *ref;
+
+	TALLOC_FREE(msg_ctx->per_process_talloc_ctx);
 
-	TALLOC_FREE(msg_ctx->msg_dgm_ref);
-	TALLOC_FREE(msg_ctx->msg_ctdb_ref);
+	msg_ctx->per_process_talloc_ctx = talloc_new(msg_ctx);
+	if (msg_ctx->per_process_talloc_ctx == NULL) {
+		return NT_STATUS_NO_MEMORY;
+	}
 
 	msg_ctx->id = (struct server_id) {
 		.pid = getpid(), .vnn = msg_ctx->id.vnn
@@ -649,23 +666,32 @@ NTSTATUS messaging_reinit(struct messaging_context *msg_ctx)
 		return NT_STATUS_NO_MEMORY;
 	}
 
-	msg_ctx->msg_dgm_ref = messaging_dgm_ref(
-		msg_ctx, msg_ctx->event_ctx, &msg_ctx->id.unique_id,
-		private_path("msg.sock"), lck_path,
-		messaging_recv_cb, msg_ctx, &ret);
+	ref = messaging_dgm_ref(
+		msg_ctx->per_process_talloc_ctx,
+		msg_ctx->event_ctx,
+		&msg_ctx->id.unique_id,
+		private_path("msg.sock"),
+		lck_path,
+		messaging_recv_cb,
+		msg_ctx,
+		&ret);
 
-	if (msg_ctx->msg_dgm_ref == NULL) {
+	if (ref == NULL) {
 		DEBUG(2, ("messaging_dgm_ref failed: %s\n", strerror(ret)));
 		return map_nt_error_from_unix(ret);
 	}
 
 	if (lp_clustering()) {
-		msg_ctx->msg_ctdb_ref = messaging_ctdb_ref(
-			msg_ctx, msg_ctx->event_ctx,
-			lp_ctdbd_socket(), lp_ctdb_timeout(),
-			msg_ctx->id.unique_id, messaging_recv_cb, msg_ctx,
+		ref = messaging_ctdb_ref(
+			msg_ctx->per_process_talloc_ctx,
+			msg_ctx->event_ctx,
+			lp_ctdbd_socket(),
+			lp_ctdb_timeout(),
+			msg_ctx->id.unique_id,
+			messaging_recv_cb,
+			msg_ctx,
 			&ret);
-		if (msg_ctx->msg_ctdb_ref == NULL) {
+		if (ref == NULL) {
 			DBG_NOTICE("messaging_ctdb_ref failed: %s\n",
 				   strerror(ret));
 			return map_nt_error_from_unix(ret);
@@ -673,6 +699,7 @@ NTSTATUS messaging_reinit(struct messaging_context *msg_ctx)
 	}
 
 	server_id_db_reinit(msg_ctx->names_db, msg_ctx->id);
+	register_msg_pool_usage(msg_ctx->per_process_talloc_ctx, msg_ctx);
 
 	return NT_STATUS_OK;
 }
diff --git a/source3/lib/tallocmsg.c b/source3/lib/tallocmsg.c
index 1e243e77781..bc0fa132e32 100644
--- a/source3/lib/tallocmsg.c
+++ b/source3/lib/tallocmsg.c
@@ -25,6 +25,9 @@
 
 static bool pool_usage_filter(struct messaging_rec *rec, void *private_data)
 {
+	FILE *f = NULL;
+	int fd;
+
 	if (rec->msg_type != MSG_REQ_POOL_USAGE) {
 		return false;
 	}
@@ -36,63 +39,43 @@ static bool pool_usage_filter(struct messaging_rec *rec, void *private_data)
 		return false;
 	}
 
-	return true;
-}
-
-
-static void msg_pool_usage_do(struct tevent_req *req)
-{
-	struct messaging_context *msg_ctx = tevent_req_callback_data(
-		req, struct messaging_context);
-	struct messaging_rec *rec = NULL;
-	FILE *f = NULL;
-	int ret;
-
-	ret = messaging_filtered_read_recv(req, talloc_tos(), &rec);
-	TALLOC_FREE(req);
-	if (ret != 0) {
-		DBG_DEBUG("messaging_filtered_read_recv returned %s\n",
-			  strerror(ret));
-		return;
+	fd = dup(rec->fds[0]);
+	if (fd == -1) {
+		DBG_DEBUG("dup(%"PRIi64") failed: %s\n",
+			  rec->fds[0],
+			  strerror(errno));
+		return false;
 	}
 
-	f = fdopen(rec->fds[0], "w");
+	f = fdopen(fd, "w");
 	if (f == NULL) {
-		close(rec->fds[0]);
-		TALLOC_FREE(rec);
 		DBG_DEBUG("fdopen failed: %s\n", strerror(errno));
-		return;
+		close(fd);
+		return false;
 	}
 
-	TALLOC_FREE(rec);
-
 	talloc_full_report_printf(NULL, f);
 
 	fclose(f);
-	f = NULL;
-
-	req = messaging_filtered_read_send(
-		msg_ctx,
-		messaging_tevent_context(msg_ctx),
-		msg_ctx,
-		pool_usage_filter,
-		NULL);
-	if (req == NULL) {
-		DBG_WARNING("messaging_filtered_read_send failed\n");
-		return;
-	}
-	tevent_req_set_callback(req, msg_pool_usage_do, msg_ctx);
+	/*
+	 * Returning false, means messaging_dispatch_waiters()
+	 * won't call messaging_filtered_read_done() and
+	 * our messaging_filtered_read_send() stays alive
+	 * and will get messages.
+	 */
+	return false;
 }
 
 /**
  * Register handler for MSG_REQ_POOL_USAGE
  **/
-void register_msg_pool_usage(struct messaging_context *msg_ctx)
+void register_msg_pool_usage(
+	TALLOC_CTX *mem_ctx, struct messaging_context *msg_ctx)
 {
 	struct tevent_req *req = NULL;
 
 	req = messaging_filtered_read_send(
-		msg_ctx,
+		mem_ctx,
 		messaging_tevent_context(msg_ctx),
 		msg_ctx,
 		pool_usage_filter,
@@ -101,6 +84,5 @@ void register_msg_pool_usage(struct messaging_context *msg_ctx)
 		DBG_WARNING("messaging_filtered_read_send failed\n");
 		return;
 	}
-	tevent_req_set_callback(req, msg_pool_usage_do, msg_ctx);
 	DEBUG(2, ("Registered MSG_REQ_POOL_USAGE\n"));
 }


-- 
Samba Shared Repository



More information about the samba-cvs mailing list