The branch, v4-2-test has been updated via 75e2768 ctdb-daemon: Correctly process the exit code from failed eventscripts via bbaef4d ctdb-daemon: Improve error handling for running event scripts via 0d36fba ctdb-tool: Correctly print timed out event scripts output via 1f7e86d s3:lib: fix some corner cases of open_socket_out_cleanup() via 7ad714e lib: Fix rundown of open_socket_out() from e9d22f1 s4:torture:vfs_fruit: add a test for stream names
https://git.samba.org/?p=samba.git;a=shortlog;h=v4-2-test - Log ----------------------------------------------------------------- commit 75e2768a08f4d53644d1f1f6a1a348f811440358 Author: Amitay Isaacs <ami...@gmail.com> Date: Tue Jul 21 16:37:04 2015 +1000 ctdb-daemon: Correctly process the exit code from failed eventscripts BUG: https://bugzilla.samba.org/show_bug.cgi?id=11431 Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> Autobuild-User(master): Martin Schwenke <mart...@samba.org> Autobuild-Date(master): Wed Jul 22 15:03:53 CEST 2015 on sn-devel-104 (cherry picked from commit 00ec3c477eba50206801b451ae4eb64c12aba5db) Autobuild-User(v4-2-test): Stefan Metzmacher <me...@samba.org> Autobuild-Date(v4-2-test): Tue Aug 18 15:55:44 CEST 2015 on sn-devel-104 commit bbaef4d48ed9f835a00cdff57b5282835af45f3d Author: Amitay Isaacs <ami...@gmail.com> Date: Thu Nov 13 11:02:26 2014 +1100 ctdb-daemon: Improve error handling for running event scripts BUG: https://bugzilla.samba.org/show_bug.cgi?id=11431 Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> Autobuild-User(master): Martin Schwenke <mart...@samba.org> Autobuild-Date(master): Fri Nov 14 03:06:12 CET 2014 on sn-devel-104 (cherry picked from commit d04bfc6ec6ad7a4749ebfee2284253c4a91a81aa) commit 0d36fbabdc2457cdea80e18ca224232317142b06 Author: Amitay Isaacs <ami...@gmail.com> Date: Mon Jul 20 16:37:58 2015 +1000 ctdb-tool: Correctly print timed out event scripts output The timed out error is ignored for certain events (start_recovery, recoverd, takeip, releaseip). If these events time out, then the debug hung script outputs the following: 3 scripts were executed last releaseip cycle 00.ctdb Status:OK Duration:4.381 Thu Jul 16 23:45:24 2015 01.reclock Status:OK Duration:13.422 Thu Jul 16 23:45:28 2015 10.external Status:DISABLED 10.interface Status:OK Duration:-1437083142.208 Thu Jul 16 23:45:42 2015 The endtime for timed out scripts is not set. Since the status is not returned as -ETIME for some events, ctdb scriptstatus prints -ve duration. BUG: https://bugzilla.samba.org/show_bug.cgi?id=11431 Signed-off-by: Amitay Isaacs <ami...@gmail.com> Reviewed-by: Martin Schwenke <mar...@meltin.net> (cherry picked from commit 71b89b2b7a9768de437347e6678370b2682da892) commit 1f7e86d813293a36e1f84bc4983c8cbb528cfc71 Author: Stefan Metzmacher <me...@samba.org> Date: Fri Aug 14 12:54:00 2015 +0200 s3:lib: fix some corner cases of open_socket_out_cleanup() In case of timeouts we retry the async_connect_send() and forgot to remember it, this results in an abort() in async_connect_cleanup() as the fd is already closed when calling fcntl(F_SETFL). BUG: https://bugzilla.samba.org/show_bug.cgi?id=11316 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Volker Lendecke <v...@samba.org> (cherry picked from commit ce3c77fb45ccf4d45a0fa655325e30e748d89245) commit 7ad714e2eb4758edbbdd774db2af3287c41c6eba Author: Volker Lendecke <v...@samba.org> Date: Mon Jun 29 19:00:55 2015 +0200 lib: Fix rundown of open_socket_out() Under valgrind I've seen the abort in async_connect_cleanup kick in. Yes, it's good that we check these return codes! Bug: https://bugzilla.samba.org/show_bug.cgi?id=11316 Signed-off-by: Volker Lendecke <v...@samba.org> Reviewed-by: "Stefan (metze) Metzmacher" <me...@samba.org> Autobuild-User(master): Volker Lendecke <v...@samba.org> Autobuild-Date(master): Tue Jun 30 20:24:37 CEST 2015 on sn-devel-104 (cherry picked from commit 6fc65aaf956f35e2068e2a6f8521af2f2351d31e) ----------------------------------------------------------------------- Summary of changes: ctdb/server/ctdb_event_helper.c | 44 ++++++++++++++++++++++++++----------- ctdb/server/eventscript.c | 10 +++++++-- ctdb/tools/ctdb.c | 8 +++++++ source3/lib/util_sock.c | 48 ++++++++++++++++++++++++++++++----------- 4 files changed, 83 insertions(+), 27 deletions(-) Changeset truncated at 500 lines: diff --git a/ctdb/server/ctdb_event_helper.c b/ctdb/server/ctdb_event_helper.c index 9ff763c..a1b5318 100644 --- a/ctdb/server/ctdb_event_helper.c +++ b/ctdb/server/ctdb_event_helper.c @@ -67,7 +67,7 @@ int main(int argc, char *argv[]) { int log_fd, write_fd; pid_t pid; - int status, output; + int status, output, ret; progname = argv[0]; @@ -99,33 +99,51 @@ int main(int argc, char *argv[]) pid = fork(); if (pid < 0) { + int save_errno = errno; fprintf(stderr, "Failed to fork - %s\n", strerror(errno)); - exit(errno); + sys_write(write_fd, &save_errno, sizeof(save_errno)); + exit(1); } if (pid == 0) { - int save_errno; - - execv(argv[3], &argv[3]); - if (errno == EACCES) { - save_errno = check_executable(argv[3]); - } else { - save_errno = errno; + ret = check_executable(argv[3]); + if (ret != 0) { + _exit(ret); + } + ret = execv(argv[3], &argv[3]); + if (ret != 0) { + int save_errno = errno; fprintf(stderr, "Error executing '%s' - %s\n", - argv[3], strerror(errno)); + argv[3], strerror(save_errno)); } - _exit(save_errno); + /* This should never happen */ + _exit(ENOEXEC); } - waitpid(pid, &status, 0); + ret = waitpid(pid, &status, 0); + if (ret == -1) { + output = -errno; + fprintf(stderr, "waitpid() failed - %s\n", strerror(errno)); + sys_write(write_fd, &output, sizeof(output)); + exit(1); + } if (WIFEXITED(status)) { output = WEXITSTATUS(status); + /* Only errors should be returned as -ve values */ if (output == ENOENT || output == ENOEXEC) { output = -output; } sys_write(write_fd, &output, sizeof(output)); - exit(output); + exit(0); + } + if (WIFSIGNALED(status)) { + output = -EINTR; + fprintf(stderr, "Process terminated with signal - %d\n", + WTERMSIG(status)); + sys_write(write_fd, &output, sizeof(output)); + exit(0); } + fprintf(stderr, "waitpid() status=%d\n", status); exit(1); } diff --git a/ctdb/server/eventscript.c b/ctdb/server/eventscript.c index e3131b3..1f16580 100644 --- a/ctdb/server/eventscript.c +++ b/ctdb/server/eventscript.c @@ -379,6 +379,8 @@ static void ctdb_event_script_handler(struct event_context *ev, struct fd_event r = sys_read(state->fd[0], ¤t->status, sizeof(current->status)); if (r < 0) { current->status = -errno; + } else if (r == 0) { + current->status = -EINTR; } else if (r != sizeof(current->status)) { current->status = -EIO; } @@ -396,8 +398,12 @@ static void ctdb_event_script_handler(struct event_context *ev, struct fd_event /* Aborted or finished all scripts? We're done. */ if (status != 0 || state->current+1 == state->scripts->num_scripts) { - DEBUG(DEBUG_INFO,(__location__ " Eventscript %s %s finished with state %d\n", - ctdb_eventscript_call_names[state->call], state->options, status)); + if (status != 0) { + DEBUG(DEBUG_INFO, + ("Eventscript %s %s finished with state %d\n", + ctdb_eventscript_call_names[state->call], + state->options, status)); + } ctdb->event_script_timeouts = 0; talloc_free(state); diff --git a/ctdb/tools/ctdb.c b/ctdb/tools/ctdb.c index c386d35..6911dff 100644 --- a/ctdb/tools/ctdb.c +++ b/ctdb/tools/ctdb.c @@ -1453,6 +1453,14 @@ static int control_one_scriptstatus(struct ctdb_context *ctdb, for (i=0; i<script_status->num_scripts; i++) { const char *status = NULL; + /* The ETIME status is ignored for certain events. + * In that case the status is 0, but endtime is not set. + */ + if (script_status->scripts[i].status == 0 && + timeval_is_zero(&script_status->scripts[i].finished)) { + script_status->scripts[i].status = -ETIME; + } + switch (script_status->scripts[i].status) { case -ETIME: status = "TIMEDOUT"; diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c index d865ffb..6cef378 100644 --- a/source3/lib/util_sock.c +++ b/source3/lib/util_sock.c @@ -539,16 +539,34 @@ struct open_socket_out_state { socklen_t salen; uint16_t port; int wait_usec; + struct tevent_req *connect_subreq; }; static void open_socket_out_connected(struct tevent_req *subreq); -static int open_socket_out_state_destructor(struct open_socket_out_state *s) +static void open_socket_out_cleanup(struct tevent_req *req, + enum tevent_req_state req_state) { - if (s->fd != -1) { - close(s->fd); + struct open_socket_out_state *state = + tevent_req_data(req, struct open_socket_out_state); + + /* + * Make sure that the async_connect_send subreq has a chance to reset + * fcntl before the socket goes away. + */ + TALLOC_FREE(state->connect_subreq); + + if (req_state == TEVENT_REQ_DONE) { + /* + * we keep the socket open for the caller to use + */ + return; + } + + if (state->fd != -1) { + close(state->fd); + state->fd = -1; } - return 0; } /**************************************************************************** @@ -562,7 +580,7 @@ struct tevent_req *open_socket_out_send(TALLOC_CTX *mem_ctx, int timeout) { char addr[INET6_ADDRSTRLEN]; - struct tevent_req *result, *subreq; + struct tevent_req *result; struct open_socket_out_state *state; NTSTATUS status; @@ -582,7 +600,8 @@ struct tevent_req *open_socket_out_send(TALLOC_CTX *mem_ctx, status = map_nt_error_from_unix(errno); goto post_status; } - talloc_set_destructor(state, open_socket_out_state_destructor); + + tevent_req_set_cleanup_fn(result, open_socket_out_cleanup); if (!tevent_req_set_endtime( result, ev, timeval_current_ofs_msec(timeout))) { @@ -616,16 +635,17 @@ struct tevent_req *open_socket_out_send(TALLOC_CTX *mem_ctx, print_sockaddr(addr, sizeof(addr), &state->ss); DEBUG(3,("Connecting to %s at port %u\n", addr, (unsigned int)port)); - subreq = async_connect_send(state, state->ev, state->fd, - (struct sockaddr *)&state->ss, - state->salen, NULL, NULL, NULL); - if ((subreq == NULL) + state->connect_subreq = async_connect_send( + state, state->ev, state->fd, (struct sockaddr *)&state->ss, + state->salen, NULL, NULL, NULL); + if ((state->connect_subreq == NULL) || !tevent_req_set_endtime( - subreq, state->ev, + state->connect_subreq, state->ev, timeval_current_ofs(0, state->wait_usec))) { goto fail; } - tevent_req_set_callback(subreq, open_socket_out_connected, result); + tevent_req_set_callback(state->connect_subreq, + open_socket_out_connected, result); return result; post_status: @@ -647,6 +667,7 @@ static void open_socket_out_connected(struct tevent_req *subreq) ret = async_connect_recv(subreq, &sys_errno); TALLOC_FREE(subreq); + state->connect_subreq = NULL; if (ret == 0) { tevent_req_done(req); return; @@ -680,6 +701,7 @@ static void open_socket_out_connected(struct tevent_req *subreq) tevent_req_nterror(req, NT_STATUS_NO_MEMORY); return; } + state->connect_subreq = subreq; tevent_req_set_callback(subreq, open_socket_out_connected, req); return; } @@ -702,10 +724,12 @@ NTSTATUS open_socket_out_recv(struct tevent_req *req, int *pfd) NTSTATUS status; if (tevent_req_is_nterror(req, &status)) { + tevent_req_received(req); return status; } *pfd = state->fd; state->fd = -1; + tevent_req_received(req); return NT_STATUS_OK; } -- Samba Shared Repository