示例#1
0
文件: proxy.py 项目: markokr/cc
    def __init__ (self, hname, hcf, ccscript):
        super(ProxyHandler, self).__init__(hname, hcf, ccscript)

        self.ping_remote = self.cf.getbool ("ping", False)
        if self.ping_remote:
            self.echo_stats = EchoState (self.remote_url)
            self.echo_timer = PeriodicCallback (self.ping, self.ping_tick * 1000, self.ioloop)
            self.echo_timer.start()
            self.log.debug ("will ping %s", self.remote_url)
示例#2
0
文件: proxy.py 项目: gamato/hots-cc
    def __init__ (self, hname, hcf, ccscript):
        super(ProxyHandler, self).__init__(hname, hcf, ccscript)

        self.ping_remote = self.cf.getbool ("ping", False)
        if self.ping_remote:
            self.echo_stats = EchoState (self.remote_url)
            self.echo_timer = PeriodicCallback (self.ping, self.ping_tick * 1000, self.ioloop)
            self.echo_timer.start()
            self.log.debug ("will ping %s", self.remote_url)
示例#3
0
文件: proxy.py 项目: gamato/hots-cc
class ProxyHandler (BaseProxyHandler):
    """ Simply proxies further """

    log = skytools.getLogger ('h:ProxyHandler')

    ping_tick = 1

    def __init__ (self, hname, hcf, ccscript):
        super(ProxyHandler, self).__init__(hname, hcf, ccscript)

        self.ping_remote = self.cf.getbool ("ping", False)
        if self.ping_remote:
            self.echo_stats = EchoState (self.remote_url)
            self.echo_timer = PeriodicCallback (self.ping, self.ping_tick * 1000, self.ioloop)
            self.echo_timer.start()
            self.log.debug ("will ping %s", self.remote_url)

    def on_recv (self, zmsg):
        """ Got message from remote CC, process it. """
        try:
            # pongs to our pings should come back w/o any routing info
            if self.ping_remote and zmsg[0] == '':
                self.log.trace ("%r", zmsg)
                cmsg = CCMessage (zmsg)
                req = cmsg.get_dest()
                if req == "echo.response":
                    self._recv_pong (cmsg)
                else:
                    self.log.warn ("unknown msg: %s", req)
        except:
            self.log.exception ("crashed")
        finally:
            super(ProxyHandler, self).on_recv(zmsg)

    def _recv_pong (self, cmsg):
        """ Pong received, evaluate it. """

        msg = cmsg.get_payload (self.xtx)
        if not msg: return

        if msg.orig_target != self.remote_url:
            self.log.warn ("unknown pong: %s", msg.orig_target)
            return
        echo = self.echo_stats
        echo.update_pong (msg)

        rtt = echo.time_pong - msg.orig_time
        if msg.orig_time == echo.time_ping:
            self.log.trace ("echo time: %f s (%s)", rtt, self.remote_url)
        elif rtt <= 5 * self.ping_tick:
            self.log.debug ("late pong: %f s (%s)", rtt, self.remote_url)
        else:
            self.log.info ("too late pong: %f s (%s)", rtt, self.remote_url)

    def _send_ping (self):
        """ Send ping to remote CC. """
        msg = EchoRequestMessage(
                target = self.remote_url)
        cmsg = self.xtx.create_cmsg (msg)
        self.stream.send_cmsg (cmsg)
        self.echo_stats.update_ping (msg)
        self.log.trace ("%r", msg)

    def ping (self):
        """ Echo requesting and monitoring. """
        self.log.trace ("")
        miss = self.echo_stats.time_ping - self.echo_stats.time_pong
        if miss > 5 * self.ping_tick:
            self.log.warn ("no pong from %s for %f s", self.remote_url, miss)
        self._send_ping ()

    def stop (self):
        super(ProxyHandler, self).stop()
        self.log.info ("stopping")
        if hasattr (self, "echo_timer"):
            self.echo_timer.stop()
示例#4
0
文件: proxy.py 项目: postsql/cc
class ProxyHandler(BaseProxyHandler):
    """ Simply proxies further """

    log = skytools.getLogger('h:ProxyHandler')

    ping_tick = 1

    def __init__(self, hname, hcf, ccscript):
        super(ProxyHandler, self).__init__(hname, hcf, ccscript)

        self.ping_remote = self.cf.getbool("ping", False)
        if self.ping_remote:
            self.echo_stats = EchoState(self.remote_url)
            self.echo_timer = PeriodicCallback(self.ping,
                                               self.ping_tick * 1000,
                                               self.ioloop)
            self.echo_timer.start()
            self.log.debug("will ping %s", self.remote_url)

    def on_recv(self, zmsg):
        """ Got message from remote CC, process it. """
        try:
            # pongs to our pings should come back w/o any routing info
            if self.ping_remote and zmsg[0] == '':
                self.log.trace("%r", zmsg)
                cmsg = CCMessage(zmsg)
                req = cmsg.get_dest()
                if req == "echo.response":
                    self._recv_pong(cmsg)
                else:
                    self.log.warn("unknown msg: %s", req)
        except:
            self.log.exception("crashed")
        finally:
            super(ProxyHandler, self).on_recv(zmsg)

    def _recv_pong(self, cmsg):
        """ Pong received, evaluate it. """

        msg = cmsg.get_payload(self.xtx)
        if not msg: return

        if msg.orig_target != self.remote_url:
            self.log.warn("unknown pong: %s", msg.orig_target)
            return
        echo = self.echo_stats
        echo.update_pong(msg)

        rtt = echo.time_pong - msg.orig_time
        if msg.orig_time == echo.time_ping:
            self.log.trace("echo time: %f s (%s)", rtt, self.remote_url)
        elif rtt <= 5 * self.ping_tick:
            self.log.debug("late pong: %f s (%s)", rtt, self.remote_url)
        else:
            self.log.info("too late pong: %f s (%s)", rtt, self.remote_url)

    def _send_ping(self):
        """ Send ping to remote CC. """
        msg = EchoRequestMessage(target=self.remote_url)
        cmsg = self.xtx.create_cmsg(msg)
        self.stream.send_cmsg(cmsg)
        self.echo_stats.update_ping(msg)
        self.log.trace("%r", msg)

    def ping(self):
        """ Echo requesting and monitoring. """
        self.log.trace("")
        echo = self.echo_stats
        if echo.time_ping - echo.time_pong > 5 * self.ping_tick:
            self.log.warn("no pong from %s for %f s", self.remote_url,
                          echo.time_ping - echo.time_pong)
        self._send_ping()

    def stop(self):
        super(ProxyHandler, self).stop()
        self.log.info("stopping")
        if hasattr(self, "echo_timer"):
            self.echo_timer.stop()