ctdb-common: Return script_list for zero scripts
authorAmitay Isaacs <amitay@gmail.com>
Thu, 10 May 2018 02:43:24 +0000 (12:43 +1000)
committerMartin Schwenke <martins@samba.org>
Tue, 5 Jun 2018 20:34:19 +0000 (22:34 +0200)
When an event script directory is empty, do not return script_list as
NULL.  Instead return empty script_list with zero scripts.

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/common/run_event.c
ctdb/tests/eventd/eventd_001.sh
ctdb/tests/eventd/eventd_002.sh

index aba9014bbaf80220109251f92d2fb08526e4087c..9487d2d4cf72d85a98e1924dff17e825bbf83350 100644 (file)
@@ -659,6 +659,11 @@ struct tevent_req *run_event_send(TALLOC_CTX *mem_ctx,
        state->timeout = timeout;
        state->cancelled = false;
 
+       state->script_list = talloc_zero(state, struct run_event_script_list);
+       if (tevent_req_nomem(state->script_list, req)) {
+               return tevent_req_post(req, ev);
+       }
+
        /*
         * If monitor event is running,
         *   cancel the running monitor event and run new event
@@ -673,11 +678,6 @@ struct tevent_req *run_event_send(TALLOC_CTX *mem_ctx,
                if (monitor_running) {
                        run_event_cancel(current_req);
                } else if (strcmp(event_str, "monitor") == 0) {
-                       state->script_list = talloc_zero(
-                               state, struct run_event_script_list);
-                       if (tevent_req_nomem(state->script_list, req)) {
-                               return tevent_req_post(req, ev);
-                       }
                        state->script_list->summary = -ECANCELED;
                        tevent_req_done(req);
                        return tevent_req_post(req, ev);
@@ -714,14 +714,16 @@ static void run_event_trigger(struct tevent_req *req, void *private_data)
        struct tevent_req *subreq;
        struct run_event_state *state = tevent_req_data(
                req, struct run_event_state);
+       struct run_event_script_list *script_list;
        int ret;
        bool is_monitor = false;
 
        D_DEBUG("Running event %s with args \"%s\"\n", state->event_str,
                state->arg_str == NULL ? "(null)" : state->arg_str);
 
-       ret = get_script_list(state, run_event_script_dir(state->run_ctx),
-                             &state->script_list);
+       ret = get_script_list(state,
+                             run_event_script_dir(state->run_ctx),
+                             &script_list);
        if (ret != 0) {
                D_ERR("get_script_list() failed, ret=%d\n", ret);
                tevent_req_error(req, ret);
@@ -729,12 +731,14 @@ static void run_event_trigger(struct tevent_req *req, void *private_data)
        }
 
        /* No scripts */
-       if (state->script_list == NULL ||
-           state->script_list->num_scripts == 0) {
+       if (script_list == NULL || script_list->num_scripts == 0) {
                tevent_req_done(req);
                return;
        }
 
+       talloc_free(state->script_list);
+       state->script_list = script_list;
+
        ret = script_args(state, state->event_str, state->arg_str,
                          &state->argv);
        if (ret != 0) {
index 593f77f3c54745919c7178626bdeba435c45440b..bd8cc17ae1a8dc3756bf6a37bc9f0b5b12cd81fa 100755 (executable)
@@ -16,12 +16,10 @@ EOF
 simple_test run monitor 30
 
 required_result 0 <<EOF
-Event monitor has never run
 EOF
 simple_test status monitor
 
 required_result 0 <<EOF
-Event monitor has never passed
 EOF
 simple_test status monitor lastpass
 
index ee0f8f36689c0134ec94d739611d4094ce65bfee..1e86bdfda0cde0b8064eb94ef7e875679b9bce1f 100755 (executable)
@@ -39,12 +39,10 @@ EOF
 simple_test run monitor 30
 
 required_result 0 <<EOF
-Event monitor has never run
 EOF
 simple_test status monitor lastrun
 
 required_result 0 <<EOF
-Event monitor has never passed
 EOF
 simple_test status monitor lastpass