Skip to content

Commit

Permalink
Awful hack to run the server multi-threaded
Browse files Browse the repository at this point in the history
Because running it single-threaded was unstable, at least in the tests.

See http://bugs.python.org/issue27392
  • Loading branch information
Jim Fulton committed Jun 26, 2016
1 parent da2e228 commit daca97c
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 12 deletions.
2 changes: 1 addition & 1 deletion src/ZEO/StorageServer.py
Expand Up @@ -50,7 +50,7 @@
from ZODB.serialize import referencesf
from ZODB.utils import oid_repr, p64, u64, z64

from .asyncio.server import Acceptor
from .asyncio.mtacceptor import Acceptor

logger = logging.getLogger('ZEO.StorageServer')

Expand Down
30 changes: 20 additions & 10 deletions src/ZEO/asyncio/mtacceptor.py
Expand Up @@ -81,13 +81,8 @@ def __init__(self, storage_server, addr, ssl):
asyncore.dispatcher.__init__(self, map=self.__socket_map)

self.ssl_context = ssl
if ssl is not None:
self.ssl_wrap_socket = ssl.wrap_socket
self._open_socket()

def ssl_wrap_socket(self, sock, server_side):
return sock

def _open_socket(self):
addr = self.addr

Expand Down Expand Up @@ -165,17 +160,32 @@ def handle_accept(self):
try:
logger.debug("new connection %s" % (addr,))

sock = self.ssl_wrap_socket(sock, server_side=True)

def run():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
zs = self.storage_server.create_client_handler()
protocol = ServerProtocol(loop, self.addr, zs)
protocol.stop = loop.stop
asyncio.async(loop.create_connection((lambda : protocol),
sock=sock),
loop=loop)

if self.ssl_context is None:
cr = loop.create_connection((lambda : protocol), sock=sock)
else:
#######################################################
# XXX See http://bugs.python.org/issue27392 :(
_make_ssl_transport = loop._make_ssl_transport
def make_ssl_transport(*a, **kw):
kw['server_side'] = True
return _make_ssl_transport(*a, **kw)
loop._make_ssl_transport = make_ssl_transport
#
#######################################################
cr = loop.create_connection(
(lambda : protocol), sock=sock,
ssl=self.ssl_context,
server_hostname='fu' # http://bugs.python.org/issue27391
)

asyncio.async(cr, loop=loop)
loop.run_forever()
loop.close()

Expand Down
2 changes: 1 addition & 1 deletion src/ZEO/tests/testZEO.py
Expand Up @@ -1089,7 +1089,7 @@ def runzeo_without_configfile():
------
--T INFO ZEO.StorageServer StorageServer created RW with storages 1RWt
------
--T INFO ZEO.asyncio.server listening on ...
--T INFO ZEO.asyncio... listening on ...
------
--T INFO ZEO.StorageServer closing storage '1'
testing exit immediately
Expand Down

0 comments on commit daca97c

Please sign in to comment.