)]}'
{"nova/utils.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"eab48c9246ed20afb684f36d2c9225a988717c26","unresolved":true,"context_lines":[{"line_number":1441,"context_line":""},{"line_number":1442,"context_line":"class DelayingExecutor("},{"line_number":1443,"context_line":"    futurist.DelayedExecutorMixin,"},{"line_number":1444,"context_line":"    futurist.ThreadPoolExecutor,"},{"line_number":1445,"context_line":"):"},{"line_number":1446,"context_line":"    \"\"\"Thread-pool executor that supports per-task delayed submission."},{"line_number":1447,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"8857ff8e_c2492ec8","line":1444,"updated":"2026-07-31 08:40:55.000000000","message":"I think we should use a GreenThreadPoolExecutor in an eventlet environment insted of a native ThreadPool","commit_id":"f5a8a007ade701365659696b499f415bad9c0607"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"238fe67b0d124803cbdc5d831938183c566a37aa","unresolved":false,"context_lines":[{"line_number":1441,"context_line":""},{"line_number":1442,"context_line":"class DelayingExecutor("},{"line_number":1443,"context_line":"    futurist.DelayedExecutorMixin,"},{"line_number":1444,"context_line":"    futurist.ThreadPoolExecutor,"},{"line_number":1445,"context_line":"):"},{"line_number":1446,"context_line":"    \"\"\"Thread-pool executor that supports per-task delayed submission."},{"line_number":1447,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"d756cee9_c73b5613","line":1444,"in_reply_to":"8857ff8e_c2492ec8","updated":"2026-08-06 09:22:26.000000000","message":"NA","commit_id":"f5a8a007ade701365659696b499f415bad9c0607"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"f5c98f9418892c64876cbdae19d1cd9aaa08a18d","unresolved":false,"context_lines":[{"line_number":1469,"context_line":"    \"\"\""},{"line_number":1470,"context_line":""},{"line_number":1471,"context_line":"DelayingExecutor: ty.TypeAlias \u003d _GreenDelayingExecutor | _ThreadDelayingExecutor"},{"line_number":1472,"context_line":""},{"line_number":1473,"context_line":""},{"line_number":1474,"context_line":"def create_delaying_executor(max_workers: int, **kwargs) -\u003e DelayingExecutor:"},{"line_number":1475,"context_line":"    \"\"\"Create a delaying executor for the current concurrency mode."}],"source_content_type":"text/x-python","patch_set":4,"id":"1936f6a1_3924d97c","line":1472,"updated":"2026-08-04 11:22:29.000000000","message":"pep8: E501 line too long (81 \u003e 79 characters)","commit_id":"8bec3296a46c687496fb6bbd46053b6a44bf17bb"}],"nova/virt/libvirt/host.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c9c911158150c8aa7d799e16a1db1c730e7bb1ac","unresolved":false,"context_lines":[{"line_number":524,"context_line":"            event.transition \u003d\u003d virtevent.EVENT_LIFECYCLE_STOPPED):"},{"line_number":525,"context_line":"            # Delay STOPPED event, as they may be followed by a STARTED"},{"line_number":526,"context_line":"            # event in case the instance is rebooting"},{"line_number":527,"context_line":"            future \u003d self._delayed_executor.submit_after("},{"line_number":528,"context_line":"                15, self._event_emit, event)"},{"line_number":529,"context_line":"            self._events_delayed[event.uuid] \u003d future"},{"line_number":530,"context_line":"            # add callback to cleanup self._events_delayed dict after"}],"source_content_type":"text/x-python","patch_set":2,"id":"4205c22a_2abc5f49","line":527,"updated":"2026-07-16 16:13:13.000000000","message":"pep8: error: Item \"None\" of \"Any | None\" has no attribute \"submit_after\"  [union-attr]","commit_id":"2ded7c35a2f99e40d4b9233ca253016d50d50114"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"eab48c9246ed20afb684f36d2c9225a988717c26","unresolved":true,"context_lines":[{"line_number":543,"context_line":"        \"\"\""},{"line_number":544,"context_line":"        self._delayed_executor \u003d ("},{"line_number":545,"context_line":"            utils.StaticallyDelayingCancellableTaskExecutorWrapper("},{"line_number":546,"context_line":"                delay\u003d15, executor\u003dutils._get_default_executor()))"},{"line_number":547,"context_line":"        self._event_handler.start()"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        # This thread is just for async connection closed event handling."}],"source_content_type":"text/x-python","patch_set":3,"id":"a2087373_06b57a86","side":"PARENT","line":546,"updated":"2026-07-31 08:40:55.000000000","message":"This combines a GreenThreadPool or a native ThreadPool with the delaying mechanism based on what concurrency mode we are running in.\nBut the new code uses utils.DelayingExecutor that hardcodes the native ThreadPool. So I\u0027m not sure this change will work well in an eventlet environment.","commit_id":"1c85163992293df8ed041e7d986f68a7f95fdc21"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"65673a4ed9a988e3adc0c8c24abd3b5ae47b5a49","unresolved":false,"context_lines":[{"line_number":543,"context_line":"        \"\"\""},{"line_number":544,"context_line":"        self._delayed_executor \u003d ("},{"line_number":545,"context_line":"            utils.StaticallyDelayingCancellableTaskExecutorWrapper("},{"line_number":546,"context_line":"                delay\u003d15, executor\u003dutils._get_default_executor()))"},{"line_number":547,"context_line":"        self._event_handler.start()"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        # This thread is just for async connection closed event handling."}],"source_content_type":"text/x-python","patch_set":3,"id":"f2f1ae7a_7780b1c3","side":"PARENT","line":546,"in_reply_to":"a2087373_06b57a86","updated":"2026-08-14 10:33:38.000000000","message":"Done","commit_id":"1c85163992293df8ed041e7d986f68a7f95fdc21"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"238fe67b0d124803cbdc5d831938183c566a37aa","unresolved":true,"context_lines":[{"line_number":544,"context_line":"    def _init_events(self):"},{"line_number":545,"context_line":"        \"\"\"Initializes the libvirt events subsystem."},{"line_number":546,"context_line":"        \"\"\""},{"line_number":547,"context_line":"        self._delayed_executor \u003d utils.create_delaying_executor(max_workers\u003d1)"},{"line_number":548,"context_line":"        self._event_handler.start()"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"        # This thread is just for async connection closed event handling."}],"source_content_type":"text/x-python","patch_set":4,"id":"b5ac76c3_126dfd0a","line":547,"updated":"2026-08-06 09:22:26.000000000","message":"this is now functionally different from the baseline. In the baseline we wrapped the default_executor to get the delay functionality. As far as I see this creates a separate executor and not re-using the default one.","commit_id":"8bec3296a46c687496fb6bbd46053b6a44bf17bb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b62a1799e12aefbd5ae0258783bda11f798513d6","unresolved":true,"context_lines":[{"line_number":544,"context_line":"    def _init_events(self):"},{"line_number":545,"context_line":"        \"\"\"Initializes the libvirt events subsystem."},{"line_number":546,"context_line":"        \"\"\""},{"line_number":547,"context_line":"        self._delayed_executor \u003d utils.create_delaying_executor(max_workers\u003d1)"},{"line_number":548,"context_line":"        self._event_handler.start()"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"        # This thread is just for async connection closed event handling."}],"source_content_type":"text/x-python","patch_set":4,"id":"f2e47414_276199e2","line":547,"in_reply_to":"b5ac76c3_126dfd0a","updated":"2026-08-12 13:16:04.000000000","message":"also the max_worker\u003d1 will give us a pretty different behavior of event handling on a compute with multiple VMs.","commit_id":"8bec3296a46c687496fb6bbd46053b6a44bf17bb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"93d2ed38ca1f9cc30753bf62d65b1655e7fcd155","unresolved":true,"context_lines":[{"line_number":544,"context_line":"    def _init_events(self):"},{"line_number":545,"context_line":"        \"\"\"Initializes the libvirt events subsystem."},{"line_number":546,"context_line":"        \"\"\""},{"line_number":547,"context_line":"        self._delayed_executor \u003d utils._get_default_executor()"},{"line_number":548,"context_line":"        self._event_handler.start()"},{"line_number":549,"context_line":""},{"line_number":550,"context_line":"        # This thread is just for async connection closed event handling."}],"source_content_type":"text/x-python","patch_set":6,"id":"85d63a13_f0c8a658","line":547,"updated":"2026-08-17 14:23:23.000000000","message":"Ok so we moved the wrapping to utils.py . This slightly changes the logic. Now every user of the default_executor can use submit_after(). The big difference is that in the new wrapper the delay is not static for every submit() call but dynamic an only applied to submit_after() calls. The submit calls are unaffected. So even if we expose the wrapped executor to all users of the default_executor they can still use it as normal without delay.\n\nHowever there is a downside of this move. The wrapper has an overhead, an extra scheduler thread running. so those processes that never use a default_executor with submit_after get the extra thread overhead unnecessarily.\n\nI would be happier if we only do the wrapping for the event handler usage of the executor where we know that the overhead is warranted as we need the submit_after capability.","commit_id":"698f541fca6fdc13f4d1429a0bff1046b18d4bc9"}]}
