diff options
author | Darren Hague <d.hague@sap.com> | 2016-06-13 15:48:30 +0100 |
---|---|---|
committer | Darren Hague <d.hague@sap.com> | 2016-07-11 16:37:13 +0100 |
commit | c7cba1fe02e03744e5b45e54c84f3e971b450698 (patch) | |
tree | 52e4dde73718f1e077288ea82c15144a7e2f0139 /ceilometermiddleware/tests/test_swift.py | |
parent | c962fedb851c4bdc36f43b22d55efc82ca1d0dfd (diff) | |
download | ceilometermiddleware-c7cba1fe02e03744e5b45e54c84f3e971b450698.tar.gz |
Add background thread notifier sending ability
Add ability to hand off notifier event sending to a queue processed by
a background thread so as not to block swift proxy. This fixes an
issue whereby if ceilometer's RabbitMQ went down then the swift proxy
would wait for it to come back up, effectively coupling Swift's
availabiilty to that of Ceilometer's RabbitMQ.
Background sending is activated by setting config item
'nonblocking_notify' to True.
Queue size defaults to 1000, which can be overridden by setting config
item 'send_queue_size'. If the queue is full, new events are discarded.
Change-Id: I3da2b88b2bc9b7fd8c572a0085fa1d78c4f54701
Diffstat (limited to 'ceilometermiddleware/tests/test_swift.py')
-rw-r--r-- | ceilometermiddleware/tests/test_swift.py | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/ceilometermiddleware/tests/test_swift.py b/ceilometermiddleware/tests/test_swift.py index 2e7287a..4c0f43e 100644 --- a/ceilometermiddleware/tests/test_swift.py +++ b/ceilometermiddleware/tests/test_swift.py @@ -20,6 +20,7 @@ import six from ceilometermiddleware import swift from ceilometermiddleware.tests import base as tests_base +from threading import Event class FakeApp(object): @@ -90,6 +91,31 @@ class TestSwift(tests_base.TestCase): self.assertEqual('obj', metadata['object']) self.assertEqual('get', data[2]['target']['action']) + def test_get_background(self): + notified = Event() + app = swift.Swift(FakeApp(), + {"nonblocking_notify": "True", + "send_queue_size": "1"}) + req = FakeRequest('/1.0/account/container/obj', + environ={'REQUEST_METHOD': 'GET'}) + with mock.patch('oslo_messaging.Notifier.info', + side_effect=lambda *args, **kwargs: notified.set() + ) as notify: + resp = app(req.environ, self.start_response) + self.assertEqual(["This string is 28 bytes long"], list(resp)) + notified.wait() + self.assertEqual(1, len(notify.call_args_list)) + data = notify.call_args_list[0][0] + self.assertEqual('objectstore.http.request', data[1]) + self.assertEqual(28, data[2]['measurements'][0]['result']) + self.assertEqual('storage.objects.outgoing.bytes', + data[2]['measurements'][0]['metric']['name']) + metadata = data[2]['target']['metadata'] + self.assertEqual('1.0', metadata['version']) + self.assertEqual('container', metadata['container']) + self.assertEqual('obj', metadata['object']) + self.assertEqual('get', data[2]['target']['action']) + def test_put(self): app = swift.Swift(FakeApp(body=['']), {}) req = FakeRequest( |