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>
Thu, 17 Nov 2011 02:34:29 +0000 (13:34 +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 f4fbaf4b52846bd08a2b81628780c787535fafb1..e897452cd6ca08edd4ff54c305eb0dde0d7cb8d7 100644 (file)
@@ -124,6 +124,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 eb5c2da2fe7f0197f7bec7560c861c25c0f27258..17cc3d421c8a4a111b53170a7f6ff6553f4ff770 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;