)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"bf038d990f505546d9588d7638dbdc408fb924f9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"180445c3_ca39d70d","updated":"2025-06-21 23:53:59.000000000","message":"Hello wu, could you please check this?","commit_id":"5498a48e3cc528c9ad62e5ecc4dc503864fc8963"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"a6d442a21683dbc72760afd846e34d79b0ad7347","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"16272906_dea49362","updated":"2025-06-22 00:10:18.000000000","message":"Hello wu, could you please check this? I think we can easily migrate eventlet code by using oslo.service-4.2.0 that uses the cotyledon package. \n\nhttps://docs.openstack.org/releasenotes/oslo.service/unreleased.html#relnotes-4-2-0\n\nThanks in advance,\nHirotaka","commit_id":"5498a48e3cc528c9ad62e5ecc4dc503864fc8963"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"046543f8b20b7839ec2a8d58a41e6b512cdd9fa5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0e8e30d9_98155bc3","updated":"2025-06-21 13:18:15.000000000","message":"recheck","commit_id":"5498a48e3cc528c9ad62e5ecc4dc503864fc8963"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"0c3483a01979c0fe636c3f41d152024b9a51bb0f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"24205eab_a6e5d81a","updated":"2025-06-21 17:16:31.000000000","message":"recheck","commit_id":"5498a48e3cc528c9ad62e5ecc4dc503864fc8963"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"242ed10947f6ac661f91488a8ec470cc65b60bed","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"5c3ed473_71b0f4e1","in_reply_to":"16272906_dea49362","updated":"2025-06-22 02:15:44.000000000","message":"ok, i will review this patch as soon as possible, currently, i am testing mariadb 11.4 mysql 8.4 and postgresql 17","commit_id":"5498a48e3cc528c9ad62e5ecc4dc503864fc8963"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"26bd1089ef6972b97592bc43a59d5368ffb4ed10","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"e2cfb861_65453e3d","in_reply_to":"5c3ed473_71b0f4e1","updated":"2025-08-05 03:05:34.000000000","message":"hello， @hiwkby@yahoo.com  I reviewed this patch, The current patch should work well for replacing the eventlet timeout. \n\nI have read  the oslo.service-4.2.0  releasenote and i think using oslo.service is more suitable. how do you think about it?","commit_id":"5498a48e3cc528c9ad62e5ecc4dc503864fc8963"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"d8cc10a3f12b93d10532014b49524d4c82e80ac3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"f43c1169_d1d7f99b","in_reply_to":"72f0f019_eb40f13f","updated":"2025-08-06 16:37:41.000000000","message":"Hello Wu, thanks for the comment! #949192\u0027s patch is too large and outdated, and needs to be updated. I will abandon #949192 and submit a new pull request after refining the changes.","commit_id":"5498a48e3cc528c9ad62e5ecc4dc503864fc8963"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"7212bf2e266bbe31d8fccfc10795320afebfa747","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"72f0f019_eb40f13f","in_reply_to":"735a6560_9548b48f","updated":"2025-08-06 01:16:30.000000000","message":"Then do we need to merged this patch now？ how do we deal with this patch ：https://review.opendev.org/c/openstack/trove/+/949192 ？ I didn\u0027t start the review the later patch。","commit_id":"5498a48e3cc528c9ad62e5ecc4dc503864fc8963"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"1d1e3dcbccc00c6e5bf3a3fe9a5ec65f156d22fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"735a6560_9548b48f","in_reply_to":"be10f6aa_672f8014","updated":"2025-08-05 22:27:49.000000000","message":"Hello Wu, thanks for the comment!\nWe don’t need to wait for oslo.service 4.2.0, because this patch is compatible with versions earlier than 4.2.0. 😊","commit_id":"5498a48e3cc528c9ad62e5ecc4dc503864fc8963"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"163c3a9f284268d1116c348313a9d774aa6ca79e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"be10f6aa_672f8014","in_reply_to":"c6729d19_11702977","updated":"2025-08-05 07:34:17.000000000","message":"Yes, Can\u0027t agree more. Do we need to wait for the oslo.service-4.2.0 to be released ?","commit_id":"5498a48e3cc528c9ad62e5ecc4dc503864fc8963"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"1e9e4043578fb967b292d2a23bf7b3bace2ebba6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"c6729d19_11702977","in_reply_to":"e2cfb861_65453e3d","updated":"2025-08-05 05:39:45.000000000","message":"Hello Wu, thank you very much for your review! I agree that we should actively use oslo.service, as we would prefer not to maintain similar logic ourselves.\nUsing oslo.service will help us avoid duplicating code and reduce our maintenance burden. :)","commit_id":"5498a48e3cc528c9ad62e5ecc4dc503864fc8963"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"79e319dc41ebcebb6c7cba87f76015275c7affd1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"6b032e18_a03a64f8","updated":"2025-12-15 09:53:51.000000000","message":"Hello Wu, could you please check this again? Thanks in advance. Hirotaka","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"68bdb272fa95146e695cd2ebe81f2dbff2c5fdff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"45013699_a10fc350","updated":"2026-03-17 08:20:07.000000000","message":"hello, Hirotaka, How to think about this?","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"2507334f8a17f1b486576ba2f4777321484edfe6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"df4d5ffd_2df7a75b","in_reply_to":"6b032e18_a03a64f8","updated":"2026-01-06 14:03:30.000000000","message":"ok, i review this patch ASAP","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"5ff93955ef318bc9ea867bffccb9ce8e9dffa7dc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"bb42112d_291d2d1c","updated":"2026-03-20 21:27:42.000000000","message":"Hello Wu, Could you please check this?\nThanks,\nHirotaka","commit_id":"487c18ae15d6854de9ec05148e7660586ff54774"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"147146792c1c51c33839c25e6c083508d341a40c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"a9463835_cfae11c3","updated":"2026-03-20 18:06:56.000000000","message":"recheck","commit_id":"487c18ae15d6854de9ec05148e7660586ff54774"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"5f1d8dc410ede2fba34f19d958a8496298cdabd3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"c470d54b_1b0f35db","updated":"2026-03-24 19:25:52.000000000","message":"Hello Wu, Could you please check this again?\nThanks,\nHirotaka","commit_id":"59f6e3e0968ac302f7b139feb2c32e7d4f0893c2"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"7667fc65863797e999059df778effc9bc3c57f17","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"651f0d0e_7c795c7b","in_reply_to":"c470d54b_1b0f35db","updated":"2026-03-25 02:34:44.000000000","message":"LGTM now. I will review the next patch. thanks for your fix 😇","commit_id":"59f6e3e0968ac302f7b139feb2c32e7d4f0893c2"}],"requirements.txt":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"4d6f7aefcef278242c3f95778fe3dccc23178c92","unresolved":true,"context_lines":[{"line_number":46,"context_line":"psycopg2-binary\u003e\u003d2.6.2 # LGPL/ZPL"},{"line_number":47,"context_line":"semantic-version\u003e\u003d2.7.0 # BSD"},{"line_number":48,"context_line":"oslo.cache\u003e\u003d1.26.0 # Apache-2.0"},{"line_number":49,"context_line":"cotyledon\u003e\u003d2.0.0 # Apache-2.0"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# for trove network driver"},{"line_number":52,"context_line":"Flask\u003e\u003d2.2.3 # BSD"}],"source_content_type":"text/plain","patch_set":22,"id":"cddbecf2_8ac332b3","line":49,"range":{"start_line":49,"start_character":0,"end_line":49,"end_character":29},"updated":"2026-03-23 12:19:42.000000000","message":"Is it still useful now ?","commit_id":"487c18ae15d6854de9ec05148e7660586ff54774"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"ab58334f6b9fd58440397421d7826f6e3afd727f","unresolved":false,"context_lines":[{"line_number":46,"context_line":"psycopg2-binary\u003e\u003d2.6.2 # LGPL/ZPL"},{"line_number":47,"context_line":"semantic-version\u003e\u003d2.7.0 # BSD"},{"line_number":48,"context_line":"oslo.cache\u003e\u003d1.26.0 # Apache-2.0"},{"line_number":49,"context_line":"cotyledon\u003e\u003d2.0.0 # Apache-2.0"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"# for trove network driver"},{"line_number":52,"context_line":"Flask\u003e\u003d2.2.3 # BSD"}],"source_content_type":"text/plain","patch_set":22,"id":"09b2a941_a8f71ab2","line":49,"range":{"start_line":49,"start_character":0,"end_line":49,"end_character":29},"in_reply_to":"cddbecf2_8ac332b3","updated":"2026-03-24 11:26:24.000000000","message":"Hello, Thanks for the comment! The line is not needed because we do not use cotyledon directly.","commit_id":"487c18ae15d6854de9ec05148e7660586ff54774"}],"trove/common/exception.py":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"4d6f7aefcef278242c3f95778fe3dccc23178c92","unresolved":true,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class TimeoutError(TroveError):"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    message \u003d _(\"Timeout.\")"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class UserNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f6a04f4_6de00fe2","line":96,"range":{"start_line":96,"start_character":0,"end_line":96,"end_character":27},"updated":"2026-03-23 12:19:42.000000000","message":"Is it used?","commit_id":"487c18ae15d6854de9ec05148e7660586ff54774"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"ab58334f6b9fd58440397421d7826f6e3afd727f","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class TimeoutError(TroveError):"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    message \u003d _(\"Timeout.\")"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class UserNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":22,"id":"8d17c56e_0887d27a","line":96,"range":{"start_line":96,"start_character":0,"end_line":96,"end_character":27},"in_reply_to":"3f6a04f4_6de00fe2","updated":"2026-03-24 11:26:24.000000000","message":"Thanks for the comment, I removed TimeoutError class itself because it is not called anywhere.","commit_id":"487c18ae15d6854de9ec05148e7660586ff54774"}],"trove/common/strategies/cluster/utils.py":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"46add87f82f12fbd08d0bff79223a2d55b844356","unresolved":true,"context_lines":[{"line_number":18,"context_line":"from trove.common import exception"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"async def async_run_with_timeout(func, timeout):"},{"line_number":22,"context_line":"    # make a thread to execute the task"},{"line_number":23,"context_line":"    coro \u003d asyncio.to_thread(func)"},{"line_number":24,"context_line":"    try:"},{"line_number":25,"context_line":"        await asyncio.wait_for(coro, timeout)"},{"line_number":26,"context_line":"    except asyncio.TimeoutError:"},{"line_number":27,"context_line":"        exc_fmt \u003d _(\"time out after waiting \""},{"line_number":28,"context_line":"                    \"%(time)s seconds when running %(func)s.\")"},{"line_number":29,"context_line":"        msg_content \u003d {\u0027time\u0027: timeout, \u0027func\u0027: func.__name__}"},{"line_number":30,"context_line":"        raise exception.TimeoutError(exc_fmt % msg_content)"}],"source_content_type":"text/x-python","patch_set":12,"id":"e141c461_09e87d0b","line":30,"range":{"start_line":21,"start_character":0,"end_line":30,"end_character":59},"updated":"2026-03-17 08:08:13.000000000","message":"this looks like only used in unit test?","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"691dafa5a4565a580827ebb7ceaa79a28fedfe09","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from trove.common import exception"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"async def async_run_with_timeout(func, timeout):"},{"line_number":22,"context_line":"    # make a thread to execute the task"},{"line_number":23,"context_line":"    coro \u003d asyncio.to_thread(func)"},{"line_number":24,"context_line":"    try:"},{"line_number":25,"context_line":"        await asyncio.wait_for(coro, timeout)"},{"line_number":26,"context_line":"    except asyncio.TimeoutError:"},{"line_number":27,"context_line":"        exc_fmt \u003d _(\"time out after waiting \""},{"line_number":28,"context_line":"                    \"%(time)s seconds when running %(func)s.\")"},{"line_number":29,"context_line":"        msg_content \u003d {\u0027time\u0027: timeout, \u0027func\u0027: func.__name__}"},{"line_number":30,"context_line":"        raise exception.TimeoutError(exc_fmt % msg_content)"}],"source_content_type":"text/x-python","patch_set":12,"id":"80af6481_89cc2cc7","line":30,"range":{"start_line":21,"start_character":0,"end_line":30,"end_character":59},"in_reply_to":"5c13e80c_0d6980a9","updated":"2026-03-18 13:05:00.000000000","message":"What does this mean? Is this patch no longer needed now?","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"d98d6db67cec77417a73acffcf594265e254855b","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from trove.common import exception"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"async def async_run_with_timeout(func, timeout):"},{"line_number":22,"context_line":"    # make a thread to execute the task"},{"line_number":23,"context_line":"    coro \u003d asyncio.to_thread(func)"},{"line_number":24,"context_line":"    try:"},{"line_number":25,"context_line":"        await asyncio.wait_for(coro, timeout)"},{"line_number":26,"context_line":"    except asyncio.TimeoutError:"},{"line_number":27,"context_line":"        exc_fmt \u003d _(\"time out after waiting \""},{"line_number":28,"context_line":"                    \"%(time)s seconds when running %(func)s.\")"},{"line_number":29,"context_line":"        msg_content \u003d {\u0027time\u0027: timeout, \u0027func\u0027: func.__name__}"},{"line_number":30,"context_line":"        raise exception.TimeoutError(exc_fmt % msg_content)"}],"source_content_type":"text/x-python","patch_set":12,"id":"462a0dfb_60b56f7b","line":30,"range":{"start_line":21,"start_character":0,"end_line":30,"end_character":59},"in_reply_to":"80af6481_89cc2cc7","updated":"2026-03-18 16:17:12.000000000","message":"Hello Wu, This patch is actually used by the code under trove.common.strategies/cluster in #956849, so we have moved it to that patch series. I apologize for the insufficient explanation in the commit message.\n\nWhen you clone the code of https://review.opendev.org/c/openstack/trove/+/956849, then you can see the function is used.\n```\n% grep -irnH \u0027async_run_with_timeout\u0027 .                                                                                \n./trove/tests/unittests/common/test_strategies_cluster_utils.py:33:    def test_async_run_with_timeout(self, mock_asyncio_wait_for):\n./trove/tests/unittests/common/test_strategies_cluster_utils.py:38:        asyncio.run(utils.async_run_with_timeout(func, timeout))\n./trove/common/strategies/cluster/experimental/galera_common/taskmanager.py:141:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/galera_common/taskmanager.py:239:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/galera_common/taskmanager.py:308:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/redis/taskmanager.py:95:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/redis/taskmanager.py:139:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/mongodb/taskmanager.py:119:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/mongodb/taskmanager.py:164:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/mongodb/taskmanager.py:240:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/mongodb/taskmanager.py:272:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/cassandra/taskmanager.py:107:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/cassandra/taskmanager.py:252:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/cassandra/taskmanager.py:328:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/vertica/taskmanager.py:102:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/vertica/taskmanager.py:159:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/experimental/vertica/taskmanager.py:208:            asyncio.run(cluster_utils.async_run_with_timeout(\n./trove/common/strategies/cluster/utils.py:21:async def async_run_with_timeout(func, timeout):\n```","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"08516ddd9fc55da5e771701b0f91cccef570b43c","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from trove.common import exception"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"async def async_run_with_timeout(func, timeout):"},{"line_number":22,"context_line":"    # make a thread to execute the task"},{"line_number":23,"context_line":"    coro \u003d asyncio.to_thread(func)"},{"line_number":24,"context_line":"    try:"},{"line_number":25,"context_line":"        await asyncio.wait_for(coro, timeout)"},{"line_number":26,"context_line":"    except asyncio.TimeoutError:"},{"line_number":27,"context_line":"        exc_fmt \u003d _(\"time out after waiting \""},{"line_number":28,"context_line":"                    \"%(time)s seconds when running %(func)s.\")"},{"line_number":29,"context_line":"        msg_content \u003d {\u0027time\u0027: timeout, \u0027func\u0027: func.__name__}"},{"line_number":30,"context_line":"        raise exception.TimeoutError(exc_fmt % msg_content)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5c13e80c_0d6980a9","line":30,"range":{"start_line":21,"start_character":0,"end_line":30,"end_character":59},"in_reply_to":"e141c461_09e87d0b","updated":"2026-03-18 12:53:48.000000000","message":"Thanks for the comment! This patch should be moved to #956849. Fixed.","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"}],"trove/common/utils.py":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"46add87f82f12fbd08d0bff79223a2d55b844356","unresolved":true,"context_lines":[{"line_number":241,"context_line":"async def execute_with_timeout_async(*args, **kwargs):"},{"line_number":242,"context_line":"    # make a thread to execute the task"},{"line_number":243,"context_line":"    coro \u003d asyncio.to_thread(_execute_with_timeout, *args, **kwargs)"},{"line_number":244,"context_line":"    time \u003d kwargs.pop(\u0027timeout\u0027, CONF.command_process_timeout)"},{"line_number":245,"context_line":"    try:"},{"line_number":246,"context_line":"        return await asyncio.wait_for(coro, time)"},{"line_number":247,"context_line":"    except asyncio.TimeoutError:"}],"source_content_type":"text/x-python","patch_set":12,"id":"9222c025_33d1781d","line":244,"range":{"start_line":244,"start_character":0,"end_line":244,"end_character":62},"updated":"2026-03-17 08:08:13.000000000","message":"Hi, the old code logic removes the timeout parameter from kwargs before passing it to `execute(*args, **kwargs)` so i think you need remove the line `time \u003d kwargs.pop(\u0027timeout\u0027, CONF.command_process_timeout)` to first line in this function to keep consistency.","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"40c3236a7bd96e43269cc4e520fb42cf1db709d8","unresolved":false,"context_lines":[{"line_number":241,"context_line":"async def execute_with_timeout_async(*args, **kwargs):"},{"line_number":242,"context_line":"    # make a thread to execute the task"},{"line_number":243,"context_line":"    coro \u003d asyncio.to_thread(_execute_with_timeout, *args, **kwargs)"},{"line_number":244,"context_line":"    time \u003d kwargs.pop(\u0027timeout\u0027, CONF.command_process_timeout)"},{"line_number":245,"context_line":"    try:"},{"line_number":246,"context_line":"        return await asyncio.wait_for(coro, time)"},{"line_number":247,"context_line":"    except asyncio.TimeoutError:"}],"source_content_type":"text/x-python","patch_set":12,"id":"124c1b37_f45318bf","line":244,"range":{"start_line":244,"start_character":0,"end_line":244,"end_character":62},"in_reply_to":"9222c025_33d1781d","updated":"2026-03-18 14:37:19.000000000","message":"Thanks for catching this. I updated execute_with_timeout_async to pop timeout before creating the thread task, so timeout is not forwarded to execute(*args, **kwargs), matching the previous behavior.","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"4d6f7aefcef278242c3f95778fe3dccc23178c92","unresolved":true,"context_lines":[{"line_number":237,"context_line":"    \"\"\""},{"line_number":238,"context_line":"    return urlparse.urlsplit(\"%s\" % href).path.split(\u0027/\u0027)[-1]"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"async def execute_with_timeout_async(*args, **kwargs):"},{"line_number":242,"context_line":"    time \u003d kwargs.pop(\u0027timeout\u0027, CONF.command_process_timeout)"},{"line_number":243,"context_line":"    # make a thread to execute the task"},{"line_number":244,"context_line":"    coro \u003d asyncio.to_thread(_execute_with_timeout, *args, **kwargs)"},{"line_number":245,"context_line":"    try:"},{"line_number":246,"context_line":"        return await asyncio.wait_for(coro, time)"},{"line_number":247,"context_line":"    except asyncio.TimeoutError:"},{"line_number":248,"context_line":"        LOG.exception(\"TimeoutError.\")"},{"line_number":249,"context_line":"        log_fmt \u003d (\"Time out after waiting \""},{"line_number":250,"context_line":"                   \"%(time)s seconds when running proc: %(args)s\""},{"line_number":251,"context_line":"                   \" %(kwargs)s.\")"},{"line_number":252,"context_line":"        exc_fmt \u003d _(\"Time out after waiting \""},{"line_number":253,"context_line":"                    \"%(time)s seconds when running proc: %(args)s\""},{"line_number":254,"context_line":"                    \" %(kwargs)s.\")"},{"line_number":255,"context_line":"        msg_content \u003d {"},{"line_number":256,"context_line":"            \u0027time\u0027: time, \u0027args\u0027: args,"},{"line_number":257,"context_line":"            \u0027kwargs\u0027: kwargs}"},{"line_number":258,"context_line":"        LOG.error(log_fmt, msg_content)"},{"line_number":259,"context_line":"        raise exception.ProcessExecutionError(exc_fmt % msg_content)"},{"line_number":260,"context_line":"    except exception.ProcessExecutionError:"},{"line_number":261,"context_line":"        raise"},{"line_number":262,"context_line":"    except Exception:"},{"line_number":263,"context_line":"        LOG.error(\"Exception other than ProcessExecutionError\")"},{"line_number":264,"context_line":"        raise"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"def execute_with_timeout(*args, **kwargs):"},{"line_number":268,"context_line":"    # submit a task"},{"line_number":269,"context_line":"    try:"},{"line_number":270,"context_line":"        return asyncio.run(execute_with_timeout_async(*args, **kwargs))"},{"line_number":271,"context_line":"    except exception.ProcessExecutionError:"},{"line_number":272,"context_line":"        raise"},{"line_number":273,"context_line":"    except Exception:"},{"line_number":274,"context_line":"        LOG.error(\"Exception other than ProcessExecutionError\")"},{"line_number":275,"context_line":"        raise"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"def _execute_with_timeout(*args, **kwargs):"},{"line_number":279,"context_line":"    log_output_on_error \u003d kwargs.pop(\u0027log_output_on_error\u0027, False)"}],"source_content_type":"text/x-python","patch_set":22,"id":"a35bba20_a769ad75","line":276,"range":{"start_line":240,"start_character":0,"end_line":276,"end_character":0},"updated":"2026-03-23 12:19:42.000000000","message":"hello, I also think these changes are not needed too. from the docs from `processutils`, the execute function supports the timeout natively.\n\n```\n\u003e\u003e\u003e from oslo_concurrency import processutils\n\n\u003e\u003e\u003e help(processutils.execute)\n\n    :param timeout:         Timeout (in seconds) to wait for the process\n                            termination. If timeout is reached,\n                            :class:`subprocess.TimeoutExpired` is raised.\n```\n\nSo we just need to catch the `subprocess.TimeoutExpired` exception.","commit_id":"487c18ae15d6854de9ec05148e7660586ff54774"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"ab58334f6b9fd58440397421d7826f6e3afd727f","unresolved":false,"context_lines":[{"line_number":237,"context_line":"    \"\"\""},{"line_number":238,"context_line":"    return urlparse.urlsplit(\"%s\" % href).path.split(\u0027/\u0027)[-1]"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"async def execute_with_timeout_async(*args, **kwargs):"},{"line_number":242,"context_line":"    time \u003d kwargs.pop(\u0027timeout\u0027, CONF.command_process_timeout)"},{"line_number":243,"context_line":"    # make a thread to execute the task"},{"line_number":244,"context_line":"    coro \u003d asyncio.to_thread(_execute_with_timeout, *args, **kwargs)"},{"line_number":245,"context_line":"    try:"},{"line_number":246,"context_line":"        return await asyncio.wait_for(coro, time)"},{"line_number":247,"context_line":"    except asyncio.TimeoutError:"},{"line_number":248,"context_line":"        LOG.exception(\"TimeoutError.\")"},{"line_number":249,"context_line":"        log_fmt \u003d (\"Time out after waiting \""},{"line_number":250,"context_line":"                   \"%(time)s seconds when running proc: %(args)s\""},{"line_number":251,"context_line":"                   \" %(kwargs)s.\")"},{"line_number":252,"context_line":"        exc_fmt \u003d _(\"Time out after waiting \""},{"line_number":253,"context_line":"                    \"%(time)s seconds when running proc: %(args)s\""},{"line_number":254,"context_line":"                    \" %(kwargs)s.\")"},{"line_number":255,"context_line":"        msg_content \u003d {"},{"line_number":256,"context_line":"            \u0027time\u0027: time, \u0027args\u0027: args,"},{"line_number":257,"context_line":"            \u0027kwargs\u0027: kwargs}"},{"line_number":258,"context_line":"        LOG.error(log_fmt, msg_content)"},{"line_number":259,"context_line":"        raise exception.ProcessExecutionError(exc_fmt % msg_content)"},{"line_number":260,"context_line":"    except exception.ProcessExecutionError:"},{"line_number":261,"context_line":"        raise"},{"line_number":262,"context_line":"    except Exception:"},{"line_number":263,"context_line":"        LOG.error(\"Exception other than ProcessExecutionError\")"},{"line_number":264,"context_line":"        raise"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"def execute_with_timeout(*args, **kwargs):"},{"line_number":268,"context_line":"    # submit a task"},{"line_number":269,"context_line":"    try:"},{"line_number":270,"context_line":"        return asyncio.run(execute_with_timeout_async(*args, **kwargs))"},{"line_number":271,"context_line":"    except exception.ProcessExecutionError:"},{"line_number":272,"context_line":"        raise"},{"line_number":273,"context_line":"    except Exception:"},{"line_number":274,"context_line":"        LOG.error(\"Exception other than ProcessExecutionError\")"},{"line_number":275,"context_line":"        raise"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"def _execute_with_timeout(*args, **kwargs):"},{"line_number":279,"context_line":"    log_output_on_error \u003d kwargs.pop(\u0027log_output_on_error\u0027, False)"}],"source_content_type":"text/x-python","patch_set":22,"id":"ab8e5662_a9a9f460","line":276,"range":{"start_line":240,"start_character":0,"end_line":276,"end_character":0},"in_reply_to":"a35bba20_a769ad75","updated":"2026-03-24 11:26:24.000000000","message":"Hello Wu, Thanks for the review! Fixed.","commit_id":"487c18ae15d6854de9ec05148e7660586ff54774"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"e12748dbb7122eee9885f146feb8f4af76bb49f1","unresolved":true,"context_lines":[{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"def execute_with_timeout(*args, **kwargs):"},{"line_number":242,"context_line":"    time \u003d kwargs.pop(\u0027timeout\u0027, CONF.command_process_timeout)"},{"line_number":243,"context_line":"    log_output_on_error \u003d kwargs.pop(\u0027log_output_on_error\u0027, False)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3ac9c0fb_fc35353a","line":242,"range":{"start_line":242,"start_character":0,"end_line":242,"end_character":62},"updated":"2026-03-24 05:38:52.000000000","message":"hello, the timeout parameter should be passed to the execute function. you can add a check here.","commit_id":"3559458fc8c51567d2ed2cdbea1f097316e6e2a6"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"ab58334f6b9fd58440397421d7826f6e3afd727f","unresolved":false,"context_lines":[{"line_number":239,"context_line":""},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"def execute_with_timeout(*args, **kwargs):"},{"line_number":242,"context_line":"    time \u003d kwargs.pop(\u0027timeout\u0027, CONF.command_process_timeout)"},{"line_number":243,"context_line":"    log_output_on_error \u003d kwargs.pop(\u0027log_output_on_error\u0027, False)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":27,"id":"230c0323_5f4b1e84","line":242,"range":{"start_line":242,"start_character":0,"end_line":242,"end_character":62},"in_reply_to":"3ac9c0fb_fc35353a","updated":"2026-03-24 11:26:24.000000000","message":"Hello Wu, Thanks for the quick reply! Fixed.","commit_id":"3559458fc8c51567d2ed2cdbea1f097316e6e2a6"}],"trove/guestagent/api.py":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"46add87f82f12fbd08d0bff79223a2d55b844356","unresolved":true,"context_lines":[{"line_number":104,"context_line":"        except Exception as e:"},{"line_number":105,"context_line":"            LOG.exception(\"Error calling %s\", method_name)"},{"line_number":106,"context_line":"            raise exception.GuestError(original_message\u003dstr(e))"},{"line_number":107,"context_line":"        except Timeout:"},{"line_number":108,"context_line":"            raise exception.GuestTimeout()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _cast(self, method_name, version, **kwargs):"}],"source_content_type":"text/x-python","patch_set":12,"id":"7584ab1b_747421ca","side":"PARENT","line":107,"range":{"start_line":107,"start_character":15,"end_line":107,"end_character":23},"updated":"2026-03-17 08:08:13.000000000","message":"just catch the `oslo_messaging.MessagingTimeout` exception","commit_id":"3ec0c5f8dd634525e2606ec1945a070cb69690fd"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"40c3236a7bd96e43269cc4e520fb42cf1db709d8","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        except Exception as e:"},{"line_number":105,"context_line":"            LOG.exception(\"Error calling %s\", method_name)"},{"line_number":106,"context_line":"            raise exception.GuestError(original_message\u003dstr(e))"},{"line_number":107,"context_line":"        except Timeout:"},{"line_number":108,"context_line":"            raise exception.GuestTimeout()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _cast(self, method_name, version, **kwargs):"}],"source_content_type":"text/x-python","patch_set":12,"id":"954feb41_28b10048","side":"PARENT","line":107,"range":{"start_line":107,"start_character":15,"end_line":107,"end_character":23},"in_reply_to":"7584ab1b_747421ca","updated":"2026-03-18 14:37:19.000000000","message":"Thanks for the suggestion. I updated _call to catch only oslo_messaging.MessagingTimeout instead of a broad Exception, and now it raises GuestTimeout on timeout.","commit_id":"3ec0c5f8dd634525e2606ec1945a070cb69690fd"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"46add87f82f12fbd08d0bff79223a2d55b844356","unresolved":true,"context_lines":[{"line_number":104,"context_line":"        finally:"},{"line_number":105,"context_line":"            LOG.debug(\"asyncio.wait_for done\")"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if not result:"},{"line_number":108,"context_line":"            LOG.debug(\"Getting no result\")"},{"line_number":109,"context_line":"        return result"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"4ccc0e9d_17792056","line":107,"range":{"start_line":107,"start_character":8,"end_line":107,"end_character":22},"updated":"2026-03-17 08:08:13.000000000","message":"if the RuntimeError occurs , the result should be not defined, it would not be able to calculate, to fix this,  we can add `result \u003d None` before the try block","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"40c3236a7bd96e43269cc4e520fb42cf1db709d8","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        finally:"},{"line_number":105,"context_line":"            LOG.debug(\"asyncio.wait_for done\")"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        if not result:"},{"line_number":108,"context_line":"            LOG.debug(\"Getting no result\")"},{"line_number":109,"context_line":"        return result"},{"line_number":110,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"b532f0b2_a7eb8c16","line":107,"range":{"start_line":107,"start_character":8,"end_line":107,"end_character":22},"in_reply_to":"4ccc0e9d_17792056","updated":"2026-03-18 14:37:19.000000000","message":"Thanks for catching this. You\u0027re right — if RuntimeError occurs, result may be undefined. I initialized result \u003d None before the try block in _call_async to avoid the unbound variable path.","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"46add87f82f12fbd08d0bff79223a2d55b844356","unresolved":true,"context_lines":[{"line_number":112,"context_line":"        LOG.debug(\"Calling %(name)s with timeout %(timeout)s\","},{"line_number":113,"context_line":"                  {\u0027name\u0027: method_name, \u0027timeout\u0027: timeout_sec})"},{"line_number":114,"context_line":"        try:"},{"line_number":115,"context_line":"            cctxt \u003d self.client.prepare(version\u003dversion, timeout\u003dtimeout_sec)"},{"line_number":116,"context_line":"            result \u003d cctxt.call(self.context, method_name, **kwargs)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"            LOG.debug(\"Result is %s.\", result)"},{"line_number":119,"context_line":"            return result"}],"source_content_type":"text/x-python","patch_set":12,"id":"b2560b62_b272258e","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":68},"updated":"2026-03-17 08:08:13.000000000","message":"Hi, as the `oslo_message`  supports the timeout natively, I think all of the changes in this file are not required.","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"40c3236a7bd96e43269cc4e520fb42cf1db709d8","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        LOG.debug(\"Calling %(name)s with timeout %(timeout)s\","},{"line_number":113,"context_line":"                  {\u0027name\u0027: method_name, \u0027timeout\u0027: timeout_sec})"},{"line_number":114,"context_line":"        try:"},{"line_number":115,"context_line":"            cctxt \u003d self.client.prepare(version\u003dversion, timeout\u003dtimeout_sec)"},{"line_number":116,"context_line":"            result \u003d cctxt.call(self.context, method_name, **kwargs)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"            LOG.debug(\"Result is %s.\", result)"},{"line_number":119,"context_line":"            return result"}],"source_content_type":"text/x-python","patch_set":12,"id":"3c2b0a34_09c8db98","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":68},"in_reply_to":"b2560b62_b272258e","updated":"2026-03-18 14:37:19.000000000","message":"Thanks, good point. I removed asyncio from this file and now handle timeout only via messaging.MessagingTimeout -\u003e GuestTimeout.","commit_id":"b1027702114c20c0303a763a4424078dba1c1b33"}],"trove/taskmanager/models.py":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"46add87f82f12fbd08d0bff79223a2d55b844356","unresolved":true,"context_lines":[{"line_number":349,"context_line":"                    instance.update_db(task_status\u003dInstanceTasks.REBOOTING)"},{"line_number":350,"context_line":"                    instance.restart()"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        timeout \u003d Timeout(CONF.cluster_usage_timeout)"},{"line_number":353,"context_line":"        cluster_notification \u003d context.notification"},{"line_number":354,"context_line":"        request_info \u003d cluster_notification.serialize(context)"},{"line_number":355,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"2ad9904e_98966a04","side":"PARENT","line":352,"updated":"2026-03-17 08:08:13.000000000","message":"Hi, we can refactor this logic here, as the most possible timeout action is `instance.restart()`, however, the `instance.restart()` is already has timeout mechanism, so i think we just use time calculate here is ok, for example:\n\n```\n\u003e\u003e\u003e from oslo_utils import timeutils\n\u003e\u003e\u003e timeout\u003d10\n\u003e\u003e\u003e watch \u003d timeutils.StopWatch(duration\u003dtimeout)\n\u003e\u003e\u003e watch.start()\n\u003coslo_utils.timeutils.StopWatch object at 0x1099dcfd0\u003e\n\u003e\u003e\u003e import time\n\u003e\u003e\u003e time.sleep(10) // do the work\n\u003e\u003e\u003e watch.expired()\nTrue\n\n```\n\nasyncio is too heavy to implement such a timeout mechanism.","commit_id":"3ec0c5f8dd634525e2606ec1945a070cb69690fd"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"5c0f52d91f3e137f9a1a90055bd74ab6ef318093","unresolved":false,"context_lines":[{"line_number":349,"context_line":"                    instance.update_db(task_status\u003dInstanceTasks.REBOOTING)"},{"line_number":350,"context_line":"                    instance.restart()"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        timeout \u003d Timeout(CONF.cluster_usage_timeout)"},{"line_number":353,"context_line":"        cluster_notification \u003d context.notification"},{"line_number":354,"context_line":"        request_info \u003d cluster_notification.serialize(context)"},{"line_number":355,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":12,"id":"261b4490_89e6434b","side":"PARENT","line":352,"in_reply_to":"2ad9904e_98966a04","updated":"2026-03-18 16:05:55.000000000","message":"Thanks for the suggestion! I refactored the patch to use a simple StopWatch timeout check in the synchronous flow. I removed the async thread/wait_for wrapper while keeping the existing task reset behavior.","commit_id":"3ec0c5f8dd634525e2606ec1945a070cb69690fd"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"46add87f82f12fbd08d0bff79223a2d55b844356","unresolved":true,"context_lines":[{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        timeout \u003d Timeout(CONF.cluster_usage_timeout)"},{"line_number":353,"context_line":"        cluster_notification \u003d context.notification"},{"line_number":354,"context_line":"        request_info \u003d cluster_notification.serialize(context)"},{"line_number":355,"context_line":"        try:"},{"line_number":356,"context_line":"            node_db_inst \u003d DBInstance.find_all(cluster_id\u003dcluster_id,"},{"line_number":357,"context_line":"                                               deleted\u003dFalse).all()"}],"source_content_type":"text/x-python","patch_set":12,"id":"514c53c0_44b4cb48","side":"PARENT","line":354,"updated":"2026-03-17 08:08:13.000000000","message":"add this to line 354:\n\n```\ntimeout \u003d CONF.cluster_usage_timeout\nwatch \u003d timeutils.StopWatch(duration\u003dtimeout)\nwatch.start()\n```","commit_id":"3ec0c5f8dd634525e2606ec1945a070cb69690fd"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"5c0f52d91f3e137f9a1a90055bd74ab6ef318093","unresolved":false,"context_lines":[{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        timeout \u003d Timeout(CONF.cluster_usage_timeout)"},{"line_number":353,"context_line":"        cluster_notification \u003d context.notification"},{"line_number":354,"context_line":"        request_info \u003d cluster_notification.serialize(context)"},{"line_number":355,"context_line":"        try:"},{"line_number":356,"context_line":"            node_db_inst \u003d DBInstance.find_all(cluster_id\u003dcluster_id,"},{"line_number":357,"context_line":"                                               deleted\u003dFalse).all()"}],"source_content_type":"text/x-python","patch_set":12,"id":"09728a85_6025298b","side":"PARENT","line":354,"in_reply_to":"514c53c0_44b4cb48","updated":"2026-03-18 16:05:55.000000000","message":"Fixed.","commit_id":"3ec0c5f8dd634525e2606ec1945a070cb69690fd"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"46add87f82f12fbd08d0bff79223a2d55b844356","unresolved":true,"context_lines":[{"line_number":355,"context_line":"        try:"},{"line_number":356,"context_line":"            node_db_inst \u003d DBInstance.find_all(cluster_id\u003dcluster_id,"},{"line_number":357,"context_line":"                                               deleted\u003dFalse).all()"},{"line_number":358,"context_line":"            for index, db_inst in enumerate(node_db_inst):"},{"line_number":359,"context_line":"                if index \u003e 0:"},{"line_number":360,"context_line":"                    LOG.debug("},{"line_number":361,"context_line":"                        \"Waiting (%ds) for restarted nodes to rejoin the \""}],"source_content_type":"text/x-python","patch_set":12,"id":"e6fdb482_85b5de17","side":"PARENT","line":358,"range":{"start_line":358,"start_character":0,"end_line":358,"end_character":58},"updated":"2026-03-17 08:08:13.000000000","message":"add the following to line 358:\n\n```\nif watch.expired():\n   LOG.exception(.....)\n   raise exception......\n```","commit_id":"3ec0c5f8dd634525e2606ec1945a070cb69690fd"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"5c0f52d91f3e137f9a1a90055bd74ab6ef318093","unresolved":false,"context_lines":[{"line_number":355,"context_line":"        try:"},{"line_number":356,"context_line":"            node_db_inst \u003d DBInstance.find_all(cluster_id\u003dcluster_id,"},{"line_number":357,"context_line":"                                               deleted\u003dFalse).all()"},{"line_number":358,"context_line":"            for index, db_inst in enumerate(node_db_inst):"},{"line_number":359,"context_line":"                if index \u003e 0:"},{"line_number":360,"context_line":"                    LOG.debug("},{"line_number":361,"context_line":"                        \"Waiting (%ds) for restarted nodes to rejoin the \""}],"source_content_type":"text/x-python","patch_set":12,"id":"7add9158_ba229eaf","side":"PARENT","line":358,"range":{"start_line":358,"start_character":0,"end_line":358,"end_character":58},"in_reply_to":"e6fdb482_85b5de17","updated":"2026-03-18 16:05:55.000000000","message":"Fixed.","commit_id":"3ec0c5f8dd634525e2606ec1945a070cb69690fd"}]}
