Xavier (Open ERP) has proposed merging lp:~openerp-dev/openobject-server/trunk-socket-shutdown-osx-fix-xmo into lp:openobject-server.
Requested reviews: OpenERP Core Team (openerp) For more details, see: https://code.launchpad.net/~openerp-dev/openobject-server/trunk-socket-shutdown-osx-fix-xmo/+merge/64802 OSX, socket shutdowns both sides if any side closes it causing an error 57 'Socket is not connected' on shutdown of the other side. As a result, plenty of error spam in the server log following [email protected] -- https://code.launchpad.net/~openerp-dev/openobject-server/trunk-socket-shutdown-osx-fix-xmo/+merge/64802 Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-server/trunk-socket-shutdown-osx-fix-xmo.
=== modified file 'openerp/netsvc.py' --- openerp/netsvc.py 2011-06-09 07:34:16 +0000 +++ openerp/netsvc.py 2011-06-16 10:29:34 +0000 @@ -26,22 +26,42 @@ import cgitb import errno +import heapq import logging import logging.handlers import os +import platform +import release import socket import sys import threading import time -import release +import warnings from pprint import pformat -import warnings -import heapq # TODO modules that import netsvc only for things from loglevels must be changed to use loglevels. from loglevels import * import tools +def close_socket(sock): + """ Closes a socket instance cleanly + + :param sock: the network socket to close + :type sock: socket.socket + """ + try: + sock.shutdown(socket.SHUT_RDWR) + except socket.error, e: + ## On OSX, socket shutdowns both sides if any side closes it + ## causing an error 57 'Socket is not connected' on shutdown + ## of the other side (or something), see + ## http://bugs.python.org/issue4397 + ## note: stdlib fixed test, not behavior + if e.errno != errno.ENOTCONN or platform.system() != 'Darwin': + raise + sock.close() + + class Service(object): """ Base class for *Local* services @@ -381,19 +401,7 @@ return '\n'.join(res) def _close_socket(self): - if os.name != 'nt': - try: - self.socket.shutdown(getattr(socket, 'SHUT_RDWR', 2)) - except socket.error, e: - if e.errno != errno.ENOTCONN: raise - # OSX, socket shutdowns both sides if any side closes it - # causing an error 57 'Socket is not connected' on shutdown - # of the other side (or something), see - # http://bugs.python.org/issue4397 - self.__logger.debug( - '"%s" when shutting down server socket, ' - 'this is normal under OS X', e) - self.socket.close() + close_socket(self.socket) class OpenERPDispatcherException(Exception): def __init__(self, exception, traceback): === modified file 'openerp/service/netrpc_server.py' --- openerp/service/netrpc_server.py 2011-06-06 07:48:56 +0000 +++ openerp/service/netrpc_server.py 2011-06-16 10:29:34 +0000 @@ -45,16 +45,6 @@ self.sock.settimeout(1200) self.threads = threads - def __del__(self): - if self.sock: - try: - self.socket.shutdown( - getattr(socket, 'SHUT_RDWR', 2)) - except Exception: - pass - # That should garbage-collect and close it, too - self.sock = None - def run(self): self.running = True try: @@ -93,8 +83,7 @@ logging.getLogger('web-services').exception("netrpc: cannot deliver exception message to client") break - self.sock.shutdown(socket.SHUT_RDWR) - self.sock.close() + netsvc.close_socket(self.sock) self.sock = None self.threads.remove(self) self.running = False === modified file 'openerp/tiny_socket.py' --- openerp/tiny_socket.py 2011-01-18 23:52:38 +0000 +++ openerp/tiny_socket.py 2011-06-16 10:29:34 +0000 @@ -24,6 +24,8 @@ import cStringIO import marshal +import netsvc + class Myexception(Exception): """ custome exception object store @@ -56,8 +58,7 @@ self.sock.connect((host, int(port))) def disconnect(self): - self.sock.shutdown(socket.SHUT_RDWR) - self.sock.close() + netsvc.close_socket(self.sock) def mysend(self, msg, exception=False, traceback=None): msg = cPickle.dumps([msg,traceback])
_______________________________________________ Mailing list: https://launchpad.net/~openerp-dev-gtk Post to : [email protected] Unsubscribe : https://launchpad.net/~openerp-dev-gtk More help : https://help.launchpad.net/ListHelp

