Blame SOURCES/068-bundle-weight-fix.patch

60de42
From 07fc025fb0998ed7f3b0bbfb10a6740e420cae31 Mon Sep 17 00:00:00 2001
60de42
From: Ken Gaillot <kgaillot@redhat.com>
60de42
Date: Tue, 20 Jun 2017 15:47:38 -0500
60de42
Subject: [PATCH 1/2] Fix: libpe_status: disallow resources on bundle nodes
60de42
60de42
---
60de42
 lib/pengine/container.c | 21 +++++++++++++++++++++
60de42
 1 file changed, 21 insertions(+)
60de42
60de42
diff --git a/lib/pengine/container.c b/lib/pengine/container.c
60de42
index 836b482..c37f421 100644
60de42
--- a/lib/pengine/container.c
60de42
+++ b/lib/pengine/container.c
60de42
@@ -342,6 +342,7 @@ create_remote_resource(
60de42
 {
60de42
     if (tuple->child && valid_network(data)) {
60de42
         GHashTableIter gIter;
60de42
+        GListPtr rsc_iter = NULL;
60de42
         node_t *node = NULL;
60de42
         xmlNode *xml_obj = NULL;
60de42
         xmlNode *xml_remote = NULL;
60de42
@@ -402,6 +403,26 @@ create_remote_resource(
60de42
             node->weight = -INFINITY;
60de42
         }
60de42
 
60de42
+        /* unpack_remote_nodes() ensures that each remote node and guest node
60de42
+         * has a node_t entry. Ideally, it would do the same for bundle nodes.
60de42
+         * Unfortunately, a bundle has to be mostly unpacked before it's obvious
60de42
+         * what nodes will be needed, so we do it just above.
60de42
+         *
60de42
+         * Worse, that means that the node may have been utilized while
60de42
+         * unpacking other resources, without our weight correction. The most
60de42
+         * likely place for this to happen is when common_unpack() calls
60de42
+         * resource_location() to set a default score in symmetric clusters.
60de42
+         * This adds a node *copy* to each resource's allowed nodes, and these
60de42
+         * copies will have the wrong weight.
60de42
+         *
60de42
+         * As a hacky workaround, clear those copies here.
60de42
+         */
60de42
+        for (rsc_iter = data_set->resources; rsc_iter; rsc_iter = rsc_iter->next) {
60de42
+            resource_t *rsc = (resource_t *) rsc_iter->data;
60de42
+
60de42
+            g_hash_table_remove(rsc->allowed_nodes, nodeid);
60de42
+        }
60de42
+
60de42
         tuple->node = node_copy(node);
60de42
         tuple->node->weight = 500;
60de42
         nodeid = NULL;
60de42
-- 
60de42
1.8.3.1
60de42
60de42
60de42
From ac906cbf1b46c0037fed634158874679824ce635 Mon Sep 17 00:00:00 2001
60de42
From: Ken Gaillot <kgaillot@redhat.com>
60de42
Date: Tue, 20 Jun 2017 20:23:12 -0500
60de42
Subject: [PATCH 2/2] Fix: libpe_status: avoid memory leaks when creating
60de42
 bundle remote resource
60de42
60de42
---
60de42
 lib/pengine/container.c | 31 +++++++++++++++++++------------
60de42
 1 file changed, 19 insertions(+), 12 deletions(-)
60de42
60de42
diff --git a/lib/pengine/container.c b/lib/pengine/container.c
60de42
index c37f421..e916446 100644
60de42
--- a/lib/pengine/container.c
60de42
+++ b/lib/pengine/container.c
60de42
@@ -346,22 +346,28 @@ create_remote_resource(
60de42
         node_t *node = NULL;
60de42
         xmlNode *xml_obj = NULL;
60de42
         xmlNode *xml_remote = NULL;
60de42
-        char *nodeid = crm_strdup_printf("%s-%d", data->prefix, tuple->offset);
60de42
-        char *id = NULL;
60de42
+        char *id = crm_strdup_printf("%s-%d", data->prefix, tuple->offset);
60de42
+        const char *uname = NULL;
60de42
 
60de42
-        if (remote_id_conflict(nodeid, data_set)) {
60de42
+        if (remote_id_conflict(id, data_set)) {
60de42
+            free(id);
60de42
             // The biggest hammer we have
60de42
             id = crm_strdup_printf("pcmk-internal-%s-remote-%d", tuple->child->id, tuple->offset);
60de42
             CRM_ASSERT(remote_id_conflict(id, data_set) == FALSE);
60de42
-        } else {
60de42
-            id = strdup(nodeid);
60de42
         }
60de42
 
60de42
         xml_remote = create_resource(id, "pacemaker", "remote");
60de42
+
60de42
+        /* Abandon our created ID, and pull the copy from the XML, because we
60de42
+         * need something that will get freed during data set cleanup to use as
60de42
+         * the node ID and uname.
60de42
+         */
60de42
         free(id);
60de42
+        id = NULL;
60de42
+        uname = ID(xml_remote);
60de42
 
60de42
         xml_obj = create_xml_node(xml_remote, "operations");
60de42
-        create_op(xml_obj, ID(xml_remote), "monitor", "60s");
60de42
+        create_op(xml_obj, uname, "monitor", "60s");
60de42
 
60de42
         xml_obj = create_xml_node(xml_remote, XML_TAG_ATTR_SETS);
60de42
         crm_xml_set_id(xml_obj, "%s-attributes-%d", data->prefix, tuple->offset);
60de42
@@ -376,7 +382,10 @@ create_remote_resource(
60de42
         if(data->control_port) {
60de42
             create_nvp(xml_obj, "port", data->control_port);
60de42
         } else {
60de42
-            create_nvp(xml_obj, "port", crm_itoa(DEFAULT_REMOTE_PORT));
60de42
+            char *port_s = crm_itoa(DEFAULT_REMOTE_PORT);
60de42
+
60de42
+            create_nvp(xml_obj, "port", port_s);
60de42
+            free(port_s);
60de42
         }
60de42
 
60de42
         xml_obj = create_xml_node(xml_remote, XML_TAG_META_SETS);
60de42
@@ -395,9 +404,9 @@ create_remote_resource(
60de42
          * been, if it has a permanent node attribute), and ensure its weight is
60de42
          * -INFINITY so no other resources can run on it.
60de42
          */
60de42
-        node = pe_find_node(data_set->nodes, nodeid);
60de42
+        node = pe_find_node(data_set->nodes, uname);
60de42
         if (node == NULL) {
60de42
-            node = pe_create_node(strdup(nodeid), nodeid, "remote", "-INFINITY",
60de42
+            node = pe_create_node(uname, uname, "remote", "-INFINITY",
60de42
                                   data_set);
60de42
         } else {
60de42
             node->weight = -INFINITY;
60de42
@@ -420,13 +429,11 @@ create_remote_resource(
60de42
         for (rsc_iter = data_set->resources; rsc_iter; rsc_iter = rsc_iter->next) {
60de42
             resource_t *rsc = (resource_t *) rsc_iter->data;
60de42
 
60de42
-            g_hash_table_remove(rsc->allowed_nodes, nodeid);
60de42
+            g_hash_table_remove(rsc->allowed_nodes, uname);
60de42
         }
60de42
 
60de42
         tuple->node = node_copy(node);
60de42
         tuple->node->weight = 500;
60de42
-        nodeid = NULL;
60de42
-        id = NULL;
60de42
 
60de42
         if (common_unpack(xml_remote, &tuple->remote, parent, data_set) == FALSE) {
60de42
             return FALSE;
60de42
-- 
60de42
1.8.3.1
60de42