⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsa.c

📁 在LINUX下实现HA的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
			       fsa_state2string(cur_state));						next_input = I_NULL;					} else if(cur_input == I_NULL && is_set(actions, A_NOTHING)) {#ifdef FSA_TRACE			cl_log(LOG_INFO, "Nothing left to do");#endif					} else {			cl_log(LOG_ERR, "Action %s (0x%llx) not supported ",			       fsa_action2string(actions), actions);			next_input = I_ERROR;		}	}	#ifdef FSA_TRACE	CRM_DEBUG2("################# Exiting the FSA (%s) ##################",		  fsa_state2string(fsa_state));#endif	/* cleanup inputs? */		FNRET(fsa_state);}/*	A_NODE_BLOCK	*/enum crmd_fsa_inputdo_node_block(long long action,	      enum crmd_fsa_cause cause,	      enum crmd_fsa_state cur_state,	      enum crmd_fsa_input current_input,	      void *data){	xmlNodePtr xml_message = (xmlNodePtr)data;	const char *host_from  = xmlGetProp(xml_message, XML_ATTR_HOSTFROM);	FNIN();		(void)host_from;			FNRET(I_NULL);}const char *fsa_input2string(int input){	const char *inputAsText = NULL;		switch(input){		case I_NULL:			inputAsText = "I_NULL";			break;		case I_CCM_EVENT:			inputAsText = "I_CCM_EVENT";			break;		case I_CIB_OP:			inputAsText = "I_CIB_OP";			break;		case I_CIB_UPDATE:			inputAsText = "I_CIB_UPDATE";			break;		case I_DC_TIMEOUT:			inputAsText = "I_DC_TIMEOUT";			break;		case I_ELECTION:			inputAsText = "I_ELECTION";			break;		case I_RELEASE_DC:			inputAsText = "I_RELEASE_DC";			break;		case I_ELECTION_DC:			inputAsText = "I_ELECTION_DC";			break;		case I_ERROR:			inputAsText = "I_ERROR";			break;		case I_FAIL:			inputAsText = "I_FAIL";			break;		case I_INTEGRATION_TIMEOUT:			inputAsText = "I_INTEGRATION_TIMEOUT";			break;		case I_NODE_JOIN:			inputAsText = "I_NODE_JOIN";			break;		case I_NODE_LEFT:			inputAsText = "I_NODE_LEFT";			break;		case I_NODE_LEAVING:			inputAsText = "I_NODE_LEAVING";			break;		case I_NOT_DC:			inputAsText = "I_NOT_DC";			break;		case I_RECOVERED:			inputAsText = "I_RECOVERED";			break;		case I_RELEASE_FAIL:			inputAsText = "I_RELEASE_FAIL";			break;		case I_RELEASE_SUCCESS:			inputAsText = "I_RELEASE_SUCCESS";			break;		case I_RESTART:			inputAsText = "I_RESTART";			break;		case I_REQUEST:			inputAsText = "I_REQUEST";			break;		case I_ROUTER:			inputAsText = "I_ROUTER";			break;		case I_SHUTDOWN:			inputAsText = "I_SHUTDOWN";			break;/* 		case I_SHUTDOWN_REQ: *//* 			inputAsText = "I_SHUTDOWN_REQ"; *//* 			break; */		case I_STARTUP:			inputAsText = "I_STARTUP";			break;		case I_SUCCESS:			inputAsText = "I_SUCCESS";			break;		case I_TERMINATE:			inputAsText = "I_TERMINATE";			break;		case I_WELCOME:			inputAsText = "I_WELCOME";			break;		case I_WELCOME_ACK:			inputAsText = "I_WELCOME_ACK";			break;		case I_DC_HEARTBEAT:			inputAsText = "I_DC_HEARTBEAT";			break;		case I_ILLEGAL:			inputAsText = "I_ILLEGAL";			break;	}	if(inputAsText == NULL) {		cl_log(LOG_ERR, "Input %d is unknown", input);		inputAsText = "<UNKNOWN_INPUT>";	}		return inputAsText;}const char *fsa_state2string(int state){	const char *stateAsText = NULL;		switch(state){		case S_IDLE:			stateAsText = "S_IDLE";			break;		case S_ELECTION:			stateAsText = "S_ELECTION";			break;		case S_INTEGRATION:			stateAsText = "S_INTEGRATION";			break;		case S_NOT_DC:			stateAsText = "S_NOT_DC";			break;		case S_POLICY_ENGINE:			stateAsText = "S_POLICY_ENGINE";			break;		case S_RECOVERY:			stateAsText = "S_RECOVERY";			break;		case S_RECOVERY_DC:			stateAsText = "S_RECOVERY_DC";			break;		case S_RELEASE_DC:			stateAsText = "S_RELEASE_DC";			break;		case S_PENDING:			stateAsText = "S_PENDING";			break;		case S_STOPPING:			stateAsText = "S_STOPPING";			break;		case S_TERMINATE:			stateAsText = "S_TERMINATE";			break;		case S_TRANSITION_ENGINE:			stateAsText = "S_TRANSITION_ENGINE";			break;		case S_ILLEGAL:			stateAsText = "S_ILLEGAL";			break;	}	if(stateAsText == NULL) {		cl_log(LOG_ERR, "State %d is unknown", state);		stateAsText = "<UNKNOWN_STATE>";	}		return stateAsText;}const char *fsa_cause2string(int cause){	const char *causeAsText = NULL;		switch(cause){		case C_UNKNOWN:			causeAsText = "C_UNKNOWN";			break;		case C_STARTUP:			causeAsText = "C_STARTUP";			break;		case C_IPC_MESSAGE:			causeAsText = "C_IPC_MESSAGE";			break;		case C_HA_MESSAGE:			causeAsText = "C_HA_MESSAGE";			break;		case C_CCM_CALLBACK:			causeAsText = "C_CCM_CALLBACK";			break;		case C_TIMER_POPPED:			causeAsText = "C_TIMER_POPPED";			break;		case C_SHUTDOWN:			causeAsText = "C_SHUTDOWN";			break;		case C_HEARTBEAT_FAILED:			causeAsText = "C_HEARTBEAT_FAILED";			break;		case C_ILLEGAL:			causeAsText = "C_ILLEGAL";			break;	}	if(causeAsText == NULL) {		cl_log(LOG_ERR, "Cause %d is unknown", cause);		causeAsText = "<UNKNOWN_CAUSE>";	}		return causeAsText;}const char *fsa_action2string(long long action){	const char *actionAsText = NULL;		switch(action){		case A_NOTHING:			actionAsText = "A_NOTHING";			break;		case O_SHUTDOWN:			actionAsText = "O_SHUTDOWN";			break;		case O_RELEASE:			actionAsText = "O_RELEASE";			break;		case A_STARTUP:			actionAsText = "A_STARTUP";			break;		case A_STARTED:			actionAsText = "A_STARTED";			break;		case A_HA_CONNECT:			actionAsText = "A_HA_CONNECT";			break;		case A_HA_DISCONNECT:			actionAsText = "A_HA_DISCONNECT";			break;		case A_LRM_CONNECT:			actionAsText = "A_LRM_CONNECT";			break;		case A_LRM_DISCONNECT:			actionAsText = "A_LRM_DISCONNECT";			break;		case O_DC_TIMER_RESTART:			actionAsText = "O_DC_TIMER_RESTART";			break;		case A_DC_TIMER_STOP:			actionAsText = "A_DC_TIMER_STOP";			break;		case A_DC_TIMER_START:			actionAsText = "A_DC_TIMER_START";			break;		case A_ELECTION_COUNT:			actionAsText = "A_ELECTION_COUNT";			break;		case A_ELECTION_TIMEOUT:			actionAsText = "A_ELECTION_TIMEOUT";			break;		case A_ELECT_TIMER_START:			actionAsText = "A_ELECT_TIMER_START";			break;		case A_ELECT_TIMER_STOP:			actionAsText = "A_ELECT_TIMER_STOP";			break;		case A_ELECTION_VOTE:			actionAsText = "A_ELECTION_VOTE";			break;		case A_ANNOUNCE:			actionAsText = "A_ANNOUNCE";			break;		case A_JOIN_ACK:			actionAsText = "A_JOIN_ACK";			break;		case A_JOIN_WELCOME:			actionAsText = "A_JOIN_WELCOME";			break;		case A_JOIN_WELCOME_ALL:			actionAsText = "A_JOIN_WELCOME_ALL";			break;		case A_JOIN_PROCESS_ACK:			actionAsText = "A_JOIN_PROCESS_ACK";			break;		case A_MSG_PROCESS:			actionAsText = "A_MSG_PROCESS";			break;		case A_MSG_ROUTE:			actionAsText = "A_MSG_ROUTE";			break;		case A_MSG_STORE:			actionAsText = "A_MSG_STORE";			break;		case A_RECOVER:			actionAsText = "A_RECOVER";			break;		case A_DC_RELEASE:			actionAsText = "A_DC_RELEASE";			break;		case A_DC_RELEASED:			actionAsText = "A_DC_RELEASED";			break;		case A_DC_TAKEOVER:			actionAsText = "A_DC_TAKEOVER";			break;		case A_SHUTDOWN:			actionAsText = "A_SHUTDOWN";			break;		case A_SHUTDOWN_REQ:			actionAsText = "A_SHUTDOWN_REQ";			break;		case A_STOP:			actionAsText = "A_STOP  ";			break;		case A_EXIT_0:			actionAsText = "A_EXIT_0";			break;		case A_EXIT_1:			actionAsText = "A_EXIT_1";			break;		case A_CCM_CONNECT:			actionAsText = "A_CCM_CONNECT";			break;		case A_CCM_DISCONNECT:			actionAsText = "A_CCM_DISCONNECT";			break;		case A_CCM_EVENT:			actionAsText = "A_CCM_EVENT";			break;		case A_CCM_UPDATE_CACHE:			actionAsText = "A_CCM_UPDATE_CACHE";			break;		case A_CIB_BUMPGEN:			actionAsText = "A_CIB_BUMPGEN";			break;		case A_CIB_INVOKE:			actionAsText = "A_CIB_INVOKE";			break;		case O_CIB_RESTART:			actionAsText = "O_CIB_RESTART";			break;		case A_CIB_START:			actionAsText = "A_CIB_START";			break;		case A_CIB_STOP:			actionAsText = "A_CIB_STOP";			break;		case A_TE_INVOKE:			actionAsText = "A_TE_INVOKE";			break;		case O_TE_RESTART:			actionAsText = "O_TE_RESTART";			break;		case A_TE_START:			actionAsText = "A_TE_START";			break;		case A_TE_STOP:			actionAsText = "A_TE_STOP";			break;		case A_PE_INVOKE:			actionAsText = "A_PE_INVOKE";			break;		case O_PE_RESTART:			actionAsText = "O_PE_RESTART";			break;		case A_PE_START:			actionAsText = "A_PE_START";			break;		case A_PE_STOP:			actionAsText = "A_PE_STOP";			break;		case A_NODE_BLOCK:			actionAsText = "A_NODE_BLOCK";			break;		case A_UPDATE_NODESTATUS:			actionAsText = "A_UPDATE_NODESTATUS";			break;		case A_LOG:			actionAsText = "A_LOG   ";			break;		case A_ERROR:			actionAsText = "A_ERROR ";			break;		case A_WARN:			actionAsText = "A_WARN  ";			break;	}	if(actionAsText == NULL) {		cl_log(LOG_ERR, "Action %.16llx is unknown", action);		actionAsText = "<UNKNOWN_ACTION>";	}		return actionAsText;}long long do_state_transition(long long actions,		    enum crmd_fsa_cause cause,		    enum crmd_fsa_state cur_state,		    enum crmd_fsa_state next_state,		    enum crmd_fsa_input current_input,		    void *data){	long long tmp = A_NOTHING;		if(current_input != I_NULL	   && (current_input != I_DC_HEARTBEAT || cur_state != S_NOT_DC)){		const char *state_from = fsa_state2string(cur_state);		const char *state_to   = fsa_state2string(next_state);		const char *input      = fsa_input2string(current_input);					time_t now = time(NULL);				fprintf(dot_strm,			"\t\"%s\" -> \"%s\" [ label =\"%s\" ] // %s",			state_from, state_to, input,			asctime(localtime(&now)));		fflush(dot_strm);	}	switch(next_state) {		case S_PENDING:		case S_NOT_DC:			if(is_set(fsa_input_register, R_SHUTDOWN)){				tmp = set_bit(actions, A_SHUTDOWN_REQ);			}			tmp = clear_bit(actions, A_RECOVER);			break;		case S_RECOVERY_DC:		case S_RECOVERY:			tmp = set_bit(actions, A_RECOVER);			break;		default:			tmp = clear_bit(actions, A_RECOVER);			break;	}	if(tmp != actions) {		cl_log(LOG_INFO, "Action b4    %.16llx ", actions);		cl_log(LOG_INFO, "Action after %.16llx ", tmp);		actions = tmp;	}	return actions;}long longclear_flags(long long actions,	    enum crmd_fsa_cause cause,	    enum crmd_fsa_state cur_state,	    enum crmd_fsa_input cur_input){	if(is_set(fsa_input_register, R_SHUTDOWN)){		clear_bit_inplace(&actions, A_DC_TIMER_START);	}		switch(cur_state) {		case S_IDLE:			break;		case S_ELECTION:			break;		case S_INTEGRATION:			break;		case S_NOT_DC:			break;		case S_POLICY_ENGINE:			break;		case S_RECOVERY:			break;		case S_RECOVERY_DC:			break;		case S_RELEASE_DC:			break;		case S_PENDING:			break;		case S_STOPPING:			break;		case S_TERMINATE:			break;		case S_TRANSITION_ENGINE:			break;		case S_ILLEGAL:			break;	}	return actions;}

⌨️ 快捷键说明

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