Blob Blame History Raw
From e57cbc5b85d3459d7a6f004f6252ffd1e60a51d5 Mon Sep 17 00:00:00 2001
From: Ken Gaillot <kgaillot@redhat.com>
Date: Tue, 22 Aug 2017 16:40:15 -0500
Subject: [PATCH] Refactor: pengine: functionize common ordering tasks

Enhances readability

The only functional difference is that demotes of resources on guest nodes will
now get pe_order_runnable_left when ordered relative to the guest node
connection start (and the container is not failed). It was already used in
comparable situations, and makes sense.
---
 pengine/allocate.c | 111 ++++++++++++++++++++++++++++++-----------------------
 1 file changed, 63 insertions(+), 48 deletions(-)

diff --git a/pengine/allocate.c b/pengine/allocate.c
index 3c3df27..a540f9f 100644
--- a/pengine/allocate.c
+++ b/pengine/allocate.c
@@ -1206,6 +1206,37 @@ allocate_resources(pe_working_set_t * data_set)
     }
 }
 
+/* We always use pe_order_preserve with these convenience functions to exempt
+ * internally generated constraints from the prohibition of user constraints
+ * involving remote connection resources.
+ *
+ * The start ordering additionally uses pe_order_runnable_left so that the
+ * specified action is not runnable if the start is not runnable.
+ */
+
+static inline void
+order_start_then_action(resource_t *lh_rsc, action_t *rh_action,
+                        enum pe_ordering extra, pe_working_set_t *data_set)
+{
+    if (lh_rsc && rh_action && data_set) {
+        custom_action_order(lh_rsc, start_key(lh_rsc), NULL,
+                            rh_action->rsc, NULL, rh_action,
+                            pe_order_preserve | pe_order_runnable_left | extra,
+                            data_set);
+    }
+}
+
+static inline void
+order_action_then_stop(action_t *lh_action, resource_t *rh_rsc,
+                       enum pe_ordering extra, pe_working_set_t *data_set)
+{
+    if (lh_action && rh_rsc && data_set) {
+        custom_action_order(lh_action->rsc, NULL, lh_action,
+                            rh_rsc, stop_key(rh_rsc), NULL,
+                            pe_order_preserve | extra, data_set);
+    }
+}
+
 static void
 cleanup_orphans(resource_t * rsc, pe_working_set_t * data_set)
 {
@@ -1235,9 +1266,12 @@ cleanup_orphans(resource_t * rsc, pe_working_set_t * data_set)
                         CRM_XS " %s",
                         rsc->id, node->details->uname, clear_op->uuid);
 
-            custom_action_order(rsc, NULL, clear_op,
-                            rsc, generate_op_key(rsc->id, RSC_STOP, 0), NULL,
-                            pe_order_optional, data_set);
+            /* We can't use order_action_then_stop() here because its
+             * pe_order_preserve breaks things
+             */
+            custom_action_order(clear_op->rsc, NULL, clear_op,
+                                rsc, stop_key(rsc), NULL,
+                                pe_order_optional, data_set);
         }
     }
 }
@@ -1817,14 +1851,12 @@ apply_container_ordering(action_t *action, pe_working_set_t *data_set)
         case start_rsc:
         case action_promote:
             /* Force resource recovery if the container is recovered */
-            custom_action_order(container, generate_op_key(container->id, RSC_START, 0), NULL,
-                                action->rsc, NULL, action,
-                                pe_order_preserve | pe_order_implies_then | pe_order_runnable_left, data_set);
+            order_start_then_action(container, action, pe_order_implies_then,
+                                    data_set);
 
             /* Wait for the connection resource to be up too */
-            custom_action_order(remote_rsc, generate_op_key(remote_rsc->id, RSC_START, 0), NULL,
-                                action->rsc, NULL, action,
-                                pe_order_preserve | pe_order_runnable_left, data_set);
+            order_start_then_action(remote_rsc, action, pe_order_none,
+                                    data_set);
             break;
         case stop_rsc:
             if(is_set(container->flags, pe_rsc_failed)) {
@@ -1836,9 +1868,8 @@ apply_container_ordering(action_t *action, pe_working_set_t *data_set)
                  */
             } else {
                 /* Otherwise, ensure the operation happens before the connection is brought down */
-                custom_action_order(action->rsc, NULL, action,
-                                    remote_rsc, generate_op_key(remote_rsc->id, RSC_STOP, 0), NULL,
-                                    pe_order_preserve, data_set);
+                order_action_then_stop(action, remote_rsc, pe_order_none,
+                                       data_set);
             }
             break;
         case action_demote:
@@ -1854,9 +1885,8 @@ apply_container_ordering(action_t *action, pe_working_set_t *data_set)
 
             } else {
                 /* Otherwise, ensure the operation happens before the connection is brought down */
-                custom_action_order(action->rsc, NULL, action,
-                                    remote_rsc, generate_op_key(remote_rsc->id, RSC_STOP, 0), NULL,
-                                    pe_order_preserve, data_set);
+                order_action_then_stop(action, remote_rsc, pe_order_none,
+                                       data_set);
             }
             break;
         default:
