self.servers:List[Address]=servers# All servers addresses TODO: is this a tuple or list of server addresses?
# Sets up other variables
self.is_leader:bool=False# Are we the leader?
self.ballot:BallotNumber=BallotNumber(1,self.address)# Our ballot number
self.highestBallotSeen:BallotNumber=BallotNumber(0,self.address)# Highest ballot number seen
self.proposals:Dict[int,BallotValuePair]=dict()# Used by leader to send P2A to acceptors, slot number -> proposal
self.accepted:Dict[int,BallotValuePair]=dict()# Used by acceptors in P2A and also P1B, slot number -> proposal
self.log:Dict[int,BallotValuePair]=dict()# The log
self.leader_recent_ping:bool=False# True if we think leader is alive
self.is_leader:bool=False# Are we the leader?
self.ballot:BallotNumber=BallotNumber(1,self.address)# Our ballot number
self.highest_ballot_seen:BallotNumber=BallotNumber(0,self.address)# Highest ballot number seen
self.proposals:Dict[int,BallotValuePair]=dict()# Used by leader to send P2A to acceptors, slot number -> proposal
self.accepted:Dict[int,BallotValuePair]=dict()# Used by acceptors in P2A and also P1B, slot number -> proposal
self.log:Dict[int,BallotValuePair]=dict()# The log
self.leader_recent_ping:bool=False# True if we think leader is alive
# for proposal phase
self.slot_in:int=1# First non-executed proposal slot (+1 last executed slot)
self.slot_out:int=1# First empty slot (+1 last proposed slot)
self.slot_to_acceptors:DefaultDict[int,Set[Tuple[str,int]]]=defaultdict(set)# Used by leader to decide majority for each slot after P2B, Multimap<Integer, Address>
self.slot_in:int=1# First non-executed proposal slot (+1 last executed slot)
self.slot_out:int=1# First empty slot (+1 last proposed slot)
self.slot_to_acceptors:DefaultDict[int,Set[Address]]=defaultdict(set)# Used by leader to decide majority for each slot after P2B, Multimap<Integer, Address>
# for leader election
self.voters:Set[Tuple[str,int]]=set()# Yes votes for leader election
self.p1b_replies:Dict[int,BallotValuePair]=dict()# Accepted values for each slot by acceptors that voted yes, slot number -> proposal
self.voters:Set[Address]=set()# Yes votes for leader election, set of addresses
self.p1b_replies:Dict[int,BallotValuePair]=dict()# Accepted values for each slot by acceptors that voted yes, slot number -> proposal
# ...
# Default leader during setup
...
...
@@ -47,6 +51,13 @@ class Paxos(socketserver.TCPServer):