Blob Blame History Raw
From 191c5be52b1633a8642d28868505a9879b5d5622 Mon Sep 17 00:00:00 2001
From: Andrew Beekhof <andrew@beekhof.net>
Date: Tue, 3 Apr 2018 13:56:22 +1000
Subject: [PATCH] Fix: rhbz#1545449 - Do not perform notifications for events
 we know wont be executed

---
 pengine/notif.c | 40 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 37 insertions(+), 3 deletions(-)

diff --git a/pengine/notif.c b/pengine/notif.c
index 39d8c72..7ce8f57 100644
--- a/pengine/notif.c
+++ b/pengine/notif.c
@@ -498,12 +498,18 @@ collect_notification_data(resource_t * rsc, gboolean state, gboolean activity,
             action_t *op = (action_t *) gIter->data;
 
             if (is_set(op->flags, pe_action_optional) == FALSE && op->node != NULL) {
+                task = text2task(op->task);
+
+                if(task == stop_rsc && op->node->details->unclean) {
+                    /* Create one anyway,, some additional noise if op->node cannot be fenced */
+                } else if(is_not_set(op->flags, pe_action_runnable)) {
+                    continue;
+                }
 
                 entry = calloc(1, sizeof(notify_entry_t));
                 entry->node = op->node;
                 entry->rsc = rsc;
 
-                task = text2task(op->task);
                 switch (task) {
                     case start_rsc:
                         n_data->start = g_list_prepend(n_data->start, entry);
@@ -656,8 +662,7 @@ create_notifications(resource_t * rsc, notify_data_t * n_data, pe_working_set_t
 
     /* Copy notification details into standard ops */
 
-    gIter = rsc->actions;
-    for (; gIter != NULL; gIter = gIter->next) {
+    for (gIter = rsc->actions; gIter != NULL; gIter = gIter->next) {
         action_t *op = (action_t *) gIter->data;
 
         if (is_set(op->flags, pe_action_optional) == FALSE && op->node != NULL) {
@@ -676,6 +681,35 @@ create_notifications(resource_t * rsc, notify_data_t * n_data, pe_working_set_t
         }
     }
 
+    switch (task) {
+        case start_rsc:
+            if(g_list_length(n_data->start) == 0) {
+                pe_rsc_trace(rsc, "Skipping empty notification for: %s.%s (%s->%s)",
+                             n_data->action, rsc->id, role2text(rsc->role), role2text(rsc->next_role));
+                return;
+            }
+            break;
+        case action_promote:
+            if(g_list_length(n_data->promote) == 0) {
+                pe_rsc_trace(rsc, "Skipping empty notification for: %s.%s (%s->%s)",
+                             n_data->action, rsc->id, role2text(rsc->role), role2text(rsc->next_role));
+                return;
+            }
+            break;
+        case action_demote:
+            if(g_list_length(n_data->demote) == 0) {
+                pe_rsc_trace(rsc, "Skipping empty notification for: %s.%s (%s->%s)",
+                             n_data->action, rsc->id, role2text(rsc->role), role2text(rsc->next_role));
+                return;
+            }
+            break;
+        default:
+            /* We cannot do the same for stop_rsc/n_data->stop at it
+             * might be implied by fencing
+             */
+            break;
+    }
+
     pe_rsc_trace(rsc, "Creating notifications for: %s.%s (%s->%s)",
                  n_data->action, rsc->id, role2text(rsc->role), role2text(rsc->next_role));
 
-- 
1.8.3.1