skytools.skylog: recreate udp socket periodically to work around icmp issue
authormartinko <gamato@users.sf.net>
Tue, 11 Dec 2012 21:55:17 +0000 (22:55 +0100)
committermartinko <gamato@users.sf.net>
Tue, 11 Dec 2012 21:55:17 +0000 (22:55 +0100)
"When skylog destination host goes down it doesn't create a new socket when ICMP error message is received." [Jira: DRB-1774]

python/skytools/skylog.py

index 11940ec16f9180ec4e92c204a755a3f5d529c55a..c2a6d58602f081e33dc7bb649811900770e0fafc 100644 (file)
@@ -239,6 +239,8 @@ class SysLogHandler(logging.handlers.SysLogHandler):
     # be compatible with both 2.6 and 2.7
     socktype = socket.SOCK_DGRAM
 
+    _udp_reset = 0
+
     def emit(self, record):
         """
         Emit a record.
@@ -268,6 +270,11 @@ class SysLogHandler(logging.handlers.SysLogHandler):
                     self._connect_unixsocket(self.address)
                     self.socket.send(msg)
             elif self.socktype == socket.SOCK_DGRAM:
+                now = time.time()
+                if now - 1 > self._udp_reset:
+                    self.socket.close()
+                    self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+                    self._udp_reset = now
                 self.socket.sendto(msg, self.address)
             else:
                 self.socket.sendall(msg)