示例#1
0
class Follower:
    def __init__(self, servers, leaderID):

        self.servers = servers
        self.sockets = {}
        self.leaderID = leaderID
        self.term = 1
        self.log = Log(None, None, None, True)

        for server in self.servers.items():
            serverID, IP_port = server
            self.createSocket(IP_port[0], IP_port[1], serverID)

        self.initServerThreads()

    def initServerThreads(self):

        for serverID in self.sockets:
            socket = self.sockets[serverID]
            t = threading.Thread(
                target=self.server_loop,
                args=(serverID, socket),
            )
            t.start()

    def createSocket(self, IP, port, serverID):

        context = zmq.Context()
        socket = context.socket(zmq.ROUTER)

        if IP == 'localhost':
            addr = "tcp://*:{0}".format(port)
        else:
            addr = "tcp://{0}:{1}".format(IP, port)

        socket.bind(addr)
        self.sockets[serverID] = socket
        _globals._print("From Server:", serverID, "Created Socket:", addr)

    def server_loop(self, serverID, socket):
        recent_LogIdx = None

        while True:
            clientID, msg = socket.recv_multipart()
            if b'Connection Request' == msg[:18]:
                _globals._print("From server:", serverID, "|", msg)
                time.sleep(2.1)
                socket.send_multipart([clientID, b'Connection ACK'])
                continue

            else:
                if recent_LogIdx is not None and recent_LogIdx == self.log.get_entry_logIndex(
                        msg):
                    continue

                recent_LogIdx = self.log.get_entry_logIndex(msg)
                with _globals.print_lock:
                    print("Reporting from server:", serverID)
                    print("Received a message from leader:", ord(clientID))
                    logger.print_entry_buffer(self.log, msg)

                success = True
                followerTerm = self.term
                RESP = msgpack.packb([success, followerTerm])
                delay = random.uniform(0.3, 0.8)
                time.sleep(delay)
                socket.send_multipart([clientID, RESP])