)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"4336eca118599987b2125ffe40f3d769c29bbaa0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"76abc411_e6384ca3","updated":"2026-10-19 19:45:50.000000000","message":"A minimal reproducer, for reviewers. It needs no broker: it uses the fake:// driver.\n\n```python\n    import logging\n    import time\n\n    import oslo_messaging as messaging\n    from oslo_config import cfg\n\n    logging.basicConfig(\n        level\u003dlogging.WARNING, format\u003d\u0027server log: %(levelname)s %(message)s\u0027)\n\n\n    class Boom(BaseException):\n        \"\"\"Like eventlet.Timeout: a BaseException, not an Exception.\"\"\"\n\n\n    class Endpoint:\n        def ping(self, ctxt):\n            raise Boom(\u0027endpoint gave up\u0027)\n\n\n    transport \u003d messaging.get_rpc_transport(cfg.CONF, url\u003d\u0027fake:/\u0027)\n    server \u003d messaging.get_rpc_server(\n        transport, messaging.Target(topic\u003d\u0027demo\u0027, server\u003d\u0027s1\u0027), [Endpoint()])\n    server.start()\n    client \u003d messaging.get_rpc_client(\n        transport, messaging.Target(topic\u003d\u0027demo\u0027), timeout\u003d5)\n\n    start \u003d time.monotonic()\n    try:\n        client.call({}, \u0027ping\u0027)\n    except BaseException as exc:\n        print(f\u0027caller: {type(exc).__name__} after \u0027\n              f\u0027{time.monotonic() - start:.1f} s\u0027)\n    server.stop()\n    server.wait()\n```\n\nOn master (d5089354), the server logs nothing, and the caller waits out its whole timeout:\n\n    caller: MessagingTimeout after 5.0 s\n\nWith this change, the server logs the exception and replies at once:\n\n    server log: ERROR Exception during message handling\n    Traceback (most recent call last):\n      ...\n    Boom: endpoint gave up\n    caller: Boom after 0.1 s\n\nThe fake driver hands the caller the exception itself. A real driver sends it as a RemoteError.\n\nThe cause is in the commit message: the dispatch code catches only Exception, so a BaseException ends up in the executor\u0027s future, which nothing reads.","commit_id":"2b11e4978a1bc3ce8b18d9f69d9cbc484bf15ad4"}],"oslo_messaging/rpc/server.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"fae30ab5230232187d4c3eedae12cf72fd3da0dc","unresolved":true,"context_lines":[{"line_number":191,"context_line":"                failure \u003d sys.exc_info()"},{"line_number":192,"context_line":"                LOG.exception(\u0027Exception during message handling\u0027)"},{"line_number":193,"context_line":"            except BaseException:"},{"line_number":194,"context_line":"                # Such as an eventlet.Timeout that the endpoint let escape:"},{"line_number":195,"context_line":"                # the caller still gets a reply, and the driver can let go of"},{"line_number":196,"context_line":"                # the message, before the exception goes on. The executor"},{"line_number":197,"context_line":"                # keeps it in a future that nothing reads, so log it here."}],"source_content_type":"text/x-python","patch_set":1,"id":"070e28e8_caa0485c","line":194,"range":{"start_line":194,"start_character":29,"end_line":194,"end_character":45},"updated":"2026-10-20 12:54:46.000000000","message":"(nit) eventlet is being removed so I personally don\u0027t like keeping it referenced here. Maybe we can rather mention a few other examples like SystemExit (or just mention \"some exceptions inheriting BaseException directly\")","commit_id":"2b11e4978a1bc3ce8b18d9f69d9cbc484bf15ad4"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"18c99376b423d10943cb46dd0ba044ab93858250","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                failure \u003d sys.exc_info()"},{"line_number":192,"context_line":"                LOG.exception(\u0027Exception during message handling\u0027)"},{"line_number":193,"context_line":"            except BaseException:"},{"line_number":194,"context_line":"                # Such as an eventlet.Timeout that the endpoint let escape:"},{"line_number":195,"context_line":"                # the caller still gets a reply, and the driver can let go of"},{"line_number":196,"context_line":"                # the message, before the exception goes on. The executor"},{"line_number":197,"context_line":"                # keeps it in a future that nothing reads, so log it here."}],"source_content_type":"text/x-python","patch_set":1,"id":"613a7aea_5302dbb4","line":194,"in_reply_to":"070e28e8_caa0485c","updated":"2026-10-20 17:02:45.000000000","message":"Done in the next patch set. The comment now says \"Such as SystemExit, or another exception that inherits BaseException directly\". The commit message no longer names eventlet either.","commit_id":"2b11e4978a1bc3ce8b18d9f69d9cbc484bf15ad4"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"fae30ab5230232187d4c3eedae12cf72fd3da0dc","unresolved":true,"context_lines":[{"line_number":196,"context_line":"                # the message, before the exception goes on. The executor"},{"line_number":197,"context_line":"                # keeps it in a future that nothing reads, so log it here."},{"line_number":198,"context_line":"                LOG.exception(\u0027Exception during message handling\u0027)"},{"line_number":199,"context_line":"                try:"},{"line_number":200,"context_line":"                    message.reply(failure\u003dsys.exc_info())"},{"line_number":201,"context_line":"                except Exception:"},{"line_number":202,"context_line":"                    LOG.exception(\"Can not send reply for message\")"},{"line_number":203,"context_line":"                raise"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"c34aa0de_e9ae84a7","line":202,"range":{"start_line":199,"start_character":16,"end_line":202,"end_character":67},"updated":"2026-10-20 12:54:46.000000000","message":"I wonder if we could create a common utility to reduce duplicated code, like https://review.opendev.org/c/openstack/oslo.messaging/+/1011467","commit_id":"2b11e4978a1bc3ce8b18d9f69d9cbc484bf15ad4"},{"author":{"_account_id":10273,"name":"Adam Harwell","email":"flux.adam@gmail.com","username":"rm_you"},"change_message_id":"18c99376b423d10943cb46dd0ba044ab93858250","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                try:"},{"line_number":200,"context_line":"                    message.reply(failure\u003dsys.exc_info())"},{"line_number":201,"context_line":"                except Exception:"},{"line_number":202,"context_line":"                    LOG.exception(\"Can not send reply for message\")"},{"line_number":203,"context_line":"                raise"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"660e3131_34d0c8df","line":202,"in_reply_to":"c34aa0de_e9ae84a7","updated":"2026-10-20 17:02:45.000000000","message":"Good idea, done in the next patch set. One nested reply() helper now holds the reply block, and both the normal path and the BaseException path call it, as in your 1011467.\n\nOne difference: the BaseException path passes sys.exc_info() straight to the helper, not through the failure variable. So the frame keeps no reference to the traceback while the exception goes on, which is the case the NOTE(dhellmann) comment is about.\n\nWith this, 1011467 should not be needed. Thanks for the sketch!","commit_id":"2b11e4978a1bc3ce8b18d9f69d9cbc484bf15ad4"}]}
