crm_info("Our DC node (%s) left the cluster", uname);
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 = NULL;	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", 	       *event==OC_EV_MS_NEW_MEMBERSHIP?"NEW MEMBERSHIP":	       *event==OC_EV_MS_NOT_PRIMARY?"NOT PRIMARY":	       *event==OC_EV_MS_PRIMARY_RESTORED?"PRIMARY RESTORED":	       *event==OC_EV_MS_EVICTED?"EVICTED":	       "NO QUORUM MEMBERSHIP");		if(CCM_EVENT_DETAIL) {		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.	 *	 * This logic would need to change if this is not	 * the case	 */		if(oc->m_n_out != 0) {		unsigned lpc = 0;		int offset = oc->m_out_idx;		for(lpc=0; lpc < oc->m_n_out; lpc++) {			crm_data_t *node_state = NULL;						const char *uname = oc->m_array[offset+lpc].node_uname;						crm_info("Node %s has left the cluster,"				 " updating the CIB.", uname);			if(uname == NULL) {				crm_err("CCM node had no name");				continue;							} else if(safe_str_eq(uname, fsa_our_dc)) {				/* did our DC leave us */				register_fsa_input(cause, I_ELECTION, NULL);			} else if(AM_I_DC) {				node_state = create_node_state(					NULL, uname, NULL,					XML_BOOLEAN_NO, NULL, NULL, NULL);								update_local_cib(					create_cib_fragment(node_state, NULL));				free_xml(node_state);			}		}			} else if(oc->m_n_in !=0) {		/* delay the I_NODE_JOIN until they acknowledge our		 * DC status and send us their CIB		 */	} else {		CRM_DEV_ASSERT(oc->m_n_in != 0 || oc->m_n_out != 0);		crm_warn("So why are we here?  What CCM event happened?");	}	return return_input;}