The branch, master has been updated via ea754bfdec9 ctdb-tests: Enable job control when keeping stdin open via 2380b13bf81 ctdb-tests: Don't close stdin when starting local daemons via cf460bd9c4a ctdb-daemon: Shut down if interactive and stdin is closed via d79e2dcfc84 ctdb-daemon: Only stop monitoring if it has been initialised from 0ad6a243b25 lib:util: Log mkdir error on correct debug levels
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit ea754bfdec9d537c500036d4d521bd41d34c0835 Author: Martin Schwenke <mar...@meltin.net> Date: Tue Jan 14 10:58:15 2020 +1100 ctdb-tests: Enable job control when keeping stdin open POSIX says: If job control is disabled (see set, -m), the standard input for an asynchronous list, before any explicit redirections are performed, shall be considered to be assigned to a file that has the same properties as /dev/null. This shall not happen if job control is enabled. In all cases, explicit redirection of standard input shall override this activity. ctdbd is backgrounded at startup, so the above causes stdin to be redirected from /dev/null. Enable job control to work around this. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> Autobuild-User(master): Martin Schwenke <mart...@samba.org> Autobuild-Date(master): Tue Jan 28 11:24:35 UTC 2020 on sn-devel-184 commit 2380b13bf81f0705d036a0b43c65e823dd0e3624 Author: Martin Schwenke <mar...@meltin.net> Date: Mon Jan 13 21:04:24 2020 +1100 ctdb-tests: Don't close stdin when starting local daemons Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit cf460bd9c4ae1e0de871a6c4980a2c365e82550a Author: Martin Schwenke <mar...@meltin.net> Date: Mon Jan 13 21:04:54 2020 +1100 ctdb-daemon: Shut down if interactive and stdin is closed This allows a test environment to simply close its end of a pipe to cleanly shutdown ctdbd. Like in smbd, this is only done if stdin is a pipe or a socket. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit d79e2dcfc84d937db3c6eb3d17520aaf6e7bba4c Author: Martin Schwenke <mar...@meltin.net> Date: Mon Jan 13 21:13:32 2020 +1100 ctdb-daemon: Only stop monitoring if it has been initialised This avoids a crash if ctdb_shutdown_sequence() is called before monitoring is initialised. Switch to using TALLOC_FREE() while touching this function. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> ----------------------------------------------------------------------- Summary of changes: ctdb/server/ctdb_daemon.c | 59 +++++++++++++++++++++++++++++++++++++++++++++ ctdb/server/ctdb_monitor.c | 8 ++++-- ctdb/tests/local_daemons.sh | 4 +-- 3 files changed, 67 insertions(+), 4 deletions(-) Changeset truncated at 500 lines: diff --git a/ctdb/server/ctdb_daemon.c b/ctdb/server/ctdb_daemon.c index cc688b07e9c..c4ab2dbc3d3 100644 --- a/ctdb/server/ctdb_daemon.c +++ b/ctdb/server/ctdb_daemon.c @@ -1389,6 +1389,56 @@ static void ctdb_set_my_pnn(struct ctdb_context *ctdb) D_NOTICE("PNN is %u\n", ctdb->pnn); } +static void stdin_handler(struct tevent_context *ev, + struct tevent_fd *fde, + uint16_t flags, + void *private_data) +{ + struct ctdb_context *ctdb = talloc_get_type_abort( + private_data, struct ctdb_context); + ssize_t nread; + char c; + + nread = read(STDIN_FILENO, &c, 1); + if (nread != 1) { + D_ERR("stdin closed, exiting\n"); + talloc_free(fde); + ctdb_shutdown_sequence(ctdb, EPIPE); + } +} + +static int setup_stdin_handler(struct ctdb_context *ctdb) +{ + struct tevent_fd *fde; + struct stat st; + int ret; + + ret = fstat(STDIN_FILENO, &st); + if (ret != 0) { + /* Problem with stdin, ignore... */ + DBG_INFO("Can't fstat() stdin\n"); + return 0; + } + + if (!S_ISFIFO(st.st_mode)) { + DBG_INFO("Not a pipe...\n"); + return 0; + } + + fde = tevent_add_fd(ctdb->ev, + ctdb, + STDIN_FILENO, + TEVENT_FD_READ, + stdin_handler, + ctdb); + if (fde == NULL) { + return ENOMEM; + } + + DBG_INFO("Set up stdin handler\n"); + return 0; +} + /* start the protocol going as a daemon */ @@ -1448,6 +1498,15 @@ int ctdb_start_daemon(struct ctdb_context *ctdb, bool do_fork) ctdb_set_child_logging(ctdb); } + /* Exit if stdin is closed */ + if (!do_fork) { + ret = setup_stdin_handler(ctdb); + if (ret != 0) { + DBG_ERR("Failed to setup stdin handler\n"); + exit(1); + } + } + TALLOC_FREE(ctdb->srv); if (srvid_init(ctdb, &ctdb->srv) != 0) { DEBUG(DEBUG_CRIT,("Failed to setup message srvid context\n")); diff --git a/ctdb/server/ctdb_monitor.c b/ctdb/server/ctdb_monitor.c index cfa3a6a1bfa..5c694bde969 100644 --- a/ctdb/server/ctdb_monitor.c +++ b/ctdb/server/ctdb_monitor.c @@ -416,8 +416,12 @@ static void ctdb_check_health(struct tevent_context *ev, */ void ctdb_stop_monitoring(struct ctdb_context *ctdb) { - talloc_free(ctdb->monitor->monitor_context); - ctdb->monitor->monitor_context = NULL; + if (ctdb->monitor == NULL) { + D_NOTICE("Monitoring not yet initialised\n"); + return; + } + + TALLOC_FREE(ctdb->monitor->monitor_context); ctdb->monitor->next_interval = 5; DEBUG(DEBUG_NOTICE,("Monitoring has been stopped\n")); diff --git a/ctdb/tests/local_daemons.sh b/ctdb/tests/local_daemons.sh index e45a79c3e82..4a653224b23 100755 --- a/ctdb/tests/local_daemons.sh +++ b/ctdb/tests/local_daemons.sh @@ -307,7 +307,7 @@ local_daemons_ssh () if $_close_stdin ; then exec sh -c "$*" <&- else - exec sh -c "$*" + exec sh -m -c "$*" fi } @@ -354,7 +354,7 @@ local_daemons_start () onnode_common - onnode "$_nodes" "${VALGRIND:-} ctdbd &" + onnode -i "$_nodes" "${VALGRIND:-} ctdbd &" } local_daemons_stop () -- Samba Shared Repository