[FIX] correct socket closing

lp bug: https://launchpad.net/bugs/574874 fixed

bzr revid: chs@openerp.com-20100518154123-omus9gdr04zts4j0
This commit is contained in:
Christophe Simonis 2010-05-18 17:41:23 +02:00
parent c146c020be
commit 63355adfc3
3 changed files with 35 additions and 24 deletions

View File

@ -24,9 +24,11 @@
#
##############################################################################
import errno
import logging
import logging.handlers
import os
import socket
import sys
import threading
import time
@ -358,6 +360,21 @@ class Server:
res.extend(srv.stats() for srv in cls.__servers)
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()
class OpenERPDispatcherException(Exception):
def __init__(self, exception, traceback):
self.exception = exception

View File

@ -31,9 +31,11 @@
"""
from websrv_lib import *
import netsvc
import errno
import threading
import tools
import os
import select
import socket
import xmlrpclib
@ -128,31 +130,25 @@ class BaseHttpDaemon(threading.Thread, netsvc.Server):
"Error occur when starting the server daemon: %s" % (e,))
raise
@property
def socket(self):
return self.server.socket
def attach(self, path, gw):
pass
def stop(self):
self.running = False
if os.name != 'nt':
try:
self.server.socket.shutdown(
getattr(socket, 'SHUT_RDWR', 2))
except socket.error, e:
if e.errno != 57: 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
netsvc.Logger().notifyChannel(
'server', netsvc.LOG_DEBUG,
'"%s" when shutting down server socket, '
'this is normal under OS X'%e)
self.server.socket.close()
self._close_socket()
def run(self):
self.running = True
while self.running:
self.server.handle_request()
try:
self.server.handle_request()
except (socket.error, select.error), e:
if self.running or e.args[0] != errno.EBADF:
raise
return True
class HttpDaemon(BaseHttpDaemon):

View File

@ -27,6 +27,7 @@ import netsvc
import threading
import tools
import os
import select
import socket
import tiny_socket
@ -50,7 +51,6 @@ class TinySocketClientThread(threading.Thread, netsvc.OpenERPDispatcher):
self.sock = None
def run(self):
# import select
self.running = True
try:
ts = tiny_socket.mysocket(self.sock)
@ -103,10 +103,13 @@ class TinySocketServerThread(threading.Thread,netsvc.Server):
"starting NET-RPC service at %s port %d" % (interface or '0.0.0.0', port,))
def run(self):
# import select
try:
self.running = True
while self.running:
timeout = self.socket.gettimeout()
fd_sets = select.select([self.socket], [], [], timeout)
if not fd_sets[0]:
continue
(clientsocket, address) = self.socket.accept()
ct = TinySocketClientThread(clientsocket, self.threads)
clientsocket = None
@ -129,12 +132,7 @@ class TinySocketServerThread(threading.Thread,netsvc.Server):
self.running = False
for t in self.threads:
t.stop()
try:
self.socket.shutdown(
getattr(socket, 'SHUT_RDWR', 2))
self.socket.close()
except:
return False
self._close_socket()
def stats(self):
res = "Net-RPC: " + ( (self.running and "running") or "stopped")