def __init__(self, logger, host, port): cfg = SyncObjConf() cfg.fullDumpFile = 'raft.bin' cfg.logCompactionMinTime = 10 cfg.useFork = True self.serv = ThreadXMLRPCServer( (host, port), logRequests=True) for name in self._rpc_methods: self.serv.register_function(getattr(self, name)) self.logger = logger self.host = host self.port = port self.lock = RWLock() self.act_vol_serv = dict() self.writable_vid = ReplList() # 可写的vid self.vid = ReplCounter() self.fkey = ReplCounter() self.db = ReplDict() super(Master, self).__init__(config.addr, config.clusters, cfg, consumers=[self.vid, self.fkey, self.db, self.writable_vid])
def __init__(self, my_addr, partners_addrs): self.log = {} self.al = ReplDict() #adjacency list self.lock = threading.Lock() self.rwlock = RWLock() self.interfaces = dict() #for talking with other servers syncObj = SyncObj(my_addr, partners_addrs, consumers=[self.al])
def test_batteriesCommon(): d1 = ReplDict() l1 = ReplLockManager(autoUnlockTime=30.0) d2 = ReplDict() l2 = ReplLockManager(autoUnlockTime=30.0) a = [getNextAddr(), getNextAddr()] o1 = TestObj(a[0], [a[1]], TEST_TYPE.AUTO_TICK_1, consumers=[d1, l1]) o2 = TestObj(a[1], [a[0]], TEST_TYPE.AUTO_TICK_1, consumers=[d2, l2]) doAutoTicks(10.0, stopFunc=lambda: o1.isReady() and o2.isReady()) assert o1.isReady() and o2.isReady() d1.set('testKey', 'testValue', sync=True) doAutoTicks(3.0, stopFunc=lambda: d2.get('testKey') == 'testValue') assert d2['testKey'] == 'testValue' d2.pop('testKey', sync=True) doAutoTicks(3.0, stopFunc=lambda: d1.get('testKey') == None) assert d1.get('testKey') == None assert l1.tryAcquire('test.lock1', sync=True) == True assert l2.tryAcquire('test.lock1', sync=True) == False assert l2.isAcquired('test.lock1') == False l1.release('test.lock1', sync=True) assert l2.tryAcquire('test.lock1', sync=True) == True assert d1.setdefault('keyA', 'valueA', sync=True) == 'valueA' assert d2.setdefault('keyA', 'valueB', sync=True) == 'valueA' d2.pop('keyA', sync=True) assert d2.setdefault('keyA', 'valueB', sync=True) == 'valueB' o1.destroy() o2.destroy() l1.destroy() l2.destroy()
def __init__(self, serverport, other_members): logger.info("Initializing SyncObj with serverport %s (others: %s)" % (serverport, other_members)) self.replicated_game_state = ReplDict() conf = SyncObjConf(dynamicMembershipChange=False) super(ShardSyncWatcher, self).__init__( serverport, other_members, conf=conf, consumers=[self.replicated_game_state]) self.__action_clock = 0
def __init__(self, port, members, secret=""): JSBASE.__init__(self) self._members = members self.port = port self.dict1 = ReplDict() remotes = ["%s:%s" % item for item in self.members] cfg = SyncObjConf(autoTick=True) cfg.onReady = self.onReady if secret is not "" and secret is not None: print("SECRET") cfg.password = secret cfg.appendEntriesPeriod = 0.01 cfg.appendEntriesUseBatch = True cfg.raftMinTimeout = 0.4 cfg.raftMaxTimeout = 1.4 cfg.dynamicMembershipChange = True cfg.onStateChanged = None cfg.commandsWaitLeader = False cfg.connectionRetryTime = 5.0 # connect to other down nodes every so many secs cfg.connectionTimeout = 3.5 cfg.leaderFallbackTimeout = 10.0 cfg.journalFile = "/tmp/raft/raft_%s" % self.port cfg.leaderFallbackTimeout = True cfg.logCompactionMinEntries = 1000 cfg.logCompactionMinTime = 60 self._log_debug("port:%s" % self.port) self._log_debug("members:%s" % remotes) # self._log_debug("secret:%s"%secret) self.syncobj = SyncObj("localhost:%s" % port, remotes, consumers=[self.dict1], conf=cfg) # for i in range(100000000): # time.sleep(0.001) # # self.syncobj.doTick() # from IPython import embed;embed(colors='Linux') # s while self.syncobj.isReady() == False: time.sleep(1) print("wait sync") time.sleep(1) self.start()
def __initDistributedDict(self): rr_raft = ReplDict() config = SyncObjConf(appendEntriesUseBatch=True) syncObj = SyncObj(self.__node, self.__other_nodes, consumers=[rr_raft], conf=config) if not self.__silent: print "Initializing Raft..." while not syncObj.isReady(): continue if not self.__silent: print "Raft initialized!" return rr_raft
def test_ReplDict(): d = ReplDict() d.reset({ 1: 1, 2: 22, }, _doApply=True) assert d.rawData() == { 1: 1, 2: 22, } d.__setitem__(1, 10, _doApply=True) assert d.rawData() == { 1: 10, 2: 22, } d.set(1, 20, _doApply=True) assert d.rawData() == { 1: 20, 2: 22, } assert d.setdefault(1, 50, _doApply=True) == 20 assert d.setdefault(3, 50, _doApply=True) == 50 d.update({ 5: 5, 6: 7, }, _doApply=True) assert d.rawData() == { 1: 20, 2: 22, 3: 50, 5: 5, 6: 7, } assert d.pop(3, _doApply=True) == 50 assert d.pop(6, _doApply=True) == 7 assert d.pop(6, _doApply=True) == None assert d.pop(6, 0, _doApply=True) == 0 assert d.rawData() == { 1: 20, 2: 22, 5: 5, } assert d[1] == 20 assert d.get(2) == 22 assert d.get(22) == None assert d.get(22, 10) == 10 assert len(d) == 3 assert 2 in d assert 22 not in d assert sorted(d.keys()) == [1, 2, 5] assert sorted(d.values()) == [5, 20, 22] assert d.items() == d.rawData().items() d.clear(_doApply=True) assert len(d) == 0
from pywebio import start_server from pywebio.input import * from pywebio.output import * from pywebio.session import * from pywebio import session from raft_server import join_cluster, get_node_info # 最大消息记录保存 MAX_MESSAGES_CNT = 10**4 # 管理员账户名 ADMIN_USER = '******' chat_msgs = ReplList() # 聊天记录 (name, msg) node_user_cnt = ReplDict() # 每个节点的用户数 node_webui_addr = ReplDict() # 每个节点Web聊天室的地址 local_online_users = set() # 本节点在线用户 raft_server = None def onStateChanged(oldState, newState, node): """节点角色发生变化时的回调函数""" states = ["folower", "candidate", "leader"] send_msg(ADMIN_USER, '节点`%s`角色发生变化, `%s` -> `%s`' % (node, states[oldState], states[newState]), instant_output=False)