The branch, master has been updated
       via  d04bfc6 ctdb-daemon: Improve error handling for running event 
scripts
      from  04a9a1a lib: Slightly simplify strupper_m

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


- Log -----------------------------------------------------------------
commit d04bfc6ec6ad7a4749ebfee2284253c4a91a81aa
Author: Amitay Isaacs <[email protected]>
Date:   Thu Nov 13 11:02:26 2014 +1100

    ctdb-daemon: Improve error handling for running event scripts
    
    Signed-off-by: Amitay Isaacs <[email protected]>
    Reviewed-by: Martin Schwenke <[email protected]>
    
    Autobuild-User(master): Martin Schwenke <[email protected]>
    Autobuild-Date(master): Fri Nov 14 03:06:12 CET 2014 on sn-devel-104

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

Summary of changes:
 ctdb/server/ctdb_event_helper.c | 48 ++++++++++++++++++++++++++---------------
 ctdb/server/eventscript.c       | 10 +++++++--
 2 files changed, 39 insertions(+), 19 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/server/ctdb_event_helper.c b/ctdb/server/ctdb_event_helper.c
index 9ff763c..f14e336 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,47 @@ 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);
-               if (output == ENOENT || output == ENOEXEC) {
-                       output = -output;
-               }
+               output = -WEXITSTATUS(status);
+               sys_write(write_fd, &output, sizeof(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(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 28bbb54..eaa6a20 100644
--- a/ctdb/server/eventscript.c
+++ b/ctdb/server/eventscript.c
@@ -367,6 +367,8 @@ static void ctdb_event_script_handler(struct event_context 
*ev, struct fd_event
        r = sys_read(state->fd[0], &current->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;
        }
@@ -384,8 +386,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);


-- 
Samba Shared Repository

Reply via email to