Exemplo n.º 1
0
/*发送accept_req到所有的acceptor进行第二阶段的提议*/
static void send_accepts(struct evproposer* p, accept_req* ar)
{
	int i;
	for(i = 0; i < peers_count(p->acceptors); i++){
		struct bufferevent* bev = peers_get_buffer(p->acceptors, i);
		sendbuf_add_accept_req(bev, ar);
	}
}
Exemplo n.º 2
0
static void
leader_execute_p2(p_inst_info * ii) {
    
    if(ii->p1_value == NULL && ii->p2_value == NULL) {
        //Happens when p1 completes without value        
        //Assign a p2_value and execute
        ii->p2_value = vh_get_next_pending();
        assert(ii->p2_value != NULL);
        
    } else if (ii->p1_value != NULL) {
        //Only p1 value is present, MUST execute p2 with it
        //Save it as p2 value and execute
        ii->p2_value = ii->p1_value;
        ii->p1_value = NULL;
        ii->p1_value_ballot = 0;
        
    } else if (ii->p2_value != NULL) {
        // Only p2 valye is present
        //Do phase 2 with it
        
    } else {
        // There are both p1 and p2 value
        //Compare them
        if(vh_value_compare(ii->p1_value, ii->p2_value) == 0) {
            // Same value, just delete p1_value
            PAX_FREE(ii->p1_value);
            ii->p1_value = NULL;
            ii->p1_value_ballot = 0;
        } else {
            // Different values
            // p2_value is pushed back to pending list
            vh_push_back_value(ii->p2_value);
            // Must execute p2 with p1 value
            ii->p2_value = ii->p1_value;
            ii->p1_value = NULL;
            ii->p1_value_ballot = 0;            
        }
    }
    //Change instance status
    ii->status = p2_pending;

    //Send the accept request
    sendbuf_add_accept_req(to_acceptors, ii->iid, ii->my_ballot, ii->p2_value->value, ii->p2_value->value_size);
    
    //Set the deadline for this instance
    leader_set_expiration(ii, P2_TIMEOUT_INTERVAL);
}