)]}'
{"/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"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"1e41bdd0988483f22dd8e57f485f507be3f7e0f3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"a5c41725_dddffa3a","updated":"2026-05-26 01:58:00.000000000","message":"This is ready to merge now.","commit_id":"1dbd86728d1a9bffbfb3fc396ac6f7fd8c928f1d"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"mangust404@gmail.com","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"531c8199b36d3494faf18a8609143f04d2d01549","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"5f53123e_6e75c492","updated":"2026-05-28 16:02:01.000000000","message":"Hello guys! This patch works fine in my local DevStack, all tests passed; however, I noticed the following in the Zuul test run above:\n\n```\nreturn self.greenlet.switch()\n       ^^^^^^^^^^^^^^^^^^^^^^\nTimeoutError: timed out\nurllib3.exceptions.ReadTimeoutError: UnixHTTPConnectionPool(host\u003d\u0027localhost\u0027, port\u003dNone): Read timed out. (read timeout\u003d60)\n```\n\nDo we need to do something about it? If we merge this without a solution, CI tests will be intermittently broken. Probably, this is related to slow job execution. Maybe we just need to increase some timeouts in the configuration?","commit_id":"e816cd850ca3baad6bf3f675d40224a6eeb6dc42"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"mangust404@gmail.com","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"21306477bbb9f3e82401db53a79bef2d42b5afb9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"5a4864a0_a8fc4385","updated":"2026-05-29 04:03:54.000000000","message":"Ok, ready to merge. Not sure about backporting though.\nMaybe it\u0027s better to complete all three patches of removing eventlent procedure, and then cherry pick them into single one.","commit_id":"e816cd850ca3baad6bf3f675d40224a6eeb6dc42"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"a10f9c11208e6d202425f70970207bc8d895d49b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"46f1530f_31ae05fe","in_reply_to":"5a4864a0_a8fc4385","updated":"2026-05-29 04:38:31.000000000","message":"I think cherry-pick is not needed, Since removing the `eventlet` is not a bug fix.","commit_id":"e816cd850ca3baad6bf3f675d40224a6eeb6dc42"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"4e2777d855b4fc315ac99b435ea5ca833d0862ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":31,"id":"7d167b93_22226b23","in_reply_to":"5f53123e_6e75c492","updated":"2026-05-29 02:58:23.000000000","message":"This error is mostly caused by insufficient machine performance. Currently, I have no better solution other than retrying. Also, this error is unrelated to the current changes.\nThe CI machine only has 8GB of memory. We need to install many control components on it, and the tests even require creating another VMs inside the machine.","commit_id":"e816cd850ca3baad6bf3f675d40224a6eeb6dc42"}],"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"}]}
