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

Reply via email to