| 904 | } |
| 905 | |
| 906 | static resource_t * |
| 907 | find_compatible_child_by_node(resource_t * local_child, node_t * local_node, resource_t * rsc, |
| 908 | enum rsc_role_e filter, gboolean current) |
| 909 | { |
| 910 | node_t *node = NULL; |
| 911 | GListPtr gIter = NULL; |
| 912 | |
| 913 | if (local_node == NULL) { |
| 914 | crm_err("Can't colocate unrunnable child %s with %s", local_child->id, rsc->id); |
| 915 | return NULL; |
| 916 | } |
| 917 | |
| 918 | crm_trace("Looking for compatible child from %s for %s on %s", |
| 919 | local_child->id, rsc->id, local_node->details->uname); |
| 920 | |
| 921 | gIter = rsc->children; |
| 922 | for (; gIter != NULL; gIter = gIter->next) { |
| 923 | resource_t *child_rsc = (resource_t *) gIter->data; |
| 924 | enum rsc_role_e next_role = child_rsc->fns->state(child_rsc, current); |
| 925 | |
| 926 | node = child_rsc->fns->location(child_rsc, NULL, current); |
| 927 | |
| 928 | if (filter != RSC_ROLE_UNKNOWN && next_role != filter) { |
| 929 | crm_trace("Filtered %s", child_rsc->id); |
| 930 | continue; |
| 931 | } |
| 932 | |
| 933 | if (node && local_node && node->details == local_node->details) { |
| 934 | crm_trace("Pairing %s with %s on %s", |
| 935 | local_child->id, child_rsc->id, node->details->uname); |
| 936 | return child_rsc; |
| 937 | |
| 938 | } else if (node) { |
| 939 | crm_trace("%s - %s vs %s", child_rsc->id, node->details->uname, |
| 940 | local_node->details->uname); |
| 941 | |
| 942 | } else { |
| 943 | crm_trace("%s - not allocated %d", child_rsc->id, current); |
| 944 | } |
| 945 | } |
| 946 | |
| 947 | crm_trace("Can't pair %s with %s", local_child->id, rsc->id); |
| 948 | return NULL; |
| 949 | } |
| 950 | |
| 951 | resource_t * |
| 952 | find_compatible_child(resource_t * local_child, resource_t * rsc, enum rsc_role_e filter, |
no outgoing calls
no test coverage detected