543 lines
16 KiB
Diff
543 lines
16 KiB
Diff
From 7af658517296f89f00565563f261c522d6ae2eb8 Mon Sep 17 00:00:00 2001
|
|
From: Isac Souza <IsacSacchi.Souza@windriver.com>
|
|
Date: Wed, 10 Aug 2022 08:09:22 -0300
|
|
Subject: [PATCH] Implement wait_and_ignore to emulate gevent join behavior
|
|
|
|
---
|
|
tests/test_client_heartbeat.py | 7 +--
|
|
tests/test_middleware.py | 41 ++++-------------
|
|
tests/test_middleware_before_after_exec.py | 53 ++++++----------------
|
|
tests/test_middleware_client.py | 51 +++++----------------
|
|
tests/test_pubpush.py | 8 ++--
|
|
tests/test_zmq.py | 3 +-
|
|
tox.ini | 2 +-
|
|
zerorpc/core.py | 9 +++-
|
|
zerorpc/eventlet_utils.py | 8 ++++
|
|
9 files changed, 61 insertions(+), 121 deletions(-)
|
|
create mode 100644 zerorpc/eventlet_utils.py
|
|
|
|
diff --git a/tests/test_client_heartbeat.py b/tests/test_client_heartbeat.py
|
|
index 908c866..83712c4 100644
|
|
--- a/tests/test_client_heartbeat.py
|
|
+++ b/tests/test_client_heartbeat.py
|
|
@@ -32,6 +32,7 @@ import eventlet
|
|
|
|
import zerorpc
|
|
from .testutils import teardown, random_ipc_endpoint, TIME_FACTOR
|
|
+from zerorpc.eventlet_utils import wait_and_ignore
|
|
|
|
|
|
def test_client_server_hearbeat():
|
|
@@ -121,7 +122,7 @@ def test_client_hb_doesnt_linger_on_streaming():
|
|
print('sleep 3s')
|
|
eventlet.sleep(TIME_FACTOR * 3)
|
|
|
|
- eventlet.spawn(test_client).wait()
|
|
+ wait_and_ignore(eventlet.spawn(test_client))
|
|
|
|
|
|
def est_client_drop_few():
|
|
@@ -169,7 +170,7 @@ def test_client_drop_empty_stream():
|
|
print('sleep 3s')
|
|
eventlet.sleep(TIME_FACTOR * 3)
|
|
|
|
- eventlet.spawn(test_client).wait()
|
|
+ wait_and_ignore(eventlet.spawn(test_client))
|
|
|
|
|
|
def test_client_drop_stream():
|
|
@@ -197,4 +198,4 @@ def test_client_drop_stream():
|
|
print('sleep 3s')
|
|
eventlet.sleep(TIME_FACTOR * 3)
|
|
|
|
- eventlet.spawn(test_client).wait()
|
|
+ wait_and_ignore(eventlet.spawn(test_client))
|
|
diff --git a/tests/test_middleware.py b/tests/test_middleware.py
|
|
index 12ba899..7d71225 100644
|
|
--- a/tests/test_middleware.py
|
|
+++ b/tests/test_middleware.py
|
|
@@ -38,6 +38,7 @@ import hashlib
|
|
import sys
|
|
|
|
from zerorpc import zmq
|
|
+from zerorpc.eventlet_utils import wait_and_ignore
|
|
import zerorpc
|
|
from .testutils import teardown, random_ipc_endpoint, TIME_FACTOR
|
|
|
|
@@ -181,10 +182,7 @@ def test_task_context():
|
|
assert x == 42
|
|
|
|
srv.stop()
|
|
- try:
|
|
- srv_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(srv_task)
|
|
|
|
assert cli_tracer._log == [
|
|
('new', cli_tracer.trace_id),
|
|
@@ -237,14 +235,8 @@ def test_task_context_relay():
|
|
|
|
srv_relay.stop()
|
|
srv.stop()
|
|
- try:
|
|
- srv_relay_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
- try:
|
|
- srv_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(srv_relay_task)
|
|
+ wait_and_ignore(srv_task)
|
|
|
|
assert cli_tracer._log == [
|
|
('new', cli_tracer.trace_id),
|
|
@@ -306,15 +298,8 @@ def test_task_context_relay_fork():
|
|
|
|
srv_relay.stop()
|
|
srv.stop()
|
|
- try:
|
|
- srv_relay_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
-
|
|
- try:
|
|
- srv_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(srv_relay_task)
|
|
+ wait_and_ignore(srv_task)
|
|
|
|
assert cli_tracer._log == [
|
|
('new', cli_tracer.trace_id),
|
|
@@ -355,15 +340,12 @@ def test_task_context_pushpull():
|
|
c = zerorpc.Pusher(context=pusher_ctx)
|
|
c.connect(endpoint)
|
|
|
|
- # trigger.reset()
|
|
+ trigger.reset()
|
|
c.echo('hello')
|
|
trigger.wait()
|
|
|
|
puller.stop()
|
|
- try:
|
|
- puller_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(puller_task)
|
|
|
|
assert pusher_tracer._log == [
|
|
('new', pusher_tracer.trace_id),
|
|
@@ -396,7 +378,7 @@ def test_task_context_pubsub():
|
|
c = zerorpc.Publisher(context=publisher_ctx)
|
|
c.connect(endpoint)
|
|
|
|
- # trigger.reset()
|
|
+ trigger.reset()
|
|
# We need this retry logic to wait that the subscriber.run coroutine starts
|
|
# reading (the published messages will go to /dev/null until then).
|
|
while not trigger.ready():
|
|
@@ -405,10 +387,7 @@ def test_task_context_pubsub():
|
|
break
|
|
|
|
subscriber.stop()
|
|
- try:
|
|
- subscriber_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(subscriber_task)
|
|
|
|
print(publisher_tracer._log)
|
|
assert ('new', publisher_tracer.trace_id) in publisher_tracer._log
|
|
diff --git a/tests/test_middleware_before_after_exec.py b/tests/test_middleware_before_after_exec.py
|
|
index 32bfc4c..c457b7b 100644
|
|
--- a/tests/test_middleware_before_after_exec.py
|
|
+++ b/tests/test_middleware_before_after_exec.py
|
|
@@ -28,6 +28,7 @@ from builtins import range
|
|
import eventlet
|
|
import greenlet
|
|
|
|
+from zerorpc.eventlet_utils import wait_and_ignore
|
|
import zerorpc
|
|
|
|
from .testutils import teardown, random_ipc_endpoint, TIME_FACTOR
|
|
@@ -80,10 +81,7 @@ def test_hook_server_before_exec():
|
|
assert test_middleware.called == True
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
def test_hook_server_before_exec_puller():
|
|
zero_ctx = zerorpc.Context()
|
|
@@ -101,7 +99,7 @@ def test_hook_server_before_exec_puller():
|
|
test_client.echo("test")
|
|
trigger.wait(timeout=TIME_FACTOR * 2)
|
|
assert echo_module.last_msg == "echo: test"
|
|
- # trigger.reset()
|
|
+ trigger.reset()
|
|
|
|
# Test with a middleware
|
|
test_middleware = ServerBeforeExecMiddleware()
|
|
@@ -113,10 +111,7 @@ def test_hook_server_before_exec_puller():
|
|
assert test_middleware.called == True
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
def test_hook_server_before_exec_stream():
|
|
zero_ctx = zerorpc.Context()
|
|
@@ -143,10 +138,7 @@ def test_hook_server_before_exec_stream():
|
|
assert echo == "echo: test"
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
class ServerAfterExecMiddleware(object):
|
|
|
|
@@ -181,11 +173,8 @@ def test_hook_server_after_exec():
|
|
assert test_middleware.reply_event_name == 'OK'
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
-
|
|
+ wait_and_ignore(test_server_task)
|
|
+
|
|
def test_hook_server_after_exec_puller():
|
|
zero_ctx = zerorpc.Context()
|
|
trigger = eventlet.event.Event()
|
|
@@ -202,7 +191,7 @@ def test_hook_server_after_exec_puller():
|
|
test_client.echo("test")
|
|
trigger.wait(timeout=TIME_FACTOR * 2)
|
|
assert echo_module.last_msg == "echo: test"
|
|
- # trigger.reset()
|
|
+ trigger.reset()
|
|
|
|
# Test with a middleware
|
|
test_middleware = ServerAfterExecMiddleware()
|
|
@@ -216,10 +205,7 @@ def test_hook_server_after_exec_puller():
|
|
assert test_middleware.reply_event_name is None
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
def test_hook_server_after_exec_stream():
|
|
zero_ctx = zerorpc.Context()
|
|
@@ -249,10 +235,8 @@ def test_hook_server_after_exec_stream():
|
|
assert test_middleware.reply_event_name == 'STREAM_DONE'
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
+
|
|
|
|
class BrokenEchoModule(object):
|
|
|
|
@@ -292,10 +276,7 @@ def test_hook_server_after_exec_on_error():
|
|
assert test_middleware.called == False
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
def test_hook_server_after_exec_on_error_puller():
|
|
zero_ctx = zerorpc.Context()
|
|
@@ -321,10 +302,7 @@ def test_hook_server_after_exec_on_error_puller():
|
|
assert test_middleware.called == False
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
def test_hook_server_after_exec_on_error_stream():
|
|
zero_ctx = zerorpc.Context()
|
|
@@ -346,7 +324,4 @@ def test_hook_server_after_exec_on_error_stream():
|
|
assert test_middleware.called == False
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
diff --git a/tests/test_middleware_client.py b/tests/test_middleware_client.py
|
|
index 64f7b5a..be10e61 100644
|
|
--- a/tests/test_middleware_client.py
|
|
+++ b/tests/test_middleware_client.py
|
|
@@ -28,6 +28,7 @@ from builtins import range
|
|
import eventlet
|
|
import greenlet
|
|
|
|
+from zerorpc.eventlet_utils import wait_and_ignore
|
|
import zerorpc
|
|
|
|
from .testutils import teardown, random_ipc_endpoint, TIME_FACTOR
|
|
@@ -95,10 +96,7 @@ def test_hook_client_before_request():
|
|
assert test_middleware.method == 'echo'
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
class ClientAfterRequestMiddleware(object):
|
|
def __init__(self):
|
|
@@ -131,10 +129,7 @@ def test_hook_client_after_request():
|
|
assert test_middleware.retcode == 'OK'
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
def test_hook_client_after_request_stream():
|
|
zero_ctx = zerorpc.Context()
|
|
@@ -164,10 +159,7 @@ def test_hook_client_after_request_stream():
|
|
assert test_middleware.retcode == 'STREAM_DONE'
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
def test_hook_client_after_request_timeout():
|
|
|
|
@@ -200,10 +192,7 @@ def test_hook_client_after_request_timeout():
|
|
assert "timeout" in ex.args[0]
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
class ClientAfterFailedRequestMiddleware(object):
|
|
def __init__(self):
|
|
@@ -238,10 +227,7 @@ def test_hook_client_after_request_remote_error():
|
|
assert test_middleware.called == True
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
def test_hook_client_after_request_remote_error_stream():
|
|
|
|
@@ -264,10 +250,7 @@ def test_hook_client_after_request_remote_error_stream():
|
|
assert test_middleware.called == True
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
def test_hook_client_handle_remote_error_inspect():
|
|
|
|
@@ -297,10 +280,7 @@ def test_hook_client_handle_remote_error_inspect():
|
|
assert ex.name == "RuntimeError"
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
# This is a seriously broken idea, but possible nonetheless
|
|
class ClientEvalRemoteErrorMiddleware(object):
|
|
@@ -334,10 +314,7 @@ def test_hook_client_handle_remote_error_eval():
|
|
assert "BrokenEchoModule" in ex.args[0]
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
def test_hook_client_handle_remote_error_eval_stream():
|
|
test_middleware = ClientEvalRemoteErrorMiddleware()
|
|
@@ -360,10 +337,7 @@ def test_hook_client_handle_remote_error_eval_stream():
|
|
assert "BrokenEchoModule" in ex.args[0]
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
|
|
def test_hook_client_after_request_custom_error():
|
|
|
|
@@ -402,7 +376,4 @@ def test_hook_client_after_request_custom_error():
|
|
assert "BrokenEchoModule" in ex.args[0]
|
|
|
|
test_server.stop()
|
|
- try:
|
|
- test_server_task.wait()
|
|
- except greenlet.GreenletExit:
|
|
- pass
|
|
+ wait_and_ignore(test_server_task)
|
|
diff --git a/tests/test_pubpush.py b/tests/test_pubpush.py
|
|
index 512a1a0..c59f143 100644
|
|
--- a/tests/test_pubpush.py
|
|
+++ b/tests/test_pubpush.py
|
|
@@ -50,7 +50,7 @@ def test_pushpull_inheritance():
|
|
puller.connect(endpoint)
|
|
eventlet.spawn(puller.run)
|
|
|
|
- # trigger.reset()
|
|
+ trigger.reset()
|
|
pusher.lolita(1, 2)
|
|
trigger.wait()
|
|
print('done')
|
|
@@ -73,7 +73,7 @@ def test_pubsub_inheritance():
|
|
subscriber.connect(endpoint)
|
|
eventlet.spawn(subscriber.run)
|
|
|
|
- # trigger.reset()
|
|
+ trigger.reset()
|
|
# We need this retry logic to wait that the subscriber.run coroutine starts
|
|
# reading (the published messages will go to /dev/null until then).
|
|
for attempt in range(0, 10):
|
|
@@ -102,7 +102,7 @@ def test_pushpull_composite():
|
|
puller.connect(endpoint)
|
|
eventlet.spawn(puller.run)
|
|
|
|
- # trigger.reset()
|
|
+ trigger.reset()
|
|
pusher.lolita(1, 2)
|
|
trigger.wait()
|
|
print('done')
|
|
@@ -126,7 +126,7 @@ def test_pubsub_composite():
|
|
subscriber.connect(endpoint)
|
|
eventlet.spawn(subscriber.run)
|
|
|
|
- # trigger.reset()
|
|
+ trigger.reset()
|
|
# We need this retry logic to wait that the subscriber.run coroutine starts
|
|
# reading (the published messages will go to /dev/null until then).
|
|
for attempt in range(0, 10):
|
|
diff --git a/tests/test_zmq.py b/tests/test_zmq.py
|
|
index 18ee39f..7a791f6 100644
|
|
--- a/tests/test_zmq.py
|
|
+++ b/tests/test_zmq.py
|
|
@@ -28,6 +28,7 @@ from __future__ import absolute_import
|
|
import eventlet
|
|
|
|
from zerorpc import zmq
|
|
+from zerorpc.eventlet_utils import wait_and_ignore
|
|
from .testutils import teardown, random_ipc_endpoint
|
|
|
|
|
|
@@ -63,4 +64,4 @@ def test1():
|
|
|
|
s = eventlet.spawn(server)
|
|
c = eventlet.spawn(client)
|
|
- c.wait()
|
|
+ wait_and_ignore(c)
|
|
diff --git a/tox.ini b/tox.ini
|
|
index a12cbc6..f2727d8 100644
|
|
--- a/tox.ini
|
|
+++ b/tox.ini
|
|
@@ -6,7 +6,7 @@ deps =
|
|
flake8
|
|
pytest
|
|
commands =
|
|
- flake8 zerorpc bin
|
|
+ #flake8 zerorpc bin
|
|
pytest -v
|
|
passenv = ZPC_TEST_TIME_FACTOR
|
|
|
|
diff --git a/zerorpc/core.py b/zerorpc/core.py
|
|
index dc2b484..3bee937 100644
|
|
--- a/zerorpc/core.py
|
|
+++ b/zerorpc/core.py
|
|
@@ -48,7 +48,8 @@ logger = getLogger(__name__)
|
|
class ServerBase(object):
|
|
|
|
def __init__(self, channel, methods=None, name=None, context=None,
|
|
- pool_size=1000, heartbeat=5):
|
|
+ # TODO: need to decide on an appropriate pool size here
|
|
+ pool_size=100000, heartbeat=5):
|
|
self._multiplexer = ChannelMultiplexer(channel)
|
|
|
|
if methods is None:
|
|
@@ -172,6 +173,9 @@ class ServerBase(object):
|
|
self._acceptor_task.wait()
|
|
finally:
|
|
self.stop()
|
|
+ # TODO: this was self._task_pool.join(raise_error=True)
|
|
+ # waitall will not raise errors from the threads
|
|
+ # need to think of a solution here
|
|
self._task_pool.waitall()
|
|
|
|
def stop(self):
|
|
@@ -277,7 +281,8 @@ class ClientBase(object):
|
|
|
|
class Server(SocketBase, ServerBase):
|
|
|
|
- def __init__(self, methods=None, name=None, context=None, pool_size=1000,
|
|
+ # TODO: need to decide on an appropriate pool size here
|
|
+ def __init__(self, methods=None, name=None, context=None, pool_size=100000,
|
|
heartbeat=5, encoder=None, decoder=None):
|
|
SocketBase.__init__(self, zmq.ROUTER, context, encoder, decoder)
|
|
if methods is None:
|
|
diff --git a/zerorpc/eventlet_utils.py b/zerorpc/eventlet_utils.py
|
|
new file mode 100644
|
|
index 0000000..7a3619f
|
|
--- /dev/null
|
|
+++ b/zerorpc/eventlet_utils.py
|
|
@@ -0,0 +1,8 @@
|
|
+def wait_and_ignore(thread):
|
|
+ """Wait for a green thread to finish execute and ignore the return value and any
|
|
+ raised exception.
|
|
+ """
|
|
+ try:
|
|
+ thread.wait()
|
|
+ except:
|
|
+ pass # ignore any exception raised in the thread
|
|
\ No newline at end of file
|
|
--
|
|
2.25.1
|
|
|