@@ -1867,14 +1897,12 @@ apply_container_ordering(action_t *action, pe_working_set_t *data_set)
                  * the connection was re-established
                  */
                 if(task != no_action) {
-                    custom_action_order(remote_rsc, generate_op_key(remote_rsc->id, RSC_START, 0), NULL,
-                                        action->rsc, NULL, action,
-                                        pe_order_preserve | pe_order_runnable_left | pe_order_implies_then, data_set);
+                    order_start_then_action(remote_rsc, action,
+                                            pe_order_implies_then, data_set);
                 }
             } else {
-                custom_action_order(remote_rsc, generate_op_key(remote_rsc->id, RSC_START, 0), NULL,
-                                    action->rsc, NULL, action,
-                                    pe_order_preserve | pe_order_runnable_left, data_set);
+                order_start_then_action(remote_rsc, action, pe_order_none,
+                                        data_set);
             }
             break;
     }
@@ -1988,11 +2016,7 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set)
     switch (task) {
         case start_rsc:
         case action_promote:
-            /* This as an internally generated constraint exempt from
-             * user constraint prohibitions, and this action isn't runnable
-             * if the connection start isn't runnable.
-             */
-            order_opts = pe_order_preserve | pe_order_runnable_left;
+            order_opts = pe_order_none;
 
             if (state == remote_state_failed) {
                 /* Force recovery, by making this action required */
@@ -2000,10 +2024,7 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set)
             }
 
             /* Ensure connection is up before running this action */
-            custom_action_order(remote_rsc,
-                                generate_op_key(remote_rsc->id, RSC_START, 0),
-                                NULL, action->rsc, NULL, action, order_opts,
-                                data_set);
+            order_start_then_action(remote_rsc, action, order_opts, data_set);
             break;
 
         case stop_rsc:
@@ -2012,9 +2033,8 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set)
              */
             if(state == remote_state_resting) {
                 /* Wait for the connection resource to be up and assume everything is as we left it */
-                custom_action_order(remote_rsc, generate_op_key(remote_rsc->id, RSC_START, 0), NULL,
-                                    action->rsc, NULL, action,
-                                    pe_order_preserve | pe_order_runnable_left, data_set);
+                order_start_then_action(remote_rsc, action, pe_order_none,
+                                        data_set);
 
             } else {
                 if(state == remote_state_failed) {
@@ -2026,9 +2046,8 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set)
                     pe_fence_node(data_set, action->node, "resources are active and the connection is unrecoverable");
                 }
 
-                custom_action_order(action->rsc, NULL, action,
-                                    remote_rsc, generate_op_key(remote_rsc->id, RSC_STOP, 0), NULL,
-                                    pe_order_preserve | pe_order_implies_first, data_set);
+                order_action_then_stop(action, remote_rsc,
+                                       pe_order_implies_first, data_set);
             }
             break;
 
@@ -2038,9 +2057,8 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set)
              * blocked because the connection start would not be allowed.
              */
             if(state == remote_state_resting || state == remote_state_unknown) {
-                custom_action_order(remote_rsc, generate_op_key(remote_rsc->id, RSC_START, 0), NULL,
-                                    action->rsc, NULL, action,
-                                    pe_order_preserve, data_set);
+                order_start_then_action(remote_rsc, action, pe_order_none,
+                                        data_set);
             } /* Otherwise we can rely on the stop ordering */
             break;
 
@@ -2051,9 +2069,8 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set)
                  * recurring monitors to be restarted, even if just
                  * the connection was re-established
                  */
-                custom_action_order(remote_rsc, generate_op_key(remote_rsc->id, RSC_START, 0), NULL,
-                                    action->rsc, NULL, action,
-                                    pe_order_preserve | pe_order_runnable_left | pe_order_implies_then, data_set);
+                order_start_then_action(remote_rsc, action,
+                                        pe_order_implies_then, data_set);
 
             } else {
                 if(task == monitor_rsc && state == remote_state_failed) {
@@ -2073,14 +2090,12 @@ apply_remote_ordering(action_t *action, pe_working_set_t *data_set)
                      * stopped _before_ we let the connection get
                      * closed
                      */
-                    custom_action_order(action->rsc, NULL, action,
-                                        remote_rsc, generate_op_key(remote_rsc->id, RSC_STOP, 0), NULL,
-                                        pe_order_preserve | pe_order_runnable_left, data_set);
+                    order_action_then_stop(action, remote_rsc,
+                                           pe_order_runnable_left, data_set);
 
                 } else {
-                    custom_action_order(remote_rsc, generate_op_key(remote_rsc->id, RSC_START, 0), NULL,
-                                        action->rsc, NULL, action,
-                                        pe_order_preserve | pe_order_runnable_left, data_set);
+                    order_start_then_action(remote_rsc, action, pe_order_none,
+                                            data_set);
                 }
             }
             break;
-- 
1.8.3.1