native.c

来自「linux集群服务器软件代码包」· C语言 代码 · 共 1,104 行 · 第 1/2 页

C
1,104
字号
		crm_devel("LH-Side was: (%s/%s)",			  order->lh_rsc?order->lh_rsc->id:order->lh_action?order->lh_action->rsc->id:"<NULL>",			  task2text(order->lh_action_task));		return;	} 	slist_iter(		rh_action_iter, action_t, rh_actions, lpc,		order_actions(lh_action, rh_action_iter, order); 		);	pe_free_shallow_adv(rh_actions, FALSE);}void native_rsc_location(resource_t *rsc, rsc_to_node_t *constraint){	GListPtr or_list;	native_variant_data_t *native_data = NULL;		crm_devel_action(print_rsc_to_node("Applying", constraint, FALSE));	/* take "lifetime" into account */	if(constraint == NULL) {		crm_err("Constraint is NULL");		return;				} else if(is_active(constraint) == FALSE) {		crm_debug("Constraint (%s) is not active", constraint->id);		return;	} else if(rsc == NULL) {		crm_err("LHS of rsc_to_node (%s) is NULL", constraint->id);		return;	}    	get_native_variant_data(native_data, rsc);	native_data->node_cons =		g_list_append(native_data->node_cons, constraint);	if(constraint->node_list_rh == NULL) {		crm_warn("RHS of constraint %s is NULL", constraint->id);		return;	}	crm_devel_action(print_resource("before update", rsc,TRUE));	or_list = node_list_or(		native_data->allowed_nodes, constraint->node_list_rh, FALSE);			pe_free_shallow(native_data->allowed_nodes);	native_data->allowed_nodes = or_list;	slist_iter(node_rh, node_t, constraint->node_list_rh, lpc,		   native_update_node_weight(			   rsc, constraint, node_rh->details->uname,			   native_data->allowed_nodes));	crm_devel_action(print_resource("after update", rsc, TRUE));}void native_expand(resource_t *rsc, crm_data_t * *graph){	slist_iter(		action, action_t, rsc->actions, lpc,		crm_devel("processing action %d for rsc=%s",			  action->id, rsc->id);		graph_element_from_action(action, graph);		);}void native_dump(resource_t *rsc, const char *pre_text, gboolean details){	native_variant_data_t *native_data = NULL;	get_native_variant_data(native_data, rsc);	common_dump(rsc, pre_text, details);	crm_devel("\t%d candidate colors, %d allowed nodes,"		  " %d rsc_cons and %d node_cons",		  g_list_length(rsc->candidate_colors),		  g_list_length(native_data->allowed_nodes),		  g_list_length(rsc->rsc_cons),		  g_list_length(native_data->node_cons));		if(details) {		crm_devel("\t=== Actions");		slist_iter(			action, action_t, rsc->actions, lpc, 			print_action("\trsc action: ", action, FALSE);			);				crm_devel("\t=== Colors");		slist_iter(			color, color_t, rsc->candidate_colors, lpc,			print_color("\t", color, FALSE)			);		crm_devel("\t=== Allowed Nodes");		slist_iter(			node, node_t, native_data->allowed_nodes, lpc,			print_node("\t", node, FALSE);			);	}}void native_free(resource_t *rsc){	native_variant_data_t *native_data =		(native_variant_data_t *)rsc->variant_opaque;		crm_devel("Freeing Allowed Nodes");	pe_free_shallow(native_data->allowed_nodes);		common_free(rsc);	}void native_rsc_dependancy_rh_must(resource_t *rsc_lh, gboolean update_lh,				   resource_t *rsc_rh, gboolean update_rh){	native_variant_data_t *native_data_lh = NULL;	native_variant_data_t *native_data_rh = NULL;	gboolean do_merge = FALSE;	GListPtr old_list = NULL;	GListPtr merged_node_list = NULL;	float max_pri = rsc_lh->effective_priority;	if(max_pri < rsc_rh->effective_priority) {		max_pri = rsc_rh->effective_priority;	}	rsc_lh->effective_priority = max_pri;	rsc_rh->effective_priority = max_pri;		get_native_variant_data(native_data_lh, rsc_lh);	get_native_variant_data(native_data_rh, rsc_rh);	if(native_data_lh->color && native_data_rh->color) {		do_merge = TRUE;		merged_node_list = node_list_and(			native_data_lh->color->details->candidate_nodes,			native_data_rh->color->details->candidate_nodes, TRUE);				} else if(native_data_lh->color) {		do_merge = TRUE;		merged_node_list = node_list_and(			native_data_lh->color->details->candidate_nodes,			native_data_rh->allowed_nodes, TRUE);	} else if(native_data_rh->color) {		do_merge = TRUE;		merged_node_list = node_list_and(			native_data_lh->allowed_nodes,			native_data_rh->color->details->candidate_nodes, TRUE);	}			if(update_lh) {		crm_free(native_data_lh->color);		rsc_lh->runnable = rsc_rh->runnable;		native_data_lh->color    = copy_color(native_data_rh->color);	}	if(update_rh) {		crm_free(native_data_rh->color);		rsc_rh->runnable = rsc_lh->runnable;		native_data_rh->color    = copy_color(native_data_lh->color);	}	CRM_DEV_ASSERT(update_rh || update_lh);	if(crm_assert_failed == FALSE && do_merge) {		crm_devel("Merging candidate nodes");		old_list = native_data_rh->color->details->candidate_nodes;		native_data_rh->color->details->candidate_nodes = merged_node_list;		pe_free_shallow(old_list);	}			crm_devel("Finished processing pecs_must constraint");}void native_rsc_dependancy_rh_mustnot(resource_t *rsc_lh, gboolean update_lh,				      resource_t *rsc_rh, gboolean update_rh){	color_t *color_lh = NULL;	color_t *color_rh = NULL;	native_variant_data_t *native_data_lh = NULL;	native_variant_data_t *native_data_rh = NULL;	get_native_variant_data(native_data_lh, rsc_lh);	get_native_variant_data(native_data_rh, rsc_rh);		crm_devel("Processing pecs_must_not constraint");	/* pecs_must_not */	if(update_lh) {		color_rh = native_data_rh->color;		if(rsc_lh->provisional) {			color_lh = find_color(				rsc_lh->candidate_colors, color_rh);			rsc_lh->candidate_colors = g_list_remove(				rsc_lh->candidate_colors, color_lh);						crm_devel_action(				print_color("Removed LH", color_lh, FALSE));						crm_devel_action(				print_resource("Modified LH", rsc_lh, TRUE));						crm_free(color_lh);					} else if(native_data_lh->color			  && native_data_lh->color->details->pending) {			node_t *node_lh = NULL;						color_lh = native_data_lh->color;			node_lh = pe_find_node(				color_lh->details->candidate_nodes,				safe_val5(NULL, color_rh, details,					  chosen_node, details, uname));						color_lh->details->candidate_nodes =				g_list_remove(					color_lh->details->candidate_nodes,					node_lh);						crm_devel_action(				print_node("Removed LH", node_lh, FALSE));			crm_devel_action(				print_color("Modified LH", color_lh, FALSE));						crm_free(node_lh);		} else {			/* error, rsc marked as unrunnable above */			crm_warn("lh else");		}	}		if(update_rh) {		color_lh = native_data_lh->color;		if(rsc_rh->provisional) {			color_rh = find_color(				rsc_rh->candidate_colors, color_lh);			rsc_rh->candidate_colors = g_list_remove(				rsc_rh->candidate_colors, color_rh);						crm_devel_action(				print_color("Removed RH", color_rh, FALSE));			crm_devel_action(				print_resource("Modified RH", rsc_rh, TRUE));						crm_free(color_rh);					} else if(native_data_rh->color			  && native_data_rh->color->details->pending) {			node_t *node_rh = NULL;			color_rh = native_data_rh->color;			node_rh = pe_find_node(				color_rh->details->candidate_nodes,				safe_val5(NULL, color_lh, details,					  chosen_node, details, uname));						color_rh->details->candidate_nodes =				g_list_remove(					color_rh->details->candidate_nodes,					node_rh);						crm_devel_action(				print_node("Removed RH", node_rh, FALSE));			crm_devel_action(				print_color("Modified RH", color_rh, FALSE));			crm_free(node_rh);		} else {			/* error, rsc marked as unrunnable above */			crm_warn("rh else");		}	}}voidnative_agent_constraints(resource_t *rsc){	native_variant_data_t *native_data = NULL;	get_native_variant_data(native_data, rsc);	crm_trace("Applying RA restrictions to %s", rsc->id);	common_agent_constraints(		native_data->allowed_nodes, native_data->agent, rsc->id);}gbooleannative_choose_color(resource_t *rsc){	GListPtr sorted_colors = NULL;	native_variant_data_t *native_data = NULL;	get_native_variant_data(native_data, rsc);		if(rsc->runnable == FALSE) {		native_assign_color(rsc, no_color);	}	if(rsc->provisional == FALSE) {		return !rsc->provisional;	}		sorted_colors = g_list_sort(		rsc->candidate_colors, sort_color_weight);		rsc->candidate_colors = sorted_colors;		crm_verbose("Choose a color from %d possibilities",		    g_list_length(sorted_colors));		slist_iter(		this_color, color_t, rsc->candidate_colors, lpc,		GListPtr intersection = NULL;		GListPtr minus = NULL;		int len = 0;		if(this_color == NULL) {			crm_err("color was NULL");			continue;					} else if(rsc->effective_priority		   < this_color->details->highest_priority) {			minus = node_list_minus(				this_color->details->candidate_nodes, 				native_data->allowed_nodes, TRUE);			len = g_list_length(minus);			pe_free_shallow(minus);						if(len > 0) {				native_assign_color(rsc, this_color);				break;			}					} else {			intersection = node_list_and(				this_color->details->candidate_nodes, 				native_data->allowed_nodes, TRUE);			len = g_list_length(intersection);			pe_free_shallow(intersection);						if(len != 0) {				native_assign_color(rsc, this_color);				break;			}		}		);	return !rsc->provisional;}voidnative_assign_color(resource_t *rsc, color_t *color) {	color_t *local_color = add_color(rsc, color);	GListPtr intersection = NULL;	GListPtr old_list = NULL;	native_variant_data_t *native_data = NULL;	get_native_variant_data(native_data, rsc);	native_data->color = local_color;	rsc->provisional = FALSE;	if(local_color != NULL) {		local_color->details->allocated_resources =			g_list_append(				local_color->details->allocated_resources,rsc);			intersection = node_list_and(				local_color->details->candidate_nodes, 				native_data->allowed_nodes, TRUE);			   			old_list = local_color->details->candidate_nodes;							pe_free_shallow(old_list);						local_color->details->candidate_nodes = intersection;							crm_verbose("Colored resource %s with new color %d",				    rsc->id, native_data->color->id);						crm_devel_action(				print_resource("Colored Resource", rsc, TRUE));				} else {		crm_err("local color was NULL");	}		return;}voidnative_update_node_weight(resource_t *rsc, rsc_to_node_t *cons,			  const char *id, GListPtr nodes){	node_t *node_rh = NULL;	native_variant_data_t *native_data = NULL;	get_native_variant_data(native_data, rsc);	node_rh = pe_find_node(native_data->allowed_nodes, id);	if(node_rh == NULL) {		crm_err("Node not found - cant update");		return;	}	if(node_rh->fixed) {		/* warning */		crm_warn("Constraint %s is irrelevant as the"			 " weight of node %s is fixed as %f.",			 cons->id,			 node_rh->details->uname,			 node_rh->weight);		return;	}		crm_verbose("Constraint %s (%s): node %s weight %f.",		    cons->id,		    cons->can?"can":"cannot",		    node_rh->details->uname,		    node_rh->weight);	if(cons->can == FALSE) {		node_rh->weight = -1;	} else {		node_rh->weight += cons->weight;	}	if(node_rh->weight < 0) {		node_rh->fixed = TRUE;	}	crm_devel_action(print_node("Updated", node_rh, FALSE));	return;}gbooleannative_constraint_violated(	resource_t *rsc_lh, resource_t *rsc_rh, rsc_dependancy_t *constraint){	native_variant_data_t *native_data_lh = NULL;	native_variant_data_t *native_data_rh = NULL;	GListPtr result = NULL;	color_t *color_lh = NULL;	color_t *color_rh = NULL;	GListPtr candidate_nodes_lh = NULL;	GListPtr candidate_nodes_rh = NULL;	gboolean matched = FALSE;	get_native_variant_data(native_data_lh, rsc_lh);	get_native_variant_data(native_data_rh, rsc_rh);	color_lh = native_data_lh->color;	color_rh = native_data_rh->color;	if(constraint->strength == pecs_must_not) {		matched = TRUE;	}				if(rsc_lh->provisional || rsc_rh->provisional) {		return FALSE;	}		if(color_lh->details->pending	   && color_rh->details->pending) {		candidate_nodes_lh = color_lh->details->candidate_nodes;		candidate_nodes_rh = color_rh->details->candidate_nodes;			} else if(color_lh->details->pending == FALSE		  && color_rh->details->pending == FALSE) {		if(color_lh == NULL && color_rh == NULL) {			return matched;					} else if(color_lh == NULL || color_rh == NULL) {			return !matched;		} else if(color_lh->details->chosen_node == NULL			  && color_rh->details->chosen_node == NULL) {			return matched;		} else if(color_lh->details->chosen_node == NULL			  || color_rh->details->chosen_node == NULL) {			return !matched;		} else if(safe_str_eq(				  color_lh->details->chosen_node->details->id,				  color_rh->details->chosen_node->details->id)) {			return matched;		}		return !matched;			} else if(color_lh->details->pending) {		candidate_nodes_lh = color_lh->details->candidate_nodes;		candidate_nodes_rh = g_list_append(			NULL, color_rh->details->chosen_node);	} else if(color_rh->details->pending) {		candidate_nodes_rh = color_rh->details->candidate_nodes;		candidate_nodes_lh = g_list_append(			NULL, color_lh->details->chosen_node);	}	result = node_list_and(candidate_nodes_lh, candidate_nodes_rh, TRUE);	if(g_list_length(result) == 0 && constraint->strength == pecs_must) {		/* free result */		return TRUE;	}	return FALSE;}/* * Remove any nodes with a -ve weight */voidfilter_nodes(resource_t *rsc){	native_variant_data_t *native_data = NULL;	get_native_variant_data(native_data, rsc);	crm_devel_action(print_resource("Filtering nodes for", rsc, FALSE));	slist_iter(		node, node_t, native_data->allowed_nodes, lpc,		if(node == NULL) {			crm_err("Invalid NULL node");					} else if(node->weight < 0.0			  || node->details->online == FALSE			  || node->details->type == node_ping) {			crm_devel_action(print_node("Removing", node, FALSE));			native_data->allowed_nodes =				g_list_remove(native_data->allowed_nodes, node);			crm_free(node);			lpc = -1; /* restart the loop */		}		);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?