def prepare_response(args): global ClientsAddr, ClientsId global P_Proposals, P_Values, NumAccepted, P_Accepted, NumPrepared [index, prepared_ProposalId, prepared_clientid, prepared_value] = args index = int(index) if not P_Accepted[index]: NumPrepared[index] += 1 if float(P_Proposals[index]) < float(prepared_ProposalId): if ClientsId[index] != "P": propose(message.Message(Addr = ClientsAddr[index], Message="%s:%s"%(ClientsId[index].split(".")[1], P_Proposals[index]))) del ClientsAddr[index] P_Proposals[index] = prepared_ProposalId P_Values[index] = prepared_value ClientsId[index] = prepared_clientid if NumPrepared[index] == communication.MAJORITY and P_Values[index] != "PI": P_Accepted[index] = True response = "A:%d:%s:%s:%s"%(index, P_Proposals[index], ClientsId[index], P_Values[index]) response_mess = message.Message(Wait = True, Message = response) communication.send_mess(response_mess) local_response_mess = message.Message(Local = True, Message = response) communication.send_local_mess(local_response_mess)
def prepare_response(args): global ClientsAddr, ClientsId global P_Proposals, P_Values, NumAccepted, P_Accepted, NumPrepared [index, prepared_ProposalId, prepared_clientid, prepared_value] = args index = int(index) if not P_Accepted[index]: NumPrepared[index] += 1 if float(P_Proposals[index]) < float(prepared_ProposalId): if ClientsId[index] != "P": propose( message.Message( Addr=ClientsAddr[index], Message="%s:%s" % (ClientsId[index].split(".")[1], P_Proposals[index]))) del ClientsAddr[index] P_Proposals[index] = prepared_ProposalId P_Values[index] = prepared_value ClientsId[index] = prepared_clientid if NumPrepared[ index] == communication.MAJORITY and P_Values[index] != "PI": P_Accepted[index] = True response = "A:%d:%s:%s:%s" % (index, P_Proposals[index], ClientsId[index], P_Values[index]) response_mess = message.Message(Wait=True, Message=response) communication.send_mess(response_mess) local_response_mess = message.Message(Local=True, Message=response) communication.send_local_mess(local_response_mess)
def heartbeat_send(): global LAST_BEAT if (time.time()-LAST_BEAT) > BEAT_DELAY: lead = communication.LEADER if not lead or not communication.STATUS[lead]: communication.choose_new_leader() lead = communication.NEW_LEADER heartbeat_mess = "H:%s:%d:%d"%(lead, communication.ROUND, accept.get_largest_index()) communication.send_mess(message.Message(Message = heartbeat_mess)) communication.send_local_mess(message.Message(Local = True, Message = heartbeat_mess)) LAST_BEAT = time.time()
def heartbeat_send(): global LAST_BEAT if (time.time() - LAST_BEAT) > BEAT_DELAY: lead = communication.LEADER if not lead or not communication.STATUS[lead]: communication.choose_new_leader() lead = communication.NEW_LEADER heartbeat_mess = "H:%s:%d:%d" % (lead, communication.ROUND, accept.get_largest_index()) communication.send_mess(message.Message(Message=heartbeat_mess)) communication.send_local_mess( message.Message(Local=True, Message=heartbeat_mess)) LAST_BEAT = time.time()
def propose(mess): global ClientsAddr, ClientsId global P_Proposals, P_Values, NumAccepted, P_Accepted, NumPrepared, Chosen global firstUnchosenIndex, EmptyIndex client_addr = mess.get_addr() data = mess.get_mess() [message_id, value] = data.split(":") if client_addr: clientip = client_addr[0].split(".")[-1] client_id = "%s.%s" % (clientip, message_id) else: client_id = "P" next_index = EmptyIndex if client_id != "P": for index, cid in ClientsId.items(): if cid == client_id: if Chosen[index]: if index in DB_Response.keys(): client_respond(client_addr, index, DB_Response[index]) return else: next_index = index break ClientsAddr[next_index] = client_addr P_Proposals[next_index] = ProposalId P_Values[next_index] = value ClientsId[next_index] = client_id NumPrepared[next_index] = 0 P_Accepted[next_index] = False NumAccepted[next_index] = 0 Chosen[next_index] = False proposal = "P:%s:%s:%s:%d:%d" % (ProposalId, value, client_id, next_index, firstUnchosenIndex) proposal_mess = message.Message(Wait=True, Message=proposal) communication.send_mess(proposal_mess) local_proposal_mess = message.Message(Local=True, Message=proposal) communication.send_local_mess(local_proposal_mess) EmptyIndex += 1
def propose(mess): global ClientsAddr, ClientsId global P_Proposals, P_Values, NumAccepted, P_Accepted, NumPrepared, Chosen global firstUnchosenIndex, EmptyIndex client_addr = mess.get_addr() data = mess.get_mess() [message_id, value] = data.split(":") if client_addr: clientip = client_addr[0].split(".")[-1] client_id = "%s.%s"%(clientip,message_id) else: client_id = "P" next_index = EmptyIndex if client_id != "P": for index, cid in ClientsId.items(): if cid == client_id: if Chosen[index]: if index in DB_Response.keys(): client_respond(client_addr, index, DB_Response[index]) return else: next_index = index break ClientsAddr[next_index] = client_addr P_Proposals[next_index] = ProposalId P_Values[next_index] = value ClientsId[next_index] = client_id NumPrepared[next_index] = 0 P_Accepted[next_index] = False NumAccepted[next_index] = 0 Chosen[next_index] = False proposal = "P:%s:%s:%s:%d:%d"%(ProposalId, value, client_id, next_index, firstUnchosenIndex) proposal_mess = message.Message(Wait = True, Message = proposal) communication.send_mess(proposal_mess) local_proposal_mess = message.Message(Local = True, Message = proposal) communication.send_local_mess(local_proposal_mess) EmptyIndex+=1
def local_message_process(message): data = message.get_mess() # print ("[%s] %s") %("Local", data) data_split = data.split(":") function = data_split[0] response = None if function == "H": heartbeat.heartbeat_process(communication.HOSTNAME, data_split[1:]) elif function == "P": response = accept.propose_process(data_split[1:]) response = "PR:"+response local_response = Message(Local = True, Message = response) communication.send_local_mess(local_response) elif function == "PR": propose.prepare_response(data_split[1:]) elif function == "A": response = accept.accept_response(data_split[1:]) response = "AR:"+response local_response = Message(Local = True, Message = response) communication.send_local_mess(local_response) elif function == "AR": reponse = propose.accept_response(data_split[1:]) if response: response = "S:"+response local_response = Message(Local = True, Message = response) communication.send_local_mess(local_response) elif function == "S": response = accept.success(data_split[1:]) if response: response = "SR:"+response local_response = Message(Local = True, Message = response) communication.send_local_mess(local_response) elif function == "SR": response = propose.success_response(int(data[1])) if response: response = "S:"+response local_response = Message(Local = True, Message = response) communication.send_local_mess(local_response)