[SCM] Samba Shared Repository - branch master updated

Amitay Isaacs amitay at samba.org
Mon Jan 17 04:37:01 UTC 2022


The branch, master has been updated
       via  57a32cebdd8 ctdb-recoverd: Pass SIGHUP to running helper
       via  8e949a60828 ctdb-recoverd: Record helper PID in recovery daemon context
       via  97a45f6f25f ctdb-recoverd: Add log reopening on SIGHUP to helpers
       via  51f0380e83c ctdb-daemon: Enable log reopening for event daemon
       via  4f14d7c0b9b ctdb-event: Reopen logs on SIGHUP
       via  c554a325fe8 ctdb-daemon: Enable log reopening for recovery daemon
       via  4acfefed61f ctdb-recoverd: Add basic log reopening
       via  4ed37de82b1 ctdb-daemon: Add basic top-level log reopening
       via  72773853901 ctdb-common: Add support for reopening logs
       via  d0a19778cdb ctdb-common: Separate sock_daemon's SIGHUP and SIGUSR1 handling
       via  10d15c9e5df ctdb-common: Use Samba's DEBUG_FILE logging
       via  666a0487074 ctdb-common: Switch initial debug type to DEBUG_DEFAULT_STDERR
      from  5f9dbf3decd s3: smbd: Add missing pop_sec_ctx() in error code path of close_directory()

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


- Log -----------------------------------------------------------------
commit 57a32cebdd834e24e69f524f8ffaa980472cde33
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Sep 30 21:16:44 2021 +1000

    ctdb-recoverd: Pass SIGHUP to running helper
    
    The recovery and takeover helpers can run for a while and generate
    non-trivial logs, so have them reopen their logs to support log
    rotation.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>
    
    Autobuild-User(master): Amitay Isaacs <amitay at samba.org>
    Autobuild-Date(master): Mon Jan 17 04:36:30 UTC 2022 on sn-devel-184

commit 8e949a60828bae47a3636f051dcc86387b5fce23
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Sep 30 21:15:56 2021 +1000

    ctdb-recoverd: Record helper PID in recovery daemon context
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit 97a45f6f25f34fff97a9be7ba2b346a4e8b93218
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Sep 30 21:14:14 2021 +1000

    ctdb-recoverd: Add log reopening on SIGHUP to helpers
    
    Recovery and takeover helpers can run for a while and generate
    non-trivial logs.  They should support log reopening.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit 51f0380e83c93702a08e29c230bb8d87d472b616
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Sep 30 21:10:33 2021 +1000

    ctdb-daemon: Enable log reopening for event daemon
    
    Add and call hook to pass on SIGHUP to eventd.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit 4f14d7c0b9bf1f122a1e9f92c1b8bdc57c4c9e68
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Sep 30 21:11:44 2021 +1000

    ctdb-event: Reopen logs on SIGHUP
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit c554a325fe81aab90f4816600849f6c4f901b2f9
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Sep 30 21:08:25 2021 +1000

    ctdb-daemon: Enable log reopening for recovery daemon
    
    Pass on a SIGHUP to the recovery daemon, which will then reopen its
    logs.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit 4acfefed61f2c9e069963ac76b2001469a694461
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Sep 30 21:03:15 2021 +1000

    ctdb-recoverd: Add basic log reopening
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit 4ed37de82b1be4732f6e5936e149aae718855513
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Sep 30 21:06:16 2021 +1000

    ctdb-daemon: Add basic top-level log reopening
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit 72773853901832e4728e42588570d69c93976ce1
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Sep 30 20:55:27 2021 +1000

    ctdb-common: Add support for reopening logs
    
    Now that CTDB uses Samba's file logging it is possible to reopen the
    logs, so that log rotation can be supported.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit d0a19778cdbd04f8b6fca43199d7b12e1d4933b7
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Nov 18 21:17:39 2021 +1100

    ctdb-common: Separate sock_daemon's SIGHUP and SIGUSR1 handling
    
    SIGHUP is for reopening logs, SIGUSR1 is for reconfigure.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit 10d15c9e5dfe4e8595d0b322c96f474fc7078f46
