)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"06c2e54ba010f6a3505a8fc7aa2fae925b448234","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"a9e6cfd5_68b05efb","updated":"2025-11-13 10:28:15.000000000","message":"This feels off, but I might be misunderstanding something","commit_id":"b05975085de9ae0fdf6ec3fc7941ed0d6d9ed740"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"bb8a941c6d344a893cba5baca8835a8e0b01e1fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3dd4565d_ee1bfe70","updated":"2025-12-16 02:54:12.000000000","message":"lgtm","commit_id":"d3f9154ce213a6587569c14f3b52aa2a8f820c99"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3a7dec9c5c5fe0618d68e8799ddad37c3c0027ed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"c3b87b88_8443cc28","updated":"2025-12-16 15:13:23.000000000","message":"recheck ceph-multistore \n```\ntempest.exceptions.VolumeResourceBuildErrorException: volume c9de274d-ac1c-4ca7-bcdf-739cf4d6e010 failed to build and is in ERROR status\n```","commit_id":"d3f9154ce213a6587569c14f3b52aa2a8f820c99"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d2e2f8dd459454a4abbed8e7910d6d1f7c2f99e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"347344d1_763c1387","updated":"2025-12-16 08:43:48.000000000","message":"recheck parent requeued","commit_id":"d3f9154ce213a6587569c14f3b52aa2a8f820c99"}],"nova/image/glance.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"06c2e54ba010f6a3505a8fc7aa2fae925b448234","unresolved":true,"context_lines":[{"line_number":587,"context_line":"    def _upload_data(self, context, image_id, data):"},{"line_number":588,"context_line":"        # NOTE(aarents) offload upload in a native thread as it can block"},{"line_number":589,"context_line":"        # coroutine in busy environment."},{"line_number":590,"context_line":"        utils.tpool_wrap("},{"line_number":591,"context_line":"            self._client.call)(context, 2, \u0027upload\u0027, args\u003d(image_id, data))"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"        return self._client.call(context, 2, \u0027get\u0027, args\u003d(image_id,))"}],"source_content_type":"text/x-python","patch_set":5,"id":"b6cfa860_58bb6342","line":590,"updated":"2025-11-13 10:28:15.000000000","message":"These aren\u0027t the same calls (though maybe they perform similarly: I\u0027m not that familiar with evenlet\u0027s API). fwict, with eventlet disabled this won\u0027t cause the creation of a new thread since `tpool_wrap` just returns the same callable. What am I missing?","commit_id":"b05975085de9ae0fdf6ec3fc7941ed0d6d9ed740"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e8dc65ae3917962336bcd6c09bc5a4bb84f3de62","unresolved":false,"context_lines":[{"line_number":587,"context_line":"    def _upload_data(self, context, image_id, data):"},{"line_number":588,"context_line":"        # NOTE(aarents) offload upload in a native thread as it can block"},{"line_number":589,"context_line":"        # coroutine in busy environment."},{"line_number":590,"context_line":"        utils.tpool_wrap("},{"line_number":591,"context_line":"            self._client.call)(context, 2, \u0027upload\u0027, args\u003d(image_id, data))"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"        return self._client.call(context, 2, \u0027get\u0027, args\u003d(image_id,))"}],"source_content_type":"text/x-python","patch_set":5,"id":"94383add_eba713c6","line":590,"in_reply_to":"428c0e62_0175eb39","updated":"2025-12-11 10:09:43.000000000","message":"We discussed this on IRC and figured out these are the same thing under the hood","commit_id":"b05975085de9ae0fdf6ec3fc7941ed0d6d9ed740"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"878fcf654d70bec2ddd6cc9c1b6ee3241759863c","unresolved":true,"context_lines":[{"line_number":587,"context_line":"    def _upload_data(self, context, image_id, data):"},{"line_number":588,"context_line":"        # NOTE(aarents) offload upload in a native thread as it can block"},{"line_number":589,"context_line":"        # coroutine in busy environment."},{"line_number":590,"context_line":"        utils.tpool_wrap("},{"line_number":591,"context_line":"            self._client.call)(context, 2, \u0027upload\u0027, args\u003d(image_id, data))"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"        return self._client.call(context, 2, \u0027get\u0027, args\u003d(image_id,))"}],"source_content_type":"text/x-python","patch_set":5,"id":"428c0e62_0175eb39","line":590,"in_reply_to":"b6cfa860_58bb6342","updated":"2025-11-21 10:51:13.000000000","message":"In the baseline tpool_execute actually executed the self._client.call function in the native thread of the tpool. After this change tpool_wrap will wrap the function in  Tpool.Proxy and then we call that wrapped function here. The Tpool.Proxy ensures that any call on a Proxy object is actually executed on the native thread of the tpool. So in eventlet case we get the same behavior with a bit different syntax. In the native threading mode the tpool_wrap is just returning the function unchanged and we call that unchanged function directly here.\n\nThe comment above this says that we need to run the image upload in a native thread as if we run it in the caller greenthread then it can block other greenthreads as there is something in the call that is blocking and not monkey patched. But note that this _uplodad_data function will be waiting for the upload to finish. So the need to be non blocking is for the other greenthreads in the same native thread / eventlet hub.\n\nSo in native thread mode we can ignore the whole blocking problem as a blocked / or busy native thread will not block any other native threads to progress because in native threaded mode any other tasks are in native threads and native threads are preempted when needed by the OS. This means we can simply run the upload in the caller thread that is anyhow need to wait for the upload to finish.\n\n----\n\nI added some wording to the commit message about it","commit_id":"b05975085de9ae0fdf6ec3fc7941ed0d6d9ed740"}],"nova/tests/unit/image/test_glance.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cc7e9569f7065c6641ceaa0cee2803f5f39a76c6","unresolved":true,"context_lines":[{"line_number":41,"context_line":"from nova.storage import rbd_utils"},{"line_number":42,"context_line":"from nova import test"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":46,"context_line":"NOW_GLANCE_FORMAT \u003d \"2010-10-11T10:30:22.000000\""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ca52e1cf_4ae67eb1","side":"PARENT","line":44,"updated":"2025-11-10 13:31:49.000000000","message":"whitespace damage","commit_id":"e002fefed68edb22d0a23bf72243362af24d9865"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"067492a76176e9b3e6b6f41a84d20f34541b6b90","unresolved":false,"context_lines":[{"line_number":41,"context_line":"from nova.storage import rbd_utils"},{"line_number":42,"context_line":"from nova import test"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":46,"context_line":"NOW_GLANCE_FORMAT \u003d \"2010-10-11T10:30:22.000000\""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ca87c35a_8b254ada","side":"PARENT","line":44,"in_reply_to":"ca52e1cf_4ae67eb1","updated":"2025-11-12 14:40:27.000000000","message":"Done","commit_id":"e002fefed68edb22d0a23bf72243362af24d9865"}]}
