@@ -22,14 +22,15 @@ def __init__(self, member, execute_fn, peers):
2222 self .proposals = defaultlist ()
2323 self .decisions = defaultlist ()
2424 self .viewid = 0
25+ self .peers = peers
2526 self .last_heard_from = {}
2627 self .lost_peer_proposal = None
2728
2829 def start (self ):
2930 "Try to join the cluster"
3031 if not self .ready :
3132 # TODO: do something more deterministic
32- self .send ([self .member .node .network .rnd .choice (self .member . peers )], 'JOIN' ,
33+ self .send ([self .member .node .network .rnd .choice (self .peers )], 'JOIN' ,
3334 requester = self .address )
3435 self .set_timer (self .JOIN_RETRANSMIT , self .start )
3536
@@ -49,7 +50,7 @@ def invoke(self, proposal):
4950 self .viewid = viewchange .viewid
5051 self .send (
5152 list (set (viewchange .peers ) -
52- set (self .member . peers )), 'WELCOME' ,
53+ set (self .peers )), 'WELCOME' ,
5354 state = self .state ,
5455 slot_num = self .slot_num ,
5556 decisions = self .decisions ,
@@ -58,7 +59,7 @@ def invoke(self, proposal):
5859 if self .address not in viewchange .peers :
5960 self .stop ()
6061 return
61- self .member . view_change ( viewchange )
62+ self .event ( 'view_change' , viewchange = viewchange )
6263 else :
6364 self .logger .info (
6465 "ignored out-of-sequence view change operation" )
@@ -69,8 +70,8 @@ def propose(self, proposal, slot=None):
6970 self .next_slot += 1
7071 self .proposals [slot ] = proposal
7172 # find a leader we think is working, deterministically
72- leaders = [view_primary (self .viewid , self .member . peers )] + \
73- list (self .member . peers )
73+ leaders = [view_primary (self .viewid , self .peers )] + \
74+ list (self .peers )
7475 for leader in leaders :
7576 # TODO: better way to get current time
7677 if self .last_heard_from .get (leader , 0 ) > self .member .node .network .now - 2 * self .HEARTBEAT_INTERVAL :
@@ -91,8 +92,8 @@ def repropose(self):
9192
9293 def heartbeat (self ):
9394 "send and monitor heartbeats"
94- self .send (self .member . peers , 'HEARTBEAT' , sender = self .address )
95- for peer in self .member . peers :
95+ self .send (self .peers , 'HEARTBEAT' , sender = self .address )
96+ for peer in self .peers :
9697 if peer == self .address or peer not in self .last_heard_from :
9798 continue
9899 if self .last_heard_from [peer ] < self .member .node .network .now - 2 * self .HEARTBEAT_INTERVAL :
@@ -108,7 +109,7 @@ def lost_peer(self, peer):
108109 self .lost_peer_proposal = Proposal (None , None ,
109110 ViewChange (
110111 self .viewid + 1 ,
111- tuple (sorted (set (self .member . peers ) - set ([peer ])))))
112+ tuple (sorted (set (self .peers ) - set ([peer ])))))
112113 self .propose (self .lost_peer_proposal )
113114
114115 def do_HEARTBEAT (self , sender ):
@@ -157,10 +158,10 @@ def do_DECISION(self, slot, proposal):
157158 cid = decided_proposal .cid , output = output )
158159
159160 def do_JOIN (self , requester ):
160- if self .ready and requester not in self .member . peers :
161+ if self .ready and requester not in self .peers :
161162 self .last_heard_from [requester ] = self .member .node .network .now
162163 viewchange = ViewChange (self .viewid + 1 ,
163- tuple (sorted (set (self .member . peers ) | set ([requester ]))))
164+ tuple (sorted (set (self .peers ) | set ([requester ]))))
164165 self .propose (Proposal (None , None , viewchange ))
165166
166167 def do_WELCOME (self , state , slot_num , decisions , viewid , peers ):
@@ -172,6 +173,9 @@ def do_WELCOME(self, state, slot_num, decisions, viewid, peers):
172173 self .decisions = defaultlist (decisions )
173174 self .viewid = viewid
174175 self .last_heard_from = {}
175- self .member . view_change ( ViewChange (viewid , peers )) # TODO: WELCOME should include a ViewChange
176+ self .event ( 'view_change' , viewchange = ViewChange (viewid , peers )) # TODO: WELCOME should include a ViewChange
176177 self .heartbeat ()
177178 self .repropose ()
179+
180+ def on_view_change_event (self , viewchange ):
181+ self .peers = viewchange .peers
0 commit comments