Пример #1
0
    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])
Пример #2
0
 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])
Пример #3
0
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()
Пример #4
0
    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()
Пример #6
0
    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
Пример #7
0
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
Пример #8
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)