Eventscripts: Add special -ECANCELED status for monitor events that are cancelled
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Thu, 17 Nov 2011 02:34:29 +0000 (13:34 +1100)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Fri, 18 Nov 2011 01:22:22 +0000 (12:22 +1100)
When a monitor event is canceled by a higher priority script, make sure we return
status -ECANCELED to the callback in ctdB_monitor.c
Also treat -ECANCELED as a simple "try monitor event again" and skip modifying any HEALTHY/UNHEALTHY flags when this happens

server/ctdb_monitor.c
server/eventscript.c

index f0879d0a77f381b578fee985adc61d0a430d5b21..7258d3957ab5f7985a0dc570c1cb7a30a54d2c52 100644 (file)
@@ -125,6 +125,11 @@ static void ctdb_health_callback(struct ctdb_context *ctdb, int status, void *p)
        rddata.dptr = (uint8_t *)&rd;
        rddata.dsize = sizeof(rd);
 
+       if (status == -ECANCELED) {
+               DEBUG(DEBUG_ERR,("Monitoring event was cancelled\n"));
+               goto after_change_status;
+       }
+
        if (status == -ETIME) {
                ctdb->event_script_timeouts++;
 
index c01fbad69ed8129efd53937f224ca590fd5fb4f5..722ebec6a9e475c9cecc9871da20ad27d39bb5c1 100644 (file)
@@ -58,7 +58,7 @@ struct ctdb_event_script_state {
        enum ctdb_eventscript_call call;
        const char *options;
        struct timeval timeout;
-
+       
        unsigned int current;
        struct ctdb_scripts_wire *scripts;
 };
@@ -742,6 +742,14 @@ static int ctdb_event_script_callback_v(struct ctdb_context *ctdb,
 
        /* Kill off any running monitor events to run this event. */
        if (ctdb->current_monitor) {
+               struct ctdb_event_script_state *ms = talloc_get_type(ctdb->current_monitor, struct ctdb_event_script_state);
+
+               /* cancel it */
+               if (ms->callback != NULL) {
+                       ms->callback->fn(ctdb, -ECANCELED, ms->callback->private_data);
+                       talloc_free(ms->callback);
+               }
+
                /* Discard script status so we don't save to last_status */
                talloc_free(ctdb->current_monitor->scripts);
                ctdb->current_monitor->scripts = NULL;