)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a0f4ed56492e51622cd08f81bdd9f0b9ba696f4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cd483dd2_b9599f71","updated":"2025-08-14 14:43:38.000000000","message":"We have a potential race condition now.","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9960911edd371f948ca003602d1fb06efdd49585","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"003836a8_d85be851","updated":"2025-08-13 10:44:37.000000000","message":"what your proposing will work but creating an executor dynamicly take more time then reusing it and shutdonw is not really the right way to wait for tasks to complete you shoudl be keeping a list of the futures returned by the enqued work\nand waiting on that.\n\nperhaps we shoudl defer factoring how this is written until after this change but i kind fo feel  like the way the code works today is not very aligned to how executors should be used. i.e. with the call back function to mutate the stats from the background task rather then returning the result via a future and processing them as they are completed.","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"b89848bc0536b13685a4ef52199edfd5bf7c7d3f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"f714e815_e09f9441","updated":"2025-08-26 09:20:19.000000000","message":"Thanks @gibizer@gmail.com for comments!","commit_id":"eb8ee2fc98da2e27cd7907a1b5ca6d42de746e97"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6bd496c3e3edf15e771b28f48a7f591e79113788","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"295496c6_b20d1d6f","updated":"2025-08-25 16:50:16.000000000","message":"closer but not correct yet.","commit_id":"eb8ee2fc98da2e27cd7907a1b5ca6d42de746e97"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e76f9b986056887a5365b05590dcc20f5c1d228b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8b503cc2_b688c0cf","updated":"2025-08-26 15:54:24.000000000","message":"-1 due to the missing UT but I\u0027m also concerned by the fact I don\u0027t see how we could test it.","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"235b0f5210e5a7e23074752e3afa8f717e3e997d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"831ed288_14600b7a","updated":"2025-08-26 15:09:16.000000000","message":"Content looks good. But we need a release notes and a doc update included (or a follow up patch). \n\nAlso we agreed to have a follow up refactoring the the executor handling but that probably needs to wait for G.","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"41c1347cce3774a374fc62b0f8487b8079f73085","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"bd52c46a_b9e17883","updated":"2025-08-26 16:25:03.000000000","message":"clarifying a few things","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9109d8dba201c81dcfe4c9a94d1f4c996dd930b0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3abe2b5a_1b5e6c70","in_reply_to":"831ed288_14600b7a","updated":"2025-08-26 16:12:29.000000000","message":"oh and in the doc/ reno patch we should also enable nova-conductor with threading in nova-next Job.","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"626dd33d1d8ebb2401132abaf35ccec141b7360a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1623f053_47243a2e","updated":"2025-08-26 19:46:25.000000000","message":"+1 while i wait for the ci results to review","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"85471c6a439914ae10e0bf887f722d762c0b018a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"c55dd1aa_76f34d64","updated":"2025-08-27 08:25:43.000000000","message":"so test results:\n* the next patch in the series switched both conductor instance to native threading in nova-next. The job is green https://zuul.opendev.org/t/openstack/build/4f5344c1496b4de19525cd50dc7aafef and the logs proves we are running in native threading:\n** https://zuul.opendev.org/t/openstack/build/4f5344c1496b4de19525cd50dc7aafef/log/controller/logs/screen-n-cond-cell1.txt#2\n** https://zuul.opendev.org/t/openstack/build/4f5344c1496b4de19525cd50dc7aafef/log/controller/logs/screen-n-super-cond.txt#5673\n* now we run init tests higher up in the series with native threading and it passes https://zuul.opendev.org/t/openstack/build/1da4d6447e644848aae9162cc29a497c\nit runs the image cache unit test coverage e.g. nova.tests.unit.conductor.test_conductor.ConductorTaskAPITestCase.test_cache_images_fail which actually exercise the code path that got a lock now.\n\nSo what we can do with automatic testing is done and green. I will do a local testing with devstack today and report back. But I think we are in a good shape to land the nova-conductor changes.","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8ae0034677417821d7a6e04907c6a7c58f317319","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"59ac5dfa_7e7c9607","in_reply_to":"15b88112_26207b60","updated":"2025-08-27 09:35:02.000000000","message":"Yepp shutdown works differently for thread and eventlet executors at least in futurist https://paste.opendev.org/show/bmZZr707naiWYHMt7qim/","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7f01b6029c666af1c57fca76d1e47cf5e893f913","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"c75233fd_8379d6e8","in_reply_to":"1eb82134_0ac6c0c0","updated":"2025-09-01 07:12:11.000000000","message":"futurist 3.2.1 is released and bumped into the upper constraints[1]. So we should bump our minimum futurist version here to 3.2.1 to signal that we need that fix.\n\n[1]https://review.opendev.org/c/openstack/requirements/+/958902","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f87ec577191f5b97246ceca1cd7962b1155d3c19","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e1bfa46b_ddd3024f","in_reply_to":"59ac5dfa_7e7c9607","updated":"2025-08-27 09:41:18.000000000","message":"This is a futurist bug. Both the python own doc and pythons own concurrent.future.ThreadPoolExecutor works the same as the Green one in futurist. So the futurist ThreadPoolExecutor is the outlier. \nhttps://paste.opendev.org/show/bumrTB3rZUR1kXGbpdHF/\n\nI will file bug to futurist","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a1b56a536b88c1f4372a2d986364a1f61d5c75af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"ad3a7955_d2b5f1d1","in_reply_to":"6ab8dd0a_60ba584f","updated":"2025-08-27 09:13:07.000000000","message":"Manual testing with devstack:\n* baseline on master https://paste.opendev.org/show/b3S74kzkjvvvgXUsGqvB/\n* with the patch but still in eventlet mode https://paste.opendev.org/show/b1QHn6Zb6yT2OK5UDmBG/\n* with the patch now in native threading mode https://paste.opendev.org/show/bGwpu8My66GcyR8T12sW/ **seem we have a bug. Only one of the two hosts got the image**","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"902a6fed382512fe68c5ca2c542920ea771bc499","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1eb82134_0ac6c0c0","in_reply_to":"90953683_0635ccb5","updated":"2025-08-29 14:33:11.000000000","message":"I also verified that multiple caching tasks can run in parallel within the same conductor without issue.","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"d68cd58c38194574dc00839ee1403e508b0a8b4a","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"15b88112_26207b60","in_reply_to":"ad3a7955_d2b5f1d1","updated":"2025-08-27 09:19:38.000000000","message":"The bug is stable and reproducible if the executor size is the default 1. If I bump that to 2 then both hosts gets the image: https://paste.opendev.org/show/b1TPrh7ESmcIqWuTZx3D/\n\nI suspect it is bug / misunderstanding about the executor shutdown behavior when there are queued tasks for the executor.","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"21f430166e4c7bb94b231d52771bde0585582a6c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"90953683_0635ccb5","in_reply_to":"b36b9cc9_935e6e9b","updated":"2025-08-29 14:13:19.000000000","message":"I just verified that with the futurist bugfix in https://review.opendev.org/c/openstack/futurist/+/958689 I don\u0027t see the image cache issue any more. All works as expected. I proposed a new futurist release  https://review.opendev.org/c/openstack/releases/+/958837 but we just hit requirements freeze so even if we get the lib release out we won\u0027t bump to it in Flamingo. But at least we can land this patch in early Gazpacho.","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5d92177333ca556fc30c6934603d37ab55cd161c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"6ab8dd0a_60ba584f","in_reply_to":"c55dd1aa_76f34d64","updated":"2025-08-27 08:26:32.000000000","message":"s/init/unit/ and sorry I messed up the formatting I blame Jira breaking my muscle memory.","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"478458a6e04ca35a76c81c381123172df98862e6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"932b2a61_d7c59074","in_reply_to":"c75233fd_8379d6e8","updated":"2025-09-19 12:27:50.000000000","message":"Done","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8833ba4015c5a271f15edb0e520730686174c6b8","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"b36b9cc9_935e6e9b","in_reply_to":"e1bfa46b_ddd3024f","updated":"2025-08-27 17:18:40.000000000","message":"filed a futurist bug https://bugs.launchpad.net/futurist/+bug/2121545","commit_id":"69408c7026d3d0f50e1c4515af76994b8153c206"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9705026b67d8cc3b52f35a7e8f9da19054cb0cc1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"f2ca61c8_d5d44ed8","updated":"2025-09-22 15:02:41.000000000","message":"This is good to go form my perspective. But it might need to wait until master is fully open for risky changes after Flamingo is shipped.","commit_id":"9f58f596dbbbe3151f921764742b1d90dcf7ad9c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ce02dad288d5b7ef09fd44708483c77c9df608a2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"5757e51b_ac03c67c","updated":"2025-09-19 12:27:39.000000000","message":"We have the futurist fix in place. Master is now Gazpacho. And we agreed that we do the refactors in a follow up. So what remains here is:\n* doc update to note that nova-conductor is now support threadin\n* a release notes\n* nova-next job config update to switch the conductor to threading mode in nova-next.","commit_id":"9f58f596dbbbe3151f921764742b1d90dcf7ad9c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b754e751786b25fa07da724e696ed4e69abe3b50","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"409c0516_3a915bf9","updated":"2025-10-02 11:17:29.000000000","message":"i dont see anything that cant be adjusted later or that we have not dicsuseedd so now that 2026.1 is fully open for new dev lets keep this moving.","commit_id":"9f58f596dbbbe3151f921764742b1d90dcf7ad9c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b87d450164aae7fd3ed3679a44a6ee180ddd361e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"1f19819b_936b9bc4","updated":"2025-09-22 15:03:14.000000000","message":"recheck lets get fresh runs","commit_id":"9f58f596dbbbe3151f921764742b1d90dcf7ad9c"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"7bbc9ab4376e42bfa22f9aafe3d7a5378e4c0da7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"bf5f2dd9_61ad3d6f","updated":"2025-09-18 08:25:26.000000000","message":"recheck run-grenade: Run grenade - failed","commit_id":"9f58f596dbbbe3151f921764742b1d90dcf7ad9c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6961ce1a3fd3df8a5a041cf923c9d351160b10c5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"59faca27_3c0a4a8c","in_reply_to":"5757e51b_ac03c67c","updated":"2025-09-19 12:38:42.000000000","message":"OK, my mistake. We have a separate patch with all the missing pieces https://review.opendev.org/c/openstack/nova/+/958575\n\nI just blow up the patch series when we tried to pull this in to Flamingo.\n@kamil please pull this out of my series and put https://review.opendev.org/c/openstack/nova/+/958575 top of it. Then I will be +2 on it.","commit_id":"9f58f596dbbbe3151f921764742b1d90dcf7ad9c"}],"nova/conductor/api.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b35e0cef53aa22c1ad15b8d3c2e9f23d6fc8c6e2","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                          contact"},{"line_number":171,"context_line":"        :param image_ids: A list of image ID strings to send to the hosts"},{"line_number":172,"context_line":"        \"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        for image_id in image_ids:"},{"line_number":175,"context_line":"            # Validate that we can get the image by id before we go"},{"line_number":176,"context_line":"            # ask a bunch of hosts to do the same. We let this bubble"}],"source_content_type":"text/x-python","patch_set":1,"id":"03c4edbb_9a50278a","line":173,"updated":"2025-08-12 10:48:11.000000000","message":"nit: this is required by docutils as a pep8 style exteion\nso it was proablly added by auto pep8 when you locally touched this file and then removed your changes.\n\nso technially unrelated but its fine.","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"1a00ae2948f3e7c956cd29fe61266a74eb0efcd6","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                          contact"},{"line_number":171,"context_line":"        :param image_ids: A list of image ID strings to send to the hosts"},{"line_number":172,"context_line":"        \"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        for image_id in image_ids:"},{"line_number":175,"context_line":"            # Validate that we can get the image by id before we go"},{"line_number":176,"context_line":"            # ask a bunch of hosts to do the same. We let this bubble"}],"source_content_type":"text/x-python","patch_set":1,"id":"8dd0a497_97448205","line":173,"in_reply_to":"03c4edbb_9a50278a","updated":"2025-08-13 07:54:27.000000000","message":"ack, I didn\u0027t notice during commit","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"ae2c4d8dbe5bc78a08b2d3557c8dc958e00fed57","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                          contact"},{"line_number":171,"context_line":"        :param image_ids: A list of image ID strings to send to the hosts"},{"line_number":172,"context_line":"        \"\"\""},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        for image_id in image_ids:"},{"line_number":175,"context_line":"            # Validate that we can get the image by id before we go"},{"line_number":176,"context_line":"            # ask a bunch of hosts to do the same. We let this bubble"}],"source_content_type":"text/x-python","patch_set":1,"id":"44874f5e_05cbdcbe","line":173,"in_reply_to":"8dd0a497_97448205","updated":"2025-08-19 12:43:28.000000000","message":"done","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"}],"nova/conductor/manager.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a0f4ed56492e51622cd08f81bdd9f0b9ba696f4","unresolved":true,"context_lines":[{"line_number":2070,"context_line":"            fields.NotificationPhase.START)"},{"line_number":2071,"context_line":""},{"line_number":2072,"context_line":"        clock \u003d timeutils.StopWatch()"},{"line_number":2073,"context_line":"        threads \u003d CONF.image_cache.precache_concurrency"},{"line_number":2074,"context_line":"        fetch_executor \u003d utils.create_executor(max_workers\u003dthreads)"},{"line_number":2075,"context_line":""},{"line_number":2076,"context_line":"        hosts_by_cell \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"9b0778c5_91da3c14","line":2073,"updated":"2025-08-14 14:43:38.000000000","message":"OK the default of this is 1. So by switching to threading this does not get immediately super expensive.","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"ae2c4d8dbe5bc78a08b2d3557c8dc958e00fed57","unresolved":false,"context_lines":[{"line_number":2070,"context_line":"            fields.NotificationPhase.START)"},{"line_number":2071,"context_line":""},{"line_number":2072,"context_line":"        clock \u003d timeutils.StopWatch()"},{"line_number":2073,"context_line":"        threads \u003d CONF.image_cache.precache_concurrency"},{"line_number":2074,"context_line":"        fetch_executor \u003d utils.create_executor(max_workers\u003dthreads)"},{"line_number":2075,"context_line":""},{"line_number":2076,"context_line":"        hosts_by_cell \u003d {}"}],"source_content_type":"text/x-python","patch_set":1,"id":"2eef97b4_73e4ed9f","line":2073,"in_reply_to":"9b0778c5_91da3c14","updated":"2025-08-19 12:43:28.000000000","message":"Done","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a0f4ed56492e51622cd08f81bdd9f0b9ba696f4","unresolved":true,"context_lines":[{"line_number":2099,"context_line":""},{"line_number":2100,"context_line":"        def host_completed(context, host, result):"},{"line_number":2101,"context_line":"            for image_id, status in result.items():"},{"line_number":2102,"context_line":"                cached, existing, error, unsupported \u003d stats[image_id]"},{"line_number":2103,"context_line":"                if status \u003d\u003d \u0027error\u0027:"},{"line_number":2104,"context_line":"                    failed_images[image_id] +\u003d 1"},{"line_number":2105,"context_line":"                    error +\u003d 1"},{"line_number":2106,"context_line":"                elif status \u003d\u003d \u0027cached\u0027:"},{"line_number":2107,"context_line":"                    cached +\u003d 1"},{"line_number":2108,"context_line":"                elif status \u003d\u003d \u0027existing\u0027:"},{"line_number":2109,"context_line":"                    existing +\u003d 1"},{"line_number":2110,"context_line":"                elif status \u003d\u003d \u0027unsupported\u0027:"},{"line_number":2111,"context_line":"                    unsupported +\u003d 1"},{"line_number":2112,"context_line":"                stats[image_id] \u003d (cached, existing, error, unsupported)"},{"line_number":2113,"context_line":""},{"line_number":2114,"context_line":"            host_stats[\u0027completed\u0027] +\u003d 1"},{"line_number":2115,"context_line":"            compute_utils.notify_about_aggregate_cache(context, aggregate,"}],"source_content_type":"text/x-python","patch_set":1,"id":"c3b725e3_8fdfdbda","line":2112,"range":{"start_line":2102,"start_character":0,"end_line":2112,"end_character":72},"updated":"2025-08-14 14:43:38.000000000","message":"``stats`` is shared state across multiple tasks executing concurrently so this is racy now and should be guarded by a lock or rewritten to not run concurrently in other ways (e.g. moving the result processing to the caller thread from the task).\n\ne.g. imagine if two tasks runs concurrently in the following sequence:\n1. T1 executes L2102 on image1\n2. T2 executes L2102 on image1\nnow both sees the same stats of image1\n3. T1 updates its local copy of the stats with it result of the operations and stores the data back to the shared stats by executing L2103-2112\n4. T2 does the same with its own result for image1 but because it haven\u0027t seen the update from T1 it overwrites T1\u0027s update.","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"626dd33d1d8ebb2401132abaf35ccec141b7360a","unresolved":false,"context_lines":[{"line_number":2099,"context_line":""},{"line_number":2100,"context_line":"        def host_completed(context, host, result):"},{"line_number":2101,"context_line":"            for image_id, status in result.items():"},{"line_number":2102,"context_line":"                cached, existing, error, unsupported \u003d stats[image_id]"},{"line_number":2103,"context_line":"                if status \u003d\u003d \u0027error\u0027:"},{"line_number":2104,"context_line":"                    failed_images[image_id] +\u003d 1"},{"line_number":2105,"context_line":"                    error +\u003d 1"},{"line_number":2106,"context_line":"                elif status \u003d\u003d \u0027cached\u0027:"},{"line_number":2107,"context_line":"                    cached +\u003d 1"},{"line_number":2108,"context_line":"                elif status \u003d\u003d \u0027existing\u0027:"},{"line_number":2109,"context_line":"                    existing +\u003d 1"},{"line_number":2110,"context_line":"                elif status \u003d\u003d \u0027unsupported\u0027:"},{"line_number":2111,"context_line":"                    unsupported +\u003d 1"},{"line_number":2112,"context_line":"                stats[image_id] \u003d (cached, existing, error, unsupported)"},{"line_number":2113,"context_line":""},{"line_number":2114,"context_line":"            host_stats[\u0027completed\u0027] +\u003d 1"},{"line_number":2115,"context_line":"            compute_utils.notify_about_aggregate_cache(context, aggregate,"}],"source_content_type":"text/x-python","patch_set":1,"id":"e749929c_f38ef46f","line":2112,"range":{"start_line":2102,"start_character":0,"end_line":2112,"end_character":72},"in_reply_to":"a138a264_a5f0600f","updated":"2025-08-26 19:46:25.000000000","message":"well this was also techinially a race before but\nwe got away with it because tehre was no io before\n\ncompute_utils.notify_about_aggregate_cache\n\nso there was no opertunity for eventlet to inject a yeild.\n\nbut we were still mutating shared state between greenthread without a lock which is logiclly incorrect even if in this case we got away with it.","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"ae2c4d8dbe5bc78a08b2d3557c8dc958e00fed57","unresolved":false,"context_lines":[{"line_number":2099,"context_line":""},{"line_number":2100,"context_line":"        def host_completed(context, host, result):"},{"line_number":2101,"context_line":"            for image_id, status in result.items():"},{"line_number":2102,"context_line":"                cached, existing, error, unsupported \u003d stats[image_id]"},{"line_number":2103,"context_line":"                if status \u003d\u003d \u0027error\u0027:"},{"line_number":2104,"context_line":"                    failed_images[image_id] +\u003d 1"},{"line_number":2105,"context_line":"                    error +\u003d 1"},{"line_number":2106,"context_line":"                elif status \u003d\u003d \u0027cached\u0027:"},{"line_number":2107,"context_line":"                    cached +\u003d 1"},{"line_number":2108,"context_line":"                elif status \u003d\u003d \u0027existing\u0027:"},{"line_number":2109,"context_line":"                    existing +\u003d 1"},{"line_number":2110,"context_line":"                elif status \u003d\u003d \u0027unsupported\u0027:"},{"line_number":2111,"context_line":"                    unsupported +\u003d 1"},{"line_number":2112,"context_line":"                stats[image_id] \u003d (cached, existing, error, unsupported)"},{"line_number":2113,"context_line":""},{"line_number":2114,"context_line":"            host_stats[\u0027completed\u0027] +\u003d 1"},{"line_number":2115,"context_line":"            compute_utils.notify_about_aggregate_cache(context, aggregate,"}],"source_content_type":"text/x-python","patch_set":1,"id":"a138a264_a5f0600f","line":2112,"range":{"start_line":2102,"start_character":0,"end_line":2112,"end_character":72},"in_reply_to":"c3b725e3_8fdfdbda","updated":"2025-08-19 12:43:28.000000000","message":"Done","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a0f4ed56492e51622cd08f81bdd9f0b9ba696f4","unresolved":true,"context_lines":[{"line_number":2118,"context_line":"                                                       host_stats[\u0027total\u0027])"},{"line_number":2119,"context_line":""},{"line_number":2120,"context_line":"        def wrap_cache_images(ctxt, host, image_ids):"},{"line_number":2121,"context_line":"            result \u003d self.compute_rpcapi.cache_images("},{"line_number":2122,"context_line":"                ctxt,"},{"line_number":2123,"context_line":"                host\u003dhost,"},{"line_number":2124,"context_line":"                image_ids\u003dimage_ids)"},{"line_number":2125,"context_line":"            host_completed(context, host, result)"},{"line_number":2126,"context_line":""},{"line_number":2127,"context_line":"        def skipped_host(context, host, image_ids):"},{"line_number":2128,"context_line":"            result \u003d {image: \u0027skipped\u0027 for image in image_ids}"}],"source_content_type":"text/x-python","patch_set":1,"id":"724b35bd_e0c997f4","line":2125,"range":{"start_line":2121,"start_character":0,"end_line":2125,"end_character":49},"updated":"2025-08-14 14:43:38.000000000","message":"this is potentially running in concurrent threads now as wrap_cache_images is passed to spawn_on. So we need to make sure that what we have here is thread safe.\n\n1. self.compute_rpcapi.cache_images: This only do reads and then calls oslo.messaging so if oslo.messaging is thread safe and we are not passing mutable state then we are fine. ctxt is a cell specific copy of the outside context targeted to the given cell the host is in so if we have two cells we have two independent copies of the context tuned to the given cell. host is task specific, image_ids does not change across the tasks. So this seems OK.\n\n2. host_completed: see my other comments in the implementation of that function.","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"235b0f5210e5a7e23074752e3afa8f717e3e997d","unresolved":false,"context_lines":[{"line_number":2118,"context_line":"                                                       host_stats[\u0027total\u0027])"},{"line_number":2119,"context_line":""},{"line_number":2120,"context_line":"        def wrap_cache_images(ctxt, host, image_ids):"},{"line_number":2121,"context_line":"            result \u003d self.compute_rpcapi.cache_images("},{"line_number":2122,"context_line":"                ctxt,"},{"line_number":2123,"context_line":"                host\u003dhost,"},{"line_number":2124,"context_line":"                image_ids\u003dimage_ids)"},{"line_number":2125,"context_line":"            host_completed(context, host, result)"},{"line_number":2126,"context_line":""},{"line_number":2127,"context_line":"        def skipped_host(context, host, image_ids):"},{"line_number":2128,"context_line":"            result \u003d {image: \u0027skipped\u0027 for image in image_ids}"}],"source_content_type":"text/x-python","patch_set":1,"id":"519d0fdf_60fec9d3","line":2125,"range":{"start_line":2121,"start_character":0,"end_line":2125,"end_character":49},"in_reply_to":"724b35bd_e0c997f4","updated":"2025-08-26 15:09:16.000000000","message":"Done","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"773124a02fdc26dc7b9daac1024ddc80d74c023c","unresolved":true,"context_lines":[{"line_number":2099,"context_line":"        }"},{"line_number":2100,"context_line":""},{"line_number":2101,"context_line":"        def host_completed(context, host, result):"},{"line_number":2102,"context_line":"            with threading.Lock():"},{"line_number":2103,"context_line":"                for image_id, status in result.items():"},{"line_number":2104,"context_line":"                    cached, existing, error, unsupported \u003d stats[image_id]"},{"line_number":2105,"context_line":"                    if status \u003d\u003d \u0027error\u0027:"}],"source_content_type":"text/x-python","patch_set":2,"id":"45c6670e_b5c41fbf","line":2102,"updated":"2025-08-25 10:51:02.000000000","message":"This means each call to host_completed will create a new lock instance then lock that instance. So this does not prevent that two concurrent calls for host_completed to overlap as they will have two independent lock instances.","commit_id":"f0836ca1beceb20d3d69e0e16070050e378a8ad1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"235b0f5210e5a7e23074752e3afa8f717e3e997d","unresolved":false,"context_lines":[{"line_number":2099,"context_line":"        }"},{"line_number":2100,"context_line":""},{"line_number":2101,"context_line":"        def host_completed(context, host, result):"},{"line_number":2102,"context_line":"            with threading.Lock():"},{"line_number":2103,"context_line":"                for image_id, status in result.items():"},{"line_number":2104,"context_line":"                    cached, existing, error, unsupported \u003d stats[image_id]"},{"line_number":2105,"context_line":"                    if status \u003d\u003d \u0027error\u0027:"}],"source_content_type":"text/x-python","patch_set":2,"id":"2439a335_23b0d71f","line":2102,"in_reply_to":"45c6670e_b5c41fbf","updated":"2025-08-26 15:09:16.000000000","message":"Done","commit_id":"f0836ca1beceb20d3d69e0e16070050e378a8ad1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"6bd496c3e3edf15e771b28f48a7f591e79113788","unresolved":true,"context_lines":[{"line_number":249,"context_line":"        self.notifier \u003d rpc.get_notifier(\u0027compute\u0027)"},{"line_number":250,"context_line":"        # Help us to record host in EventReporter"},{"line_number":251,"context_line":"        self.host \u003d CONF.host"},{"line_number":252,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        try:"},{"line_number":255,"context_line":"            # Test our placement client during initialization"}],"source_content_type":"text/x-python","patch_set":4,"id":"536d2798_b99bc504","line":252,"updated":"2025-08-25 16:50:16.000000000","message":"I suggest to move this to be a local variable in cache_image as we can potentially have multiple independent cache_image operations on different aggregates / images in parallel. Those are OK to overlap in host_complete, which is a local function within cache_image, as they does not share the same stats dict which is also local to cache_image.","commit_id":"eb8ee2fc98da2e27cd7907a1b5ca6d42de746e97"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"b89848bc0536b13685a4ef52199edfd5bf7c7d3f","unresolved":false,"context_lines":[{"line_number":249,"context_line":"        self.notifier \u003d rpc.get_notifier(\u0027compute\u0027)"},{"line_number":250,"context_line":"        # Help us to record host in EventReporter"},{"line_number":251,"context_line":"        self.host \u003d CONF.host"},{"line_number":252,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        try:"},{"line_number":255,"context_line":"            # Test our placement client during initialization"}],"source_content_type":"text/x-python","patch_set":4,"id":"31d186d4_85d57758","line":252,"in_reply_to":"536d2798_b99bc504","updated":"2025-08-26 09:20:19.000000000","message":"Done","commit_id":"eb8ee2fc98da2e27cd7907a1b5ca6d42de746e97"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e76f9b986056887a5365b05590dcc20f5c1d228b","unresolved":true,"context_lines":[{"line_number":2054,"context_line":"            return False"},{"line_number":2055,"context_line":"        return True"},{"line_number":2056,"context_line":""},{"line_number":2057,"context_line":"    def cache_images(self, context, aggregate, image_ids):"},{"line_number":2058,"context_line":"        \"\"\"Cache a set of images on the set of hosts in an aggregate."},{"line_number":2059,"context_line":""},{"line_number":2060,"context_line":"        :param context: The RequestContext"}],"source_content_type":"text/x-python","patch_set":5,"id":"b0a9f3c9_67e668f5","line":2057,"updated":"2025-08-26 15:54:24.000000000","message":"do we have some Tempest tests that execute that image caching, ideally run by nova-next ?","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"626dd33d1d8ebb2401132abaf35ccec141b7360a","unresolved":true,"context_lines":[{"line_number":2054,"context_line":"            return False"},{"line_number":2055,"context_line":"        return True"},{"line_number":2056,"context_line":""},{"line_number":2057,"context_line":"    def cache_images(self, context, aggregate, image_ids):"},{"line_number":2058,"context_line":"        \"\"\"Cache a set of images on the set of hosts in an aggregate."},{"line_number":2059,"context_line":""},{"line_number":2060,"context_line":"        :param context: The RequestContext"}],"source_content_type":"text/x-python","patch_set":5,"id":"68b90ea9_d1e2b77b","line":2057,"in_reply_to":"2ad516e9_a21ffdb0","updated":"2025-08-26 19:46:25.000000000","message":"ya its a testing gap but one we can close seperatly.\n\n+1 on extending whithbox to do this although that shoudl not block this form progressing.\n\ni said this on irc 2 or 3 times now over the last month or so but i want to evovle the nova-ovs-hybrid-plug job into nova-alt-config\n\nwhich will in the future test, python 3.13 on debian + spice + ml2/ovs + nfs and a subset of whitebox tests that do not require real hardware. that should eventually include numa and or cpu pinnning if possible in our ci.\n\ncpu pinning is doable but numa may not be.\n\nas that job runs a smallser set of tests im also hoping to be able to have at least 1 test with 2mb hugepages eventually.\n\nthe idea of rebranding it as nova-alt-config is to make it serve a similar role to nova-next but instead of the implication that the config choice are ment to test what will become our new default i want it to explicit test thing that are not the default. i.e. ml2/ovs not ovn. nova on nfs not local storage.\nspice not vnc and so on.\n\ni have been thinking about this for a few release now and had one false start with pinning in the past, i think this is a good way to add valuable extra coverage without expanding the number of jobs we need.\n\nif we are happy to also add the same limited subset of whitebox test to nova next we can test this fucntionality with and without eventlet until we finally remove supprot for it.","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fc9c71c16eb2f5108729566f20da08247e438f78","unresolved":true,"context_lines":[{"line_number":2054,"context_line":"            return False"},{"line_number":2055,"context_line":"        return True"},{"line_number":2056,"context_line":""},{"line_number":2057,"context_line":"    def cache_images(self, context, aggregate, image_ids):"},{"line_number":2058,"context_line":"        \"\"\"Cache a set of images on the set of hosts in an aggregate."},{"line_number":2059,"context_line":""},{"line_number":2060,"context_line":"        :param context: The RequestContext"}],"source_content_type":"text/x-python","patch_set":5,"id":"2ad516e9_a21ffdb0","line":2057,"in_reply_to":"b0a9f3c9_67e668f5","updated":"2025-08-26 16:04:45.000000000","message":"No, because it\u0027s not externally-verifiable. We should have some whitebox tests for this I think. When I wrote this feature I did a bunch of hand verification, which is probably what we need here in the short term, but I agree this is a testing gap.","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"}],"nova/utils.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a0f4ed56492e51622cd08f81bdd9f0b9ba696f4","unresolved":true,"context_lines":[{"line_number":107,"context_line":"    DEFAULT_EXECUTOR \u003d None"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def create_executor(max_workers\u003dNone):"},{"line_number":111,"context_line":"    if concurrency_mode_threading():"},{"line_number":112,"context_line":"        executor \u003d futurist.ThreadPoolExecutor("},{"line_number":113,"context_line":"            max_workers"}],"source_content_type":"text/x-python","patch_set":1,"id":"6c91c277_d2c32009","line":110,"updated":"2025-08-14 14:43:38.000000000","message":"max_workers arg should not be defaulted, make it mandatory.","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b35e0cef53aa22c1ad15b8d3c2e9f23d6fc8c6e2","unresolved":true,"context_lines":[{"line_number":107,"context_line":"    DEFAULT_EXECUTOR \u003d None"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def create_executor(max_workers\u003dNone):"},{"line_number":111,"context_line":"    if concurrency_mode_threading():"},{"line_number":112,"context_line":"        executor \u003d futurist.ThreadPoolExecutor("},{"line_number":113,"context_line":"            max_workers"}],"source_content_type":"text/x-python","patch_set":1,"id":"972b3ed0_32d1f2b1","line":110,"updated":"2025-08-12 10:48:11.000000000","message":"why not just use the defautl executor?","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9960911edd371f948ca003602d1fb06efdd49585","unresolved":true,"context_lines":[{"line_number":107,"context_line":"    DEFAULT_EXECUTOR \u003d None"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def create_executor(max_workers\u003dNone):"},{"line_number":111,"context_line":"    if concurrency_mode_threading():"},{"line_number":112,"context_line":"        executor \u003d futurist.ThreadPoolExecutor("},{"line_number":113,"context_line":"            max_workers"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ab340d1_d591c040","line":110,"in_reply_to":"20e9ddfd_040f030b","updated":"2025-08-13 10:44:37.000000000","message":"so it was precisely the creation and closing of the executor that i wanted to avoid by reusing the standard theread pool\n\nthe default executor will not be used for much if anything in the conductor\nso it shoudl normally be free for us to use.\n\nwe can still use CONF.image_cache.precache_concurrency to contolle the concurancy\ni.e. how many tasks we submit to the executor (the number of future we wait on in a loop) while contoling the paralleisum via  CONF.default_thread_pool_size\n\nits a larger change but im inclidne to say we should not be using shutdown to hanel the wait for completion and you should be using the future instead.\n\nespically if we also want to potically cancel them if we exceed a timeout.","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"ae2c4d8dbe5bc78a08b2d3557c8dc958e00fed57","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    DEFAULT_EXECUTOR \u003d None"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def create_executor(max_workers\u003dNone):"},{"line_number":111,"context_line":"    if concurrency_mode_threading():"},{"line_number":112,"context_line":"        executor \u003d futurist.ThreadPoolExecutor("},{"line_number":113,"context_line":"            max_workers"}],"source_content_type":"text/x-python","patch_set":1,"id":"c657ff8c_a0b7d72a","line":110,"in_reply_to":"6c91c277_d2c32009","updated":"2025-08-19 12:43:28.000000000","message":"Done","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"1a00ae2948f3e7c956cd29fe61266a74eb0efcd6","unresolved":true,"context_lines":[{"line_number":107,"context_line":"    DEFAULT_EXECUTOR \u003d None"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"def create_executor(max_workers\u003dNone):"},{"line_number":111,"context_line":"    if concurrency_mode_threading():"},{"line_number":112,"context_line":"        executor \u003d futurist.ThreadPoolExecutor("},{"line_number":113,"context_line":"            max_workers"}],"source_content_type":"text/x-python","patch_set":1,"id":"20e9ddfd_040f030b","line":110,"in_reply_to":"972b3ed0_32d1f2b1","updated":"2025-08-13 07:54:27.000000000","message":"I moved this into a separate function so it doesn’t interfere with DEFAULT_EXECUTOR, whose worker count comes from CONF.default_thread_pool_size or CONF.default_green_pool_size. In the conductor, concurrency is controlled by CONF.image_cache.precache_concurrency. The conductor also has a different executor lifecycle: we create/close it inside cache_images and wait for it to finish https://github.com/openstack/nova/blob/29091643917d959f5f2d81e7a9b6842e8cc7fe4e/nova/conductor/manager.py#L2150","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a0f4ed56492e51622cd08f81bdd9f0b9ba696f4","unresolved":true,"context_lines":[{"line_number":123,"context_line":"    global DEFAULT_EXECUTOR"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    if not DEFAULT_EXECUTOR:"},{"line_number":126,"context_line":"        max_workers \u003d CONF.default_thread_pool_size \\"},{"line_number":127,"context_line":"            if concurrency_mode_threading() else CONF.default_green_pool_size"},{"line_number":128,"context_line":"        DEFAULT_EXECUTOR \u003d create_executor(max_workers)"},{"line_number":129,"context_line":"        pname \u003d multiprocessing.current_process().name"}],"source_content_type":"text/x-python","patch_set":1,"id":"4a18ed02_a1d89985","line":126,"updated":"2025-08-14 14:43:38.000000000","message":"please avoid using backslash to split long lines. You can introduce temp vars or use () instead.","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"ae2c4d8dbe5bc78a08b2d3557c8dc958e00fed57","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    global DEFAULT_EXECUTOR"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    if not DEFAULT_EXECUTOR:"},{"line_number":126,"context_line":"        max_workers \u003d CONF.default_thread_pool_size \\"},{"line_number":127,"context_line":"            if concurrency_mode_threading() else CONF.default_green_pool_size"},{"line_number":128,"context_line":"        DEFAULT_EXECUTOR \u003d create_executor(max_workers)"},{"line_number":129,"context_line":"        pname \u003d multiprocessing.current_process().name"}],"source_content_type":"text/x-python","patch_set":1,"id":"b8407317_2574f76f","line":126,"in_reply_to":"4a18ed02_a1d89985","updated":"2025-08-19 12:43:28.000000000","message":"Done","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a0f4ed56492e51622cd08f81bdd9f0b9ba696f4","unresolved":true,"context_lines":[{"line_number":1311,"context_line":"    global SCATTER_GATHER_EXECUTOR"},{"line_number":1312,"context_line":""},{"line_number":1313,"context_line":"    if not SCATTER_GATHER_EXECUTOR:"},{"line_number":1314,"context_line":"        if concurrency_mode_threading():"},{"line_number":1315,"context_line":"            SCATTER_GATHER_EXECUTOR \u003d futurist.ThreadPoolExecutor("},{"line_number":1316,"context_line":"                CONF.cell_worker_thread_pool_size)"},{"line_number":1317,"context_line":"        else:"},{"line_number":1318,"context_line":"            SCATTER_GATHER_EXECUTOR \u003d futurist.GreenThreadPoolExecutor()"},{"line_number":1319,"context_line":""},{"line_number":1320,"context_line":"        pname \u003d multiprocessing.current_process().name"},{"line_number":1321,"context_line":"        executor_name \u003d f\"{pname}.cell_worker\""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a7e71c1_c7766622","line":1318,"range":{"start_line":1314,"start_character":0,"end_line":1318,"end_character":72},"updated":"2025-08-14 14:43:38.000000000","message":"you can use the new create_executor helper here too.","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"ae2c4d8dbe5bc78a08b2d3557c8dc958e00fed57","unresolved":false,"context_lines":[{"line_number":1311,"context_line":"    global SCATTER_GATHER_EXECUTOR"},{"line_number":1312,"context_line":""},{"line_number":1313,"context_line":"    if not SCATTER_GATHER_EXECUTOR:"},{"line_number":1314,"context_line":"        if concurrency_mode_threading():"},{"line_number":1315,"context_line":"            SCATTER_GATHER_EXECUTOR \u003d futurist.ThreadPoolExecutor("},{"line_number":1316,"context_line":"                CONF.cell_worker_thread_pool_size)"},{"line_number":1317,"context_line":"        else:"},{"line_number":1318,"context_line":"            SCATTER_GATHER_EXECUTOR \u003d futurist.GreenThreadPoolExecutor()"},{"line_number":1319,"context_line":""},{"line_number":1320,"context_line":"        pname \u003d multiprocessing.current_process().name"},{"line_number":1321,"context_line":"        executor_name \u003d f\"{pname}.cell_worker\""}],"source_content_type":"text/x-python","patch_set":1,"id":"83a31b8a_4d87b190","line":1318,"range":{"start_line":1314,"start_character":0,"end_line":1318,"end_character":72},"in_reply_to":"9a7e71c1_c7766622","updated":"2025-08-19 12:43:28.000000000","message":"Done","commit_id":"5f4ec1b9814217c4d7c01e532673057b2f0b7ac8"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e76f9b986056887a5365b05590dcc20f5c1d228b","unresolved":true,"context_lines":[{"line_number":105,"context_line":"    DEFAULT_EXECUTOR \u003d None"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"def create_executor(max_workers):"},{"line_number":109,"context_line":"    if concurrency_mode_threading():"},{"line_number":110,"context_line":"        executor \u003d futurist.ThreadPoolExecutor("},{"line_number":111,"context_line":"            max_workers"}],"source_content_type":"text/x-python","patch_set":5,"id":"1e6bc9ca_9541383c","line":108,"updated":"2025-08-26 15:54:24.000000000","message":"I don\u0027t see any unittest related to that method ?","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7ccc6e974aebfe8d6277415ad95b6adafaa29a82","unresolved":true,"context_lines":[{"line_number":105,"context_line":"    DEFAULT_EXECUTOR \u003d None"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"def create_executor(max_workers):"},{"line_number":109,"context_line":"    if concurrency_mode_threading():"},{"line_number":110,"context_line":"        executor \u003d futurist.ThreadPoolExecutor("},{"line_number":111,"context_line":"            max_workers"}],"source_content_type":"text/x-python","patch_set":5,"id":"0c43d11f_e9910fd8","line":108,"in_reply_to":"1e6bc9ca_9541383c","updated":"2025-08-26 16:15:44.000000000","message":"It already has unit test coverage via its callers. But sure if you want it we can duplicate those.","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"41c1347cce3774a374fc62b0f8487b8079f73085","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    DEFAULT_EXECUTOR \u003d None"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"def create_executor(max_workers):"},{"line_number":109,"context_line":"    if concurrency_mode_threading():"},{"line_number":110,"context_line":"        executor \u003d futurist.ThreadPoolExecutor("},{"line_number":111,"context_line":"            max_workers"}],"source_content_type":"text/x-python","patch_set":5,"id":"74d00ed3_e8456646","line":108,"in_reply_to":"1e6bc9ca_9541383c","updated":"2025-08-26 16:25:03.000000000","message":"nevermind my comment, I missed the point that this new facade is just a refactoring of the existing conditionals","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"52648b248fe724fd89e32af63f01361e5f526c5a","unresolved":true,"context_lines":[{"line_number":109,"context_line":"    if concurrency_mode_threading():"},{"line_number":110,"context_line":"        executor \u003d futurist.ThreadPoolExecutor("},{"line_number":111,"context_line":"            max_workers"},{"line_number":112,"context_line":"        )"},{"line_number":113,"context_line":"    else:"},{"line_number":114,"context_line":"        executor \u003d futurist.GreenThreadPoolExecutor("},{"line_number":115,"context_line":"            max_workers"}],"source_content_type":"text/x-python","patch_set":5,"id":"eea5cf75_c9890946","line":112,"updated":"2025-08-26 16:17:55.000000000","message":"Also, this would all very easily fit on one line instead of three. Can we please not do this?","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"403a3234b61b169c8e91687f63009595c634a524","unresolved":false,"context_lines":[{"line_number":109,"context_line":"    if concurrency_mode_threading():"},{"line_number":110,"context_line":"        executor \u003d futurist.ThreadPoolExecutor("},{"line_number":111,"context_line":"            max_workers"},{"line_number":112,"context_line":"        )"},{"line_number":113,"context_line":"    else:"},{"line_number":114,"context_line":"        executor \u003d futurist.GreenThreadPoolExecutor("},{"line_number":115,"context_line":"            max_workers"}],"source_content_type":"text/x-python","patch_set":5,"id":"3e6725b6_95b14db0","line":112,"in_reply_to":"8f8174d6_117baa24","updated":"2025-08-27 08:52:02.000000000","message":"Done","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cd81d9ce4afbc379e730f15d8df8334a5303e42f","unresolved":true,"context_lines":[{"line_number":109,"context_line":"    if concurrency_mode_threading():"},{"line_number":110,"context_line":"        executor \u003d futurist.ThreadPoolExecutor("},{"line_number":111,"context_line":"            max_workers"},{"line_number":112,"context_line":"        )"},{"line_number":113,"context_line":"    else:"},{"line_number":114,"context_line":"        executor \u003d futurist.GreenThreadPoolExecutor("},{"line_number":115,"context_line":"            max_workers"}],"source_content_type":"text/x-python","patch_set":5,"id":"8f8174d6_117baa24","line":112,"in_reply_to":"eea5cf75_c9890946","updated":"2025-08-27 08:31:37.000000000","message":"@ksambor@redhat.com feel free to respin due to this. Just make sure to keep the commit series in the same order :)","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"235b0f5210e5a7e23074752e3afa8f717e3e997d","unresolved":false,"context_lines":[{"line_number":1194,"context_line":"    if not SCATTER_GATHER_EXECUTOR:"},{"line_number":1195,"context_line":"        max_workers \u003d ("},{"line_number":1196,"context_line":"            CONF.cell_worker_thread_pool_size"},{"line_number":1197,"context_line":"            if concurrency_mode_threading() else 1000"},{"line_number":1198,"context_line":"            )"},{"line_number":1199,"context_line":"        SCATTER_GATHER_EXECUTOR \u003d create_executor(max_workers)"},{"line_number":1200,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"2b26b0fa_51cc61cb","line":1197,"updated":"2025-08-26 15:09:16.000000000","message":"OK this is the default max_workers in futurist for GreenThreadPoolExecutor https://github.com/openstack/futurist/blob/9ea9a0080f07bcb856c0ed923a509f649833ca49/futurist/_futures.py#L549C24-L549C35 So this is equivalent.","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"e76f9b986056887a5365b05590dcc20f5c1d228b","unresolved":true,"context_lines":[{"line_number":1194,"context_line":"    if not SCATTER_GATHER_EXECUTOR:"},{"line_number":1195,"context_line":"        max_workers \u003d ("},{"line_number":1196,"context_line":"            CONF.cell_worker_thread_pool_size"},{"line_number":1197,"context_line":"            if concurrency_mode_threading() else 1000"},{"line_number":1198,"context_line":"            )"},{"line_number":1199,"context_line":"        SCATTER_GATHER_EXECUTOR \u003d create_executor(max_workers)"},{"line_number":1200,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3176cc99_9795e552","line":1197,"range":{"start_line":1197,"start_character":49,"end_line":1197,"end_character":53},"updated":"2025-08-26 15:54:24.000000000","message":"any reason why this value is hardcoded ?","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b775222ceda272eb0dfdbaacf1f7bd508b08bd7a","unresolved":true,"context_lines":[{"line_number":1194,"context_line":"    if not SCATTER_GATHER_EXECUTOR:"},{"line_number":1195,"context_line":"        max_workers \u003d ("},{"line_number":1196,"context_line":"            CONF.cell_worker_thread_pool_size"},{"line_number":1197,"context_line":"            if concurrency_mode_threading() else 1000"},{"line_number":1198,"context_line":"            )"},{"line_number":1199,"context_line":"        SCATTER_GATHER_EXECUTOR \u003d create_executor(max_workers)"},{"line_number":1200,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"b820be80_5f681505","line":1197,"range":{"start_line":1197,"start_character":49,"end_line":1197,"end_character":53},"in_reply_to":"0e1ea823_a7f668e2","updated":"2025-08-26 16:34:22.000000000","message":"It\u0027s not just futurist, I think this is the default in eventlet as well, as I mentioned:\n\nhttps://eventlet.readthedocs.io/en/latest/modules/greenpool.html\n\nIt\u0027s the limit we\u0027ve been running with forever. And since this code has the goal of getting rid of eventlet, I think taking that default here is totally fine since we\u0027ve never needed to tweak it (AFAIK) and it will be gone in a few years anyway.","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"41c1347cce3774a374fc62b0f8487b8079f73085","unresolved":true,"context_lines":[{"line_number":1194,"context_line":"    if not SCATTER_GATHER_EXECUTOR:"},{"line_number":1195,"context_line":"        max_workers \u003d ("},{"line_number":1196,"context_line":"            CONF.cell_worker_thread_pool_size"},{"line_number":1197,"context_line":"            if concurrency_mode_threading() else 1000"},{"line_number":1198,"context_line":"            )"},{"line_number":1199,"context_line":"        SCATTER_GATHER_EXECUTOR \u003d create_executor(max_workers)"},{"line_number":1200,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"0e1ea823_a7f668e2","line":1197,"range":{"start_line":1197,"start_character":49,"end_line":1197,"end_character":53},"in_reply_to":"3176cc99_9795e552","updated":"2025-08-26 16:25:03.000000000","message":"I see now why this is 1000, because the default value is indeed 1000 but that sounds a breaking change if the default value changes in futurist, right?","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"52648b248fe724fd89e32af63f01361e5f526c5a","unresolved":true,"context_lines":[{"line_number":1194,"context_line":"    if not SCATTER_GATHER_EXECUTOR:"},{"line_number":1195,"context_line":"        max_workers \u003d ("},{"line_number":1196,"context_line":"            CONF.cell_worker_thread_pool_size"},{"line_number":1197,"context_line":"            if concurrency_mode_threading() else 1000"},{"line_number":1198,"context_line":"            )"},{"line_number":1199,"context_line":"        SCATTER_GATHER_EXECUTOR \u003d create_executor(max_workers)"},{"line_number":1200,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"45c28a93_162aeba2","line":1197,"range":{"start_line":1197,"start_character":49,"end_line":1197,"end_character":53},"in_reply_to":"3176cc99_9795e552","updated":"2025-08-26 16:17:55.000000000","message":"This is a common greenthread limit AFAIK (see gibi\u0027s comment above)","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7ccc6e974aebfe8d6277415ad95b6adafaa29a82","unresolved":true,"context_lines":[{"line_number":1194,"context_line":"    if not SCATTER_GATHER_EXECUTOR:"},{"line_number":1195,"context_line":"        max_workers \u003d ("},{"line_number":1196,"context_line":"            CONF.cell_worker_thread_pool_size"},{"line_number":1197,"context_line":"            if concurrency_mode_threading() else 1000"},{"line_number":1198,"context_line":"            )"},{"line_number":1199,"context_line":"        SCATTER_GATHER_EXECUTOR \u003d create_executor(max_workers)"},{"line_number":1200,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"c0b0d763_3dcd337f","line":1197,"range":{"start_line":1197,"start_character":49,"end_line":1197,"end_character":53},"in_reply_to":"3176cc99_9795e552","updated":"2025-08-26 16:15:44.000000000","message":"because it was hardcode before as well. It was hardcoded in the default arg of GreenThreadPoolExecutor https://github.com/openstack/futurist/blob/9ea9a0080f07bcb856c0ed923a509f649833ca49/futurist/_futures.py#L549C24-L549C35","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"626dd33d1d8ebb2401132abaf35ccec141b7360a","unresolved":true,"context_lines":[{"line_number":1194,"context_line":"    if not SCATTER_GATHER_EXECUTOR:"},{"line_number":1195,"context_line":"        max_workers \u003d ("},{"line_number":1196,"context_line":"            CONF.cell_worker_thread_pool_size"},{"line_number":1197,"context_line":"            if concurrency_mode_threading() else 1000"},{"line_number":1198,"context_line":"            )"},{"line_number":1199,"context_line":"        SCATTER_GATHER_EXECUTOR \u003d create_executor(max_workers)"},{"line_number":1200,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"c1e49873_c0daab34","line":1197,"range":{"start_line":1197,"start_character":49,"end_line":1197,"end_character":53},"in_reply_to":"b820be80_5f681505","updated":"2025-08-26 19:46:25.000000000","message":"i agree that this shoudl be fine give we have never needed to change this in the past or expose it as a configuration option to operators.","commit_id":"e49978f75c115cf1b9c73956180f80631c4b5592"}]}
