|
|
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 |
|