Author: Martin Schwenke <martin at meltin.net>
Date:   Thu Sep 23 18:37:57 2021 +1000

    ctdb-common: Use Samba's DEBUG_FILE logging
    
    This has support for log rotation (or re-opening).
    
    The log format is updated to use an RFC5424 timestamp and to include a
    hostname.  The addition of the hostname allows trivial merging of log
    files from multiple cluster nodes.
    
    The hostname is faked from the CTDB_BASE environment variable during
    testing, as per the comment in the code.  It is currently faked in a
    similar manner in local_daemons.sh when printing logs, so drop this.
    
    Unit tests need updating because stderr logging no longer produces a
    "PROGNAME[PID]: " header.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

commit 666a048707436a8ba3b9a9cb297a4fd504fa1e54
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri Sep 24 22:17:53 2021 +1000

    ctdb-common: Switch initial debug type to DEBUG_DEFAULT_STDERR
    
    This can be overridden by DEBUG_FILE, whereas DEBUG_STDERR can not.
    
    Signed-off-by: Martin Schwenke <martin at meltin.net>
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Amitay Isaacs <amitay at gmail.com>

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

Summary of changes:
 ctdb/common/logging.c                         | 190 +++++++++++++++-----------
 ctdb/common/logging.h                         |   7 +
 ctdb/common/sock_daemon.c                     |  61 ++++++++-
 ctdb/common/sock_daemon.h                     |  15 +-
 ctdb/event/event_daemon.c                     |  10 ++
 ctdb/include/ctdb_private.h                   |   2 +
 ctdb/server/ctdb_daemon.c                     |  21 +++
 ctdb/server/ctdb_recoverd.c                   |  25 ++++
 ctdb/server/ctdb_recovery_helper.c            |   7 +
 ctdb/server/ctdb_takeover_helper.c            |   8 ++
 ctdb/server/eventscript.c                     |   7 +
 ctdb/tests/UNIT/cunit/sock_daemon_test_001.sh | 141 ++++++++++---------
 ctdb/tests/UNIT/eventd/eventd_051.sh          |   2 +-
 ctdb/tests/UNIT/eventd/scripts/local.sh       |   3 +-
 ctdb/tests/local_daemons.sh                   |   9 +-
 ctdb/tests/src/sock_daemon_test.c             | 100 +++++++++++++-
 16 files changed, 448 insertions(+), 160 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/common/logging.c b/ctdb/common/logging.c
index a4321b68ba9..1b91cdcc92b 100644
--- a/ctdb/common/logging.c
+++ b/ctdb/common/logging.c
@@ -111,50 +111,6 @@ int debug_level_from_string(const char *log_string)
  * file logging backend
  */
 
-struct file_log_state {
-	const char *app_name;
-	int fd;
-	char buffer[1024];
-};
-
-static void file_log(void *private_data, int level, const char *msg)
-{
-	struct file_log_state *state = talloc_get_type_abort(
-		private_data, struct file_log_state);
-	struct timeval tv;
-	struct timeval_buf tvbuf;
-	int ret;
-
-	if (state->fd == STDERR_FILENO) {
-		ret = snprintf(state->buffer, sizeof(state->buffer),
-			       "%s[%u]: %s\n",
-			       state->app_name, (unsigned)getpid(), msg);
-	} else {
-		GetTimeOfDay(&tv);
-		timeval_str_buf(&tv, false, true, &tvbuf);
-
-		ret = snprintf(state->buffer, sizeof(state->buffer),
-			       "%s %s[%u]: %s\n", tvbuf.buf,
-			       state->app_name, (unsigned)getpid(), msg);
-	}
-	if (ret < 0) {
-		return;
-	}
-
-	state->buffer[sizeof(state->buffer)-1] = '\0';
-
-	sys_write_v(state->fd, state->buffer, strlen(state->buffer));
-}
-
-static int file_log_state_destructor(struct file_log_state *state)
-{
-	if (state->fd != -1 && state->fd != STDERR_FILENO) {
-		close(state->fd);
-		state->fd = -1;
-	}
-	return 0;
-}
-
 static bool file_log_validate(const char *option)
 {
 	char *t, *dir;
@@ -185,46 +141,49 @@ static bool file_log_validate(const char *option)
 	return true;
 }
 
