forked from aosabook/500lines
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmember_replicated.py
37 lines (30 loc) · 1.45 KB
/
member_replicated.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from member import Member
from replica import Replica
from heartbeat import Heartbeat
from bootstrap import Bootstrap
from acceptor import Acceptor
from leader import Leader
from scout import Scout
from commander import Commander
from seed import Seed
class ClusterMember(Member):
def __init__(self, node, execute_fn, peers,
replica_cls=Replica, acceptor_cls=Acceptor, leader_cls=Leader,
commander_cls=Commander, scout_cls=Scout, heartbeat_cls=Heartbeat,
bootstrap_cls=Bootstrap):
super(ClusterMember, self).__init__(node)
# only start the bootstrap component initially, then hand off to the rest
def bootstrapped(state, slot_num, decisions, viewid, peers):
self.replica = replica_cls(self, execute_fn)
self.acceptor = acceptor_cls(self)
self.leader = leader_cls(self, node.unique_id, commander_cls=commander_cls, scout_cls=scout_cls)
self.heartbeat = heartbeat_cls(self, lambda : node.network.now)
# start up the replica, now that its information is ready
self.replica.start(state, slot_num, decisions, viewid, peers)
self.bootstrap = bootstrap_cls(self, peers, bootstrapped)
def start(self):
self.bootstrap.start()
class ClusterSeed(Member):
def __init__(self, node, initial_state, seed_cls=Seed):
super(ClusterSeed, self).__init__(node)
self.seed = seed_cls(self, initial_state)