def advance_instance(self, new_instance_number, new_current_value, catchup=False): self.master_attempt = False if catchup: super(DedicatedMasterStrategyMixin,self).advance_instance(new_instance_number, new_current_value) self.paxos.prepare() # ensure we won't send any prepare messages with ID 1 (might conflict with the current master) return t = json.loads(new_current_value) # Returns a list: [master_uid, application_value]. Only one element will be valid if t[0] is not None: print ' Lease Granted: ', t[0] self.update_lease( t[0] ) new_current_value = self.current_value else: print ' Application Value:', t[1] new_current_value = t[1] super(DedicatedMasterStrategyMixin,self).advance_instance(new_instance_number, new_current_value) if self.master_uid: master_pid = ProposalID(1,self.master_uid) if self.master_uid == self.network_uid: self.paxos.prepare() for uid in self.peers: self.paxos.receive_promise( Promise(uid, self.network_uid, master_pid, None, None) ) else: self.paxos.receive_prepare( Prepare(self.master_uid, master_pid) ) self.paxos.observe_proposal( master_pid )
def receive_prepare(self, from_uid, instance_number, proposal_id): # Only process messages for the current link in the multi-paxos chain if instance_number != self.instance_number: return m = self.paxos.receive_prepare(Prepare(from_uid, proposal_id)) if isinstance(m, Promise): self.save_state(self.instance_number, self.current_value, m.proposal_id, m.last_accepted_id, m.last_accepted_value) self.messenger.send_promise(from_uid, self.instance_number, m.proposal_id, m.last_accepted_id, m.last_accepted_value) else: self.messenger.send_nack(from_uid, self.instance_number, proposal_id, self.promised_id)