-static int file_log_setup(TALLOC_CTX *mem_ctx, const char *option,
+static int file_log_setup(TALLOC_CTX *mem_ctx,
+			  const char *option,
 			  const char *app_name)
 {
-	struct file_log_state *state;
-
-	state = talloc_zero(mem_ctx, struct file_log_state);
-	if (state == NULL) {
-		return ENOMEM;
-	}
-
-	state->app_name = app_name;
+	struct debug_settings settings = {
+		.debug_syslog_format = true,
+		.debug_hires_timestamp = true,
+	};
+	const char *t = NULL;
 
 	if (option == NULL || strcmp(option, "-") == 0) {
-		int ret;
-
-		state->fd = STDERR_FILENO;
-		ret = dup2(STDERR_FILENO, STDOUT_FILENO);
-		if (ret == -1) {
-			int save_errno = errno;
-			talloc_free(state);
-			return save_errno;
-		}
-
-	} else {
-		state->fd = open(option, O_WRONLY|O_APPEND|O_CREAT, 0644);
-		if (state->fd == -1) {
-			int save_errno = errno;
-			talloc_free(state);
-			return save_errno;
-		}
-
-		if (! set_close_on_exec(state->fd)) {
-			int save_errno = errno;
-			talloc_free(state);
-			return save_errno;
+		/*
+		 * Logging to stderr is the default and has already
+		 * been done in logging init
+		 */
+		return 0;
+	}
+
+	/*
+	 * Support logging of fake hostname in local daemons.  This
+	 * hostname is basename(getenv(CTDB_BASE)).
+	 */
+	t = getenv("CTDB_TEST_MODE");
+	if (t != NULL) {
+		t = getenv("CTDB_BASE");
+		if (t != NULL) {
+			const char *p = strrchr(t, '/');
+			if (p != NULL) {
+				p++;
+				if (p[0] == '\0') {
+					p = "unknown";
+				}
+			} else {
+				p = t;
+			}
+
+			debug_set_hostname(p);
 		}
 	}
 
-	talloc_set_destructor(state, file_log_state_destructor);
-	debug_set_callback(state, file_log);
+	debug_set_settings(&settings, "file", 0, false);
+	debug_set_logfile(option);
+	setup_logging(app_name, DEBUG_FILE);
 
 	return 0;
 }
@@ -677,7 +636,7 @@ int logging_init(TALLOC_CTX *mem_ctx, const char *logging,
 	int level;
 	int ret;
 
-	setup_logging(app_name, DEBUG_STDERR);
+	setup_logging(app_name, DEBUG_DEFAULT_STDERR);
 
 	if (debug_level == NULL) {
 		debug_level = getenv("CTDB_DEBUGLEVEL");
@@ -708,3 +667,78 @@ int logging_init(TALLOC_CTX *mem_ctx, const char *logging,
 	talloc_free(option);
 	return ret;
 }
+
+bool logging_reopen_logs(void)
+{
+	bool status;
+
+	status = reopen_logs_internal();
+
+	return status;
+}
+
+struct logging_reopen_logs_data {
+	void (*hook)(void *private_data);
+	void *private_data;
+};
+
+static void logging_sig_hup_handler(struct tevent_context *ev,
+				    struct tevent_signal *se,
+				    int signum,
+				    int count,
+				    void *dont_care,
+				    void *private_data)
+{
+	bool status;
+
+	if (private_data != NULL) {
+		struct logging_reopen_logs_data *data = talloc_get_type_abort(
+			private_data, struct logging_reopen_logs_data);
+
+		if (data->hook != NULL) {
+			data->hook(data->private_data);
+		}
+	}
+
+	status = logging_reopen_logs();
+	if (!status) {
+		D_WARNING("Failed to reopen logs\n");
+		return;
+	}
+
+	D_NOTICE("Reopened logs\n");
+
+}
+
+bool logging_setup_sighup_handler(struct tevent_context *ev,
+				  TALLOC_CTX *talloc_ctx,
+				  void (*hook)(void *private_data),
+				  void *private_data)
+{
+	struct logging_reopen_logs_data *data = NULL;
+	struct tevent_signal *se;
+
+	if (hook != NULL) {
+		data = talloc(talloc_ctx, struct logging_reopen_logs_data);
+		if (data == NULL) {
+			return false;
+		}
+
+		data->hook = hook;
+		data->private_data = private_data;
+	}
+
+
+	se = tevent_add_signal(ev,
+			       talloc_ctx,
+			       SIGHUP,
+			       0,
+			       logging_sig_hup_handler,
+			       data);
+	if (se == NULL) {
+		talloc_free(data);
+		return false;
+	}
+
+	return true;
+}
diff --git a/ctdb/common/logging.h b/ctdb/common/logging.h
index 368171fe406..542b4a3723d 100644
--- a/ctdb/common/logging.h
+++ b/ctdb/common/logging.h
@@ -21,6 +21,7 @@
 #define __CTDB_LOGGING_H__
 
 #include <talloc.h>
+#include <tevent.h>
 #include "lib/util/debug.h"
 
 #define DEBUG_ERR     DBGLVL_ERR
@@ -41,4 +42,10 @@ bool logging_validate(const char *logging);
 int logging_init(TALLOC_CTX *mem_ctx, const char *logging,
 		 const char *debuglevel, const char *app_name);
 
+bool logging_reopen_logs(void);
+bool logging_setup_sighup_handler(struct tevent_context *ev,
+				  TALLOC_CTX *talloc_ctx,
+				  void (*hook)(void *private_data),
+				  void *private_data);
+
 #endif /* __CTDB_LOGGING_H__ */
diff --git a/ctdb/common/sock_daemon.c b/ctdb/common/sock_daemon.c
index 6298653f4ec..e31a36445b5 100644
--- a/ctdb/common/sock_daemon.c
+++ b/ctdb/common/sock_daemon.c
@@ -555,6 +555,8 @@ static void sock_daemon_run_signal_handler(struct tevent_context *ev,
 					   void *private_data);
 static void sock_daemon_run_reconfigure(struct tevent_req *req);
 static void sock_daemon_run_reconfigure_done(struct tevent_req *subreq);
+static void sock_daemon_run_reopen_logs(struct tevent_req *req);
+static void sock_daemon_run_reopen_logs_done(struct tevent_req *subreq);
 static void sock_daemon_run_shutdown(struct tevent_req *req);
 static void sock_daemon_run_shutdown_done(struct tevent_req *subreq);
 static void sock_daemon_run_exit(struct tevent_req *req);
@@ -735,11 +737,16 @@ static void sock_daemon_run_signal_handler(struct tevent_context *ev,
 
 	D_NOTICE("Received signal %d\n", signum);
 
-	if (signum == SIGHUP || signum == SIGUSR1) {
+	if (signum == SIGUSR1) {
 		sock_daemon_run_reconfigure(req);
 		return;
 	}
 
+	if (signum == SIGHUP) {
+		sock_daemon_run_reopen_logs(req);
+		return;
+	}
+
 	if (signum == SIGINT || signum == SIGTERM) {
 		state->exit_code = EINTR;
 		sock_daemon_run_shutdown(req);
@@ -798,6 +805,58 @@ static void sock_daemon_run_reconfigure_done(struct tevent_req *subreq)
 	D_NOTICE("reconfigure completed successfully\n");
 }
 
+static void sock_daemon_run_reopen_logs(struct tevent_req *req)
+{
+	struct tevent_req *subreq;
+	struct sock_daemon_run_state *state = tevent_req_data(
+		req, struct sock_daemon_run_state);
+	struct sock_daemon_context *sockd = state->sockd;
+
+	if (sockd->funcs != NULL && sockd->funcs->reopen_logs_send != NULL &&
+	    sockd->funcs->reopen_logs_recv != NULL) {
+		subreq = sockd->funcs->reopen_logs_send(state, state->ev,
+							sockd->private_data);
+		if (tevent_req_nomem(subreq, req)) {
+			return;
+		}
+		tevent_req_set_callback(subreq,
+					sock_daemon_run_reopen_logs_done, req);
+		return;
+	}
+
+	if (sockd->funcs != NULL && sockd->funcs->reopen_logs != NULL) {
+		int ret;
+
+		ret = sockd->funcs->reopen_logs(sockd->private_data);
+		if (ret != 0) {
+			D_ERR("reopen logs, ret=%d\n", ret);
+			return;
+		}
+
+		D_NOTICE("reopen logs completed successfully\n");
+	}
+}
+
+static void sock_daemon_run_reopen_logs_done(struct tevent_req *subreq)
+{
+	struct tevent_req *req = tevent_req_callback_data(
+		subreq, struct tevent_req);
+	struct sock_daemon_run_state *state = tevent_req_data(
+		req, struct sock_daemon_run_state);
+	struct sock_daemon_context *sockd = state->sockd;
+	int ret;
+	bool status;
+
+	status = sockd->funcs->reopen_logs_recv(subreq, &ret);
+	TALLOC_FREE(subreq);
+	if (! status) {
+		D_ERR("reopen logs failed, ret=%d\n", ret);
+		return;
+	}
+
+	D_NOTICE("reopen logs completed successfully\n");
+}
+
 static void sock_daemon_run_shutdown(struct tevent_req *req)
 {
 	struct tevent_req *subreq;
diff --git a/ctdb/common/sock_daemon.h b/ctdb/common/sock_daemon.h
index 7aa9d5dfd34..7653d2c1023 100644
--- a/ctdb/common/sock_daemon.h
+++ b/ctdb/common/sock_daemon.h
@@ -54,12 +54,18 @@ struct sock_client_context;
  *
  * startup_send()/startup_recv() is the async version of startup()
  *
- * reconfigure() is called when the daemon receives SIGUSR1 or SIGHUP
+ * reconfigure() is called when the daemon receives SIGUSR1
  *	reconfigure() should return 0 for success, non-zero value on failure
  *	On failure, sock_daemon_run() will continue to run.
  *
  * reconfigure_send()/reconfigure_recv() is the async version of reconfigure()
  *
+ * reopen_logs() is called when the daemon receives SIGHUP
+ *	reopen_logs() should return 0 for success, non-zero value on failure
+ *	On failure, sock_daemon_run() will continue to run.
+ *
+ * reopen_logs_send()/reopen_logs_recv() is the async version of reopen_logs()
+ *
  * shutdown() is called when process receives SIGINT or SIGTERM or
  *             when wait computation has finished
  *
@@ -90,6 +96,13 @@ struct sock_daemon_funcs {
 						void *private_data);
 	bool (*reconfigure_recv)(struct tevent_req *req, int *perr);
 
+	int (*reopen_logs)(void *private_data);
+
+	struct tevent_req * (*reopen_logs_send)(TALLOC_CTX *mem_ctx,
+						struct tevent_context *ev,
+						void *private_data);
+	bool (*reopen_logs_recv)(struct tevent_req *req, int *perr);
+
 	void (*shutdown)(void *private_data);
 
 	struct tevent_req * (*shutdown_send)(TALLOC_CTX *mem_ctx,
diff --git a/ctdb/event/event_daemon.c b/ctdb/event/event_daemon.c
index b6c01761e91..d96ff6f172f 100644
--- a/ctdb/event/event_daemon.c
+++ b/ctdb/event/event_daemon.c
@@ -74,6 +74,15 @@ static int event_daemon_reconfigure(void *private_data)
 	return 0;
 }
 
+static int event_daemon_reopen_logs(void *private_data)
+{
+	bool status;
+
+	status = logging_reopen_logs();
+
+	return status ? 0 : 1;
+}
+
 static void event_daemon_shutdown(void *private_data)
 {
 	struct event_daemon_state *e_state = talloc_get_type_abort(
@@ -307,6 +316,7 @@ int main(int argc, const char **argv)
 	daemon_funcs = (struct sock_daemon_funcs) {
 		.startup = event_daemon_startup,
 		.reconfigure = event_daemon_reconfigure,
+		.reopen_logs = event_daemon_reopen_logs,
 		.shutdown = event_daemon_shutdown,
 	};
 
diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h
index f5e647f08a5..b0469f7f14a 100644
--- a/ctdb/include/ctdb_private.h
+++ b/ctdb/include/ctdb_private.h
@@ -1035,4 +1035,6 @@ int ctdb_event_script_args(struct ctdb_context *ctdb,
 int ctdb_event_script(struct ctdb_context *ctdb,
 		      enum ctdb_event call);
 
+void ctdb_event_reopen_logs(struct ctdb_context *ctdb);
+
 #endif
diff --git a/ctdb/server/ctdb_daemon.c b/ctdb/server/ctdb_daemon.c
index 0896ba08f90..be5a6922c79 100644
--- a/ctdb/server/ctdb_daemon.c
+++ b/ctdb/server/ctdb_daemon.c
@@ -1488,6 +1488,17 @@ static void fork_only(void)
 	}
 }
 
+static void sighup_hook(void *private_data)
+{
+	struct ctdb_context *ctdb = talloc_get_type_abort(private_data,
+							  struct ctdb_context);
+
+	if (ctdb->recoverd_pid > 0) {
+		kill(ctdb->recoverd_pid, SIGHUP);
+	}
+	ctdb_event_reopen_logs(ctdb);
+}
+
 /*
   start the protocol going as a daemon
 */
@@ -1495,6 +1506,7 @@ int ctdb_start_daemon(struct ctdb_context *ctdb,
 		      bool interactive,
 		      bool test_mode_enabled)
 {
+	bool status;
 	int ret;
 	struct tevent_fd *fde;
 
@@ -1548,6 +1560,15 @@ int ctdb_start_daemon(struct ctdb_context *ctdb,
 	ctdb_tevent_trace_init();
 	tevent_set_trace_callback(ctdb->ev, ctdb_tevent_trace, ctdb);
 
+	status = logging_setup_sighup_handler(ctdb->ev,
+					      ctdb,
+					      sighup_hook,
+					      ctdb);
+	if (!status) {
+		D_ERR("Failed to set up signal handler for SIGHUP\n");
+		exit(1);
+	}
+
 	/* set up a handler to pick up sigchld */
 	if (ctdb_init_sigchld(ctdb) == NULL) {
 		DEBUG(DEBUG_CRIT,("Failed to set up signal handler for SIGCHLD\n"));
diff --git a/ctdb/server/ctdb_recoverd.c b/ctdb/server/ctdb_recoverd.c
index dfa6d0d089b..761f00177ca 100644
--- a/ctdb/server/ctdb_recoverd.c
+++ b/ctdb/server/ctdb_recoverd.c
@@ -263,6 +263,7 @@ struct ctdb_recoverd {
 	struct ctdb_node_capabilities *caps;
 	bool frozen_on_inactive;
 	struct ctdb_recovery_lock_handle *recovery_lock_handle;
+	pid_t helper_pid;
 };
 
 #define CONTROL_TIMEOUT() timeval_current_ofs(ctdb->tunable.recover_timeout, 0)
@@ -899,6 +900,7 @@ static int helper_run(struct ctdb_recoverd *rec, TALLOC_CTX *mem_ctx,
 	close(state->fd[1]);
 	state->fd[1] = -1;
 
+	rec->helper_pid = state->pid;
 	state->done = false;
 
 	fde = tevent_add_fd(rec->ctdb->ev, state, state->fd[0],
@@ -927,6 +929,7 @@ static int helper_run(struct ctdb_recoverd *rec, TALLOC_CTX *mem_ctx,
 		goto fail;
 	}
 
+	rec->helper_pid = -1;
 	ctdb_kill(rec->ctdb, state->pid, SIGKILL);
 	talloc_free(state);
 	return 0;
@@ -938,6 +941,7 @@ fail:
 	if (state->fd[1] != -1) {
 		close(state->fd[1]);
 	}
+	rec->helper_pid = -1;
 	if (state->pid != -1) {
 		ctdb_kill(rec->ctdb, state->pid, SIGKILL);
 	}
@@ -2909,6 +2913,16 @@ done:
 	}


-- 
Samba Shared Repository



More information about the samba-cvs mailing list