This source file includes following definitions.
- pe_new_working_set
- pe_free_working_set
- cluster_status
- pe_free_resources
- pe_free_actions
- pe_free_nodes
- pe__free_ordering
- pe__free_location
- cleanup_calculations
- pe_reset_working_set
- set_working_set_defaults
- pe_find_resource
- pe_find_resource_with_flags
- pe_find_node_any
- pe_find_node_id
- pe_find_node
1
2
3
4
5
6
7
8
9
10 #include <crm_internal.h>
11
12 #include <sys/param.h>
13
14 #include <crm/crm.h>
15 #include <crm/msg_xml.h>
16 #include <crm/common/xml.h>
17
18 #include <glib.h>
19
20 #include <crm/pengine/internal.h>
21 #include <pe_status_private.h>
22
23
24
25
26
27
28
29
30
31
32
33 pe_working_set_t *
34 pe_new_working_set(void)
35 {
36 pe_working_set_t *data_set = calloc(1, sizeof(pe_working_set_t));
37
38 if (data_set != NULL) {
39 set_working_set_defaults(data_set);
40 }
41 return data_set;
42 }
43
44
45
46
47
48
49 void
50 pe_free_working_set(pe_working_set_t *data_set)
51 {
52 if (data_set != NULL) {
53 pe_reset_working_set(data_set);
54 data_set->priv = NULL;
55 free(data_set);
56 }
57 }
58
59
60
61
62
63
64
65
66
67
68
69
70 gboolean
71 cluster_status(pe_working_set_t * data_set)
72 {
73 xmlNode *section = NULL;
74
75 if ((data_set == NULL) || (data_set->input == NULL)) {
76 return FALSE;
77 }
78
79 crm_trace("Beginning unpack");
80
81 if (data_set->failed != NULL) {
82 free_xml(data_set->failed);
83 }
84 data_set->failed = create_xml_node(NULL, "failed-ops");
85
86 if (data_set->now == NULL) {
87 data_set->now = crm_time_new(NULL);
88 }
89
90 if (data_set->dc_uuid == NULL) {
91 data_set->dc_uuid = crm_element_value_copy(data_set->input,
92 XML_ATTR_DC_UUID);
93 }
94
95 if (pcmk__xe_attr_is_true(data_set->input, XML_ATTR_HAVE_QUORUM)) {
96 pe__set_working_set_flags(data_set, pe_flag_have_quorum);
97 } else {
98 pe__clear_working_set_flags(data_set, pe_flag_have_quorum);
99 }
100
101 data_set->op_defaults = get_xpath_object("//" XML_CIB_TAG_OPCONFIG,
102 data_set->input, LOG_NEVER);
103 data_set->rsc_defaults = get_xpath_object("//" XML_CIB_TAG_RSCCONFIG,
104 data_set->input, LOG_NEVER);
105
106 section = get_xpath_object("//" XML_CIB_TAG_CRMCONFIG, data_set->input,
107 LOG_TRACE);
108 unpack_config(section, data_set);
109
110 if (!pcmk_any_flags_set(data_set->flags,
111 pe_flag_quick_location|pe_flag_have_quorum)
112 && (data_set->no_quorum_policy != no_quorum_ignore)) {
113 crm_warn("Fencing and resource management disabled due to lack of quorum");
114 }
115
116 section = get_xpath_object("//" XML_CIB_TAG_NODES, data_set->input,
117 LOG_TRACE);
118 unpack_nodes(section, data_set);
119
120 section = get_xpath_object("//" XML_CIB_TAG_RESOURCES, data_set->input,
121 LOG_TRACE);
122 if (!pcmk_is_set(data_set->flags, pe_flag_quick_location)) {
123 unpack_remote_nodes(section, data_set);
124 }
125 unpack_resources(section, data_set);
126
127 section = get_xpath_object("//" XML_CIB_TAG_TAGS, data_set->input,
128 LOG_NEVER);
129 unpack_tags(section, data_set);
130
131 if (!pcmk_is_set(data_set->flags, pe_flag_quick_location)) {
132 section = get_xpath_object("//"XML_CIB_TAG_STATUS, data_set->input,
133 LOG_TRACE);
134 unpack_status(section, data_set);
135 }
136
137 if (!pcmk_is_set(data_set->flags, pe_flag_no_counts)) {
138 for (GList *item = data_set->resources; item != NULL;
139 item = item->next) {
140 ((pe_resource_t *) (item->data))->fns->count(item->data);
141 }
142 crm_trace("Cluster resource count: %d (%d disabled, %d blocked)",
143 data_set->ninstances, data_set->disabled_resources,
144 data_set->blocked_resources);
145 }
146
147 pe__set_working_set_flags(data_set, pe_flag_have_status);
148 return TRUE;
149 }
150
151
152
153
154
155
156
157
158
159
160
161
162 static void
163 pe_free_resources(GList *resources)
164 {
165 pe_resource_t *rsc = NULL;
166 GList *iterator = resources;
167
168 while (iterator != NULL) {
169 rsc = (pe_resource_t *) iterator->data;
170 iterator = iterator->next;
171 rsc->fns->free(rsc);
172 }
173 if (resources != NULL) {
174 g_list_free(resources);
175 }
176 }
177
178 static void
179 pe_free_actions(GList *actions)
180 {
181 GList *iterator = actions;
182
183 while (iterator != NULL) {
184 pe_free_action(iterator->data);
185 iterator = iterator->next;
186 }
187 if (actions != NULL) {
188 g_list_free(actions);
189 }
190 }
191
192 static void
193 pe_free_nodes(GList *nodes)
194 {
195 for (GList *iterator = nodes; iterator != NULL; iterator = iterator->next) {
196 pe_node_t *node = (pe_node_t *) iterator->data;
197
198
199 if (node == NULL) {
200 continue;
201 }
202 if (node->details == NULL) {
203 free(node);
204 continue;
205 }
206
207
208
209
210 crm_trace("Freeing node %s", (pe__is_guest_or_remote_node(node)?
211 "(guest or remote)" : pe__node_name(node)));
212
213 if (node->details->attrs != NULL) {
214 g_hash_table_destroy(node->details->attrs);
215 }
216 if (node->details->utilization != NULL) {
217 g_hash_table_destroy(node->details->utilization);
218 }
219 if (node->details->digest_cache != NULL) {
220 g_hash_table_destroy(node->details->digest_cache);
221 }
222 g_list_free(node->details->running_rsc);
223 g_list_free(node->details->allocated_rsc);
224 free(node->details);
225 free(node);
226 }
227 if (nodes != NULL) {
228 g_list_free(nodes);
229 }
230 }
231
232 static void
233 pe__free_ordering(GList *constraints)
234 {
235 GList *iterator = constraints;
236
237 while (iterator != NULL) {
238 pe__ordering_t *order = iterator->data;
239
240 iterator = iterator->next;
241
242 free(order->lh_action_task);
243 free(order->rh_action_task);
244 free(order);
245 }
246 if (constraints != NULL) {
247 g_list_free(constraints);
248 }
249 }
250
251 static void
252 pe__free_location(GList *constraints)
253 {
254 GList *iterator = constraints;
255
256 while (iterator != NULL) {
257 pe__location_t *cons = iterator->data;
258
259 iterator = iterator->next;
260
261 g_list_free_full(cons->node_list_rh, free);
262 free(cons->id);
263 free(cons);
264 }
265 if (constraints != NULL) {
266 g_list_free(constraints);
267 }
268 }
269
270
271
272
273
274
275
276
277
278 void
279 cleanup_calculations(pe_working_set_t * data_set)
280 {
281 if (data_set == NULL) {
282 return;
283 }
284
285 pe__clear_working_set_flags(data_set, pe_flag_have_status);
286 if (data_set->config_hash != NULL) {
287 g_hash_table_destroy(data_set->config_hash);
288 }
289
290 if (data_set->singletons != NULL) {
291 g_hash_table_destroy(data_set->singletons);
292 }
293
294 if (data_set->tickets) {
295 g_hash_table_destroy(data_set->tickets);
296 }
297
298 if (data_set->template_rsc_sets) {
299 g_hash_table_destroy(data_set->template_rsc_sets);
300 }
301
302 if (data_set->tags) {
303 g_hash_table_destroy(data_set->tags);
304 }
305
306 free(data_set->dc_uuid);
307
308 crm_trace("deleting resources");
309 pe_free_resources(data_set->resources);
310
311 crm_trace("deleting actions");
312 pe_free_actions(data_set->actions);
313
314 crm_trace("deleting nodes");
315 pe_free_nodes(data_set->nodes);
316
317 pe__free_param_checks(data_set);
318 g_list_free(data_set->stop_needed);
319 free_xml(data_set->graph);
320 crm_time_free(data_set->now);
321 free_xml(data_set->input);
322 free_xml(data_set->failed);
323
324 set_working_set_defaults(data_set);
325
326 CRM_CHECK(data_set->ordering_constraints == NULL,;
327 );
328 CRM_CHECK(data_set->placement_constraints == NULL,;
329 );
330 }
331
332
333
334
335
336
337 void
338 pe_reset_working_set(pe_working_set_t *data_set)
339 {
340 if (data_set == NULL) {
341 return;
342 }
343
344 crm_trace("Deleting %d ordering constraints",
345 g_list_length(data_set->ordering_constraints));
346 pe__free_ordering(data_set->ordering_constraints);
347 data_set->ordering_constraints = NULL;
348
349 crm_trace("Deleting %d location constraints",
350 g_list_length(data_set->placement_constraints));
351 pe__free_location(data_set->placement_constraints);
352 data_set->placement_constraints = NULL;
353
354 crm_trace("Deleting %d colocation constraints",
355 g_list_length(data_set->colocation_constraints));
356 g_list_free_full(data_set->colocation_constraints, free);
357 data_set->colocation_constraints = NULL;
358
359 crm_trace("Deleting %d ticket constraints",
360 g_list_length(data_set->ticket_constraints));
361 g_list_free_full(data_set->ticket_constraints, free);
362 data_set->ticket_constraints = NULL;
363
364 cleanup_calculations(data_set);
365 }
366
367 void
368 set_working_set_defaults(pe_working_set_t * data_set)
369 {
370 void *priv = data_set->priv;
371
372 memset(data_set, 0, sizeof(pe_working_set_t));
373
374 data_set->priv = priv;
375 data_set->order_id = 1;
376 data_set->action_id = 1;
377 data_set->no_quorum_policy = no_quorum_stop;
378
379 data_set->flags = 0x0ULL;
380
381 pe__set_working_set_flags(data_set,
382 pe_flag_stop_rsc_orphans
383 |pe_flag_symmetric_cluster
384 |pe_flag_stop_action_orphans);
385 if (!strcmp(PCMK__CONCURRENT_FENCING_DEFAULT, "true")) {
386 pe__set_working_set_flags(data_set, pe_flag_concurrent_fencing);
387 }
388 }
389
390 pe_resource_t *
391 pe_find_resource(GList *rsc_list, const char *id)
392 {
393 return pe_find_resource_with_flags(rsc_list, id, pe_find_renamed);
394 }
395
396 pe_resource_t *
397 pe_find_resource_with_flags(GList *rsc_list, const char *id, enum pe_find flags)
398 {
399 GList *rIter = NULL;
400
401 for (rIter = rsc_list; id && rIter; rIter = rIter->next) {
402 pe_resource_t *parent = rIter->data;
403
404 pe_resource_t *match =
405 parent->fns->find_rsc(parent, id, NULL, flags);
406 if (match != NULL) {
407 return match;
408 }
409 }
410 crm_trace("No match for %s", id);
411 return NULL;
412 }
413
414
415
416
417
418
419
420
421
422
423
424
425 pe_node_t *
426 pe_find_node_any(const GList *nodes, const char *id, const char *uname)
427 {
428 pe_node_t *match = NULL;
429
430 if (id != NULL) {
431 match = pe_find_node_id(nodes, id);
432 }
433 if ((match == NULL) && (uname != NULL)) {
434 match = pe_find_node(nodes, uname);
435 }
436 return match;
437 }
438
439
440
441
442
443
444
445
446
447 pe_node_t *
448 pe_find_node_id(const GList *nodes, const char *id)
449 {
450 for (const GList *iter = nodes; iter != NULL; iter = iter->next) {
451 pe_node_t *node = (pe_node_t *) iter->data;
452
453
454
455
456
457 if (pcmk__str_eq(node->details->id, id, pcmk__str_casei)) {
458 return node;
459 }
460 }
461 return NULL;
462 }
463
464
465
466
467
468
469
470
471
472 pe_node_t *
473 pe_find_node(const GList *nodes, const char *node_name)
474 {
475 for (const GList *iter = nodes; iter != NULL; iter = iter->next) {
476 pe_node_t *node = (pe_node_t *) iter->data;
477
478 if (pcmk__str_eq(node->details->uname, node_name, pcmk__str_casei)) {
479 return node;
480 }
481 }
482 return NULL;
483 }