CRM_DEV_ASSERT(oc->m_n_in == 0 || oc->m_n_out == 0);
do_ccm_event(long long action,	     enum crmd_fsa_cause cause,	     enum crmd_fsa_state cur_state,	     enum crmd_fsa_input current_input,	     fsa_data_t *msg_data){	enum crmd_fsa_input return_input = I_NULL;	oc_ed_t event;	const oc_ev_membership_t *oc = NULL;	struct crmd_ccm_data_s *ccm_data = fsa_typed_data(fsa_dt_ccm);		if(ccm_data == NULL) {		crm_err("No data provided to FSA function");		register_fsa_error(C_FSA_INTERNAL, I_FAIL, NULL);		return I_NULL;	} else if(msg_data->fsa_cause != C_CCM_CALLBACK) {		crm_err("FSA function called in response to incorect input");		register_fsa_error(C_FSA_INTERNAL, I_FAIL, NULL);		return I_NULL;	}	event = ccm_data->event;	oc = ccm_data->oc;		crm_info("event=%s", ccm_event_name(event));		if(CCM_EVENT_DETAIL /*constant condition*/ || CCM_EVENT_DETAIL_PARTIAL) {		ccm_event_detail(oc, event);	}	if (OC_EV_MS_EVICTED == event) {		/* todo: drop back to S_PENDING instead */		/* get out... NOW!		 *		 * go via the error recovery process so that HA will		 *    restart us if required		 */		register_fsa_error(cause, I_ERROR, msg_data->data);		return I_NULL;	}		/* My understanding is that we will never get both	 * node leaving *and* node joining callbacks at the	 * same time.	 *	 * Gshi concurrs with this	 *	 * Various logic would need to change if this is not	 * the case... so assert its true	 */	CRM_DEV_ASSERT(oc->m_n_in != 0 || oc->m_n_out != 0);	CRM_DEV_ASSERT(oc->m_n_in == 0 || oc->m_n_out == 0);		if(AM_I_DC) {		/* Membership changed, remind everyone we're here.		 * This will aid detection of duplicate DCs		 */		HA_Message *no_op = create_request(			CRM_OP_NOOP, NULL, NULL,			CRM_SYSTEM_DC, CRM_SYSTEM_CRMD, NULL);			send_msg_via_ha(fsa_cluster_conn, no_op);	} else if(oc->m_n_out != 0) {		/* Possibly move this logic to ghash_update_cib_node() */		unsigned lpc = 0;		int offset = oc->m_out_idx;		for(lpc=0; lpc < oc->m_n_out; lpc++) {			const char *uname = oc->m_array[offset+lpc].node_uname;			if(uname == NULL) {				crm_err("CCM node had no name");				continue;							} else if(safe_str_eq(uname, fsa_our_dc)) {				crm_info("Our DC node (%s) left the cluster",					uname);				register_fsa_input(cause, I_ELECTION, NULL);			}		}	}		return return_input;}