Skip to content

Commit 3390689

Browse files
authored
Add more logging for flaky add_distributed_object_listener_object_des… (#283)
* Add more logging for flaky add_distributed_object_listener_object_destroyed test The test failed again recently on the nightly test runner. I could not reproduce the problem locally, or see a problem in the implementation or test. To understand the situation better, improved the `assertTrueEventually` utility method to raise the last error occured and added a context manager to change the log level for the duration of the test. Also, improved some parts of the `add_distributed_object_listener` by removing some unncessary closure definitions. * display assertion errors better in Python2
1 parent 4bd0d06 commit 3390689

File tree

4 files changed

+40
-21
lines changed

4 files changed

+40
-21
lines changed

hazelcast/client.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -530,23 +530,19 @@ def add_distributed_object_listener(self, listener_func):
530530
hazelcast.future.Future[str]: A registration id which is used as a key to remove the listener.
531531
"""
532532
is_smart = self.config.smart_routing
533-
request = client_add_distributed_object_listener_codec.encode_request(is_smart)
533+
codec = client_add_distributed_object_listener_codec
534+
request = codec.encode_request(is_smart)
534535

535536
def handle_distributed_object_event(name, service_name, event_type, source):
536537
event = DistributedObjectEvent(name, service_name, event_type, source)
537538
listener_func(event)
538539

539540
def event_handler(client_message):
540-
return client_add_distributed_object_listener_codec.handle(client_message, handle_distributed_object_event)
541+
return codec.handle(client_message, handle_distributed_object_event)
541542

542-
def decode_add_listener(response):
543-
return client_add_distributed_object_listener_codec.decode_response(response)
544-
545-
def encode_remove_listener(registration_id):
546-
return client_remove_distributed_object_listener_codec.encode_request(registration_id)
547-
548-
return self._listener_service.register_listener(request, decode_add_listener,
549-
encode_remove_listener, event_handler)
543+
return self._listener_service.register_listener(request, codec.decode_response,
544+
client_remove_distributed_object_listener_codec.encode_request,
545+
event_handler)
550546

551547
def remove_distributed_object_listener(self, registration_id):
552548
"""Removes the specified distributed object listener.

tests/base.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
import logging
2+
import sys
23
import time
34
import unittest
45
from threading import Thread
6+
7+
from hazelcast import six
58
from tests.hzrc.client import HzRemoteController
69
import hazelcast
710
from hazelcast.core import Address
@@ -58,13 +61,19 @@ def shutdown_all_clients(self):
5861

5962
def assertTrueEventually(self, assertion, timeout=30):
6063
timeout_time = time.time() + timeout
64+
exc_info = None
6165
while time.time() < timeout_time:
6266
try:
6367
assertion()
6468
return
6569
except AssertionError:
70+
exc_info = sys.exc_info()
6671
time.sleep(0.1)
67-
raise
72+
73+
if exc_info is None:
74+
raise Exception("Could not enter the assertion loop!")
75+
76+
six.reraise(*exc_info)
6877

6978
def assertSetEventually(self, event, timeout=5):
7079
is_set = event.wait(timeout)

tests/proxy/distributed_objects_test.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
import logging
12
import time
23

34
import hazelcast
45
from hazelcast.core import DistributedObjectEventType
56

67
from hazelcast.proxy import MAP_SERVICE
78
from tests.base import SingleMemberTestCase
8-
from tests.util import event_collector
9+
from tests.util import event_collector, LoggingContext
910
from hazelcast import six
1011

1112

@@ -65,18 +66,19 @@ def assert_event():
6566
self.assertTrueEventually(assert_event)
6667

6768
def test_add_distributed_object_listener_object_destroyed(self):
68-
collector = event_collector()
69-
m = self.client.get_map("test-map")
70-
self.client.add_distributed_object_listener(listener_func=collector).result()
69+
with LoggingContext(logging.getLogger(), logging.DEBUG):
70+
collector = event_collector()
71+
m = self.client.get_map("test-map")
72+
self.client.add_distributed_object_listener(listener_func=collector).result()
7173

72-
m.destroy()
74+
m.destroy()
7375

74-
def assert_event():
75-
self.assertEqual(1, len(collector.events))
76-
event = collector.events[0]
77-
self.assertDistributedObjectEvent(event, "test-map", MAP_SERVICE, DistributedObjectEventType.DESTROYED)
76+
def assert_event():
77+
self.assertEqual(1, len(collector.events))
78+
event = collector.events[0]
79+
self.assertDistributedObjectEvent(event, "test-map", MAP_SERVICE, DistributedObjectEventType.DESTROYED)
7880

79-
self.assertTrueEventually(assert_event)
81+
self.assertTrueEventually(assert_event)
8082

8183
def test_add_distributed_object_listener_object_created_and_destroyed(self):
8284
collector = event_collector()

tests/util.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,15 @@ def open_connection_to_address(client, uuid):
8686
m.put(key, 0)
8787
m.destroy()
8888

89+
90+
class LoggingContext(object):
91+
def __init__(self, logger, level):
92+
self.logger = logger
93+
self.level = level
94+
self.old_level = logger.level
95+
96+
def __enter__(self):
97+
self.logger.setLevel(self.level)
98+
99+
def __exit__(self, exc_type, exc_val, exc_tb):
100+
self.logger.setLevel(self.old_level)

0 commit comments

Comments
 (0)