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)
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()
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()