stopTimer(integration_timer);
do_dc_join_req(long long action,		    enum crmd_fsa_cause cause,		    enum crmd_fsa_state cur_state,		    enum crmd_fsa_input current_input,		    void *data){	xmlNodePtr generation;	xmlNodePtr join_ack = (xmlNodePtr)data;	const char *ack_nack = CRMD_JOINSTATE_MEMBER;	gboolean is_a_member  = FALSE;	const char *join_from = xmlGetProp(join_ack, XML_ATTR_HOSTFROM);	const char *ref       = xmlGetProp(join_ack, XML_ATTR_REFERENCE);	gpointer join_node =		g_hash_table_lookup(fsa_membership_copy->members, join_from);	crm_debug("Processing req from %s", join_from);		if(join_node != NULL) {		is_a_member = TRUE;	}		generation = find_xml_node(join_ack, "generation_tuple");	if(compare_cib_generation(our_generation, generation) < 0) {		clear_bit_inplace(fsa_input_register, R_HAVE_CIB);		max_generation_from = join_from;	}		crm_debug("Welcoming node %s after ACK (ref %s)", join_from, ref);		if(is_a_member == FALSE) {		crm_err("Node %s is not known to us (ref %s)", join_from, ref);		/* nack them now so they are not counted towards the		 * expected responses		 */		char *local_from = crm_strdup(join_from);		char *local_down = crm_strdup(CRMD_JOINSTATE_DOWN);		finalize_join_for(local_from, local_down, NULL);		crm_free(local_from);		crm_free(local_down);				return I_FAIL;	} else if(/* some reason */ 0) {		/* NACK this client */		ack_nack = CRMD_JOINSTATE_DOWN;	}		/* add them to our list of CRMD_STATE_ACTIVE nodes	   TODO: check its not already there	*/	g_hash_table_insert(		join_requests, crm_strdup(join_from), crm_strdup(ack_nack));	if(g_hash_table_size(join_requests)	   >= fsa_membership_copy->members_size) {		crm_info("That was the last outstanding join ack");		return I_SUCCESS;	}	/* dont waste time by invoking the PE yet; */	crm_debug("Still waiting on %d outstanding join acks",		  fsa_membership_copy->members_size		  - g_hash_table_size(join_requests));		return I_NULL;}