)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aeedfa0f88b805dd00e5e3d43344c223e5782343","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"134b3f91_5a26c63b","updated":"2026-07-17 09:31:51.000000000","message":"I have a couple of things inline. Thanks for picking up this work from me.","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"d8393d68_0a9730d6","updated":"2026-07-24 17:55:13.000000000","message":"overall logic looks good to me now. We have some missing test coverage that worth to fix before we land this.\n\nAlso we discussed that some things only work with spawn multiprocessing context. That needs to be documented.","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"e90105dfc5671c7d2ea707a2a2d54efdecfa250e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"087e8c2d_ab1d6d41","in_reply_to":"d8393d68_0a9730d6","updated":"2026-07-29 08:07:23.000000000","message":"Done","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0f4d4964a06f3b95ad20ce4c89d0069af1454b65","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"99ea5bd3_3515d939","updated":"2026-07-31 03:56:02.000000000","message":"overall lgtm, question/concern over extending the greenthread executor capabilities/support.\n\nAlso, please add release notes and doc update for this new executor in\n\n- https://github.com/openstack/futurist/blob/master/doc/source/reference/index.rst\n- https://github.com/openstack/futurist/blob/master/doc/source/user/features.rst\n- https://github.com/openstack/futurist/blob/master/doc/source/user/examples.rst","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"217e32335daf6c236bec3d670fa0660ef8040073","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"581ba3fd_a56adaf7","in_reply_to":"99ea5bd3_3515d939","updated":"2026-08-03 15:13:00.000000000","message":"done","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"464b0bd9b7c468a5c36c61d193674f0007c4766e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":13,"id":"821c7df4_d378cb10","updated":"2026-08-05 01:44:22.000000000","message":"this almost lgtm, 1 minor doc comment and can you please add the release notes also","commit_id":"bc79ff2ee3c133cfba46159784e5a4f70e989828"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"603c6da6c7d35a704752cc0ef86b4ebe8c6fff8d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"66944fef_7dec6b35","updated":"2026-08-06 09:16:44.000000000","message":"I\u0027m OK with this","commit_id":"350e39d788a04fdbd38529564a0f44f3e395f80f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"c815772e3d5538ad765b192b607f55e67369cbe4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"5c88d89c_32623d40","updated":"2026-08-06 18:32:47.000000000","message":"this is in good shape and happy with this version. Thanks Kamil for the work.","commit_id":"350e39d788a04fdbd38529564a0f44f3e395f80f"}],"doc/source/reference/index.rst":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"464b0bd9b7c468a5c36c61d193674f0007c4766e","unresolved":true,"context_lines":[{"line_number":26,"context_line":"    :members:"},{"line_number":27,"context_line":"    :special-members: __init__"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"-----------------"},{"line_number":30,"context_line":"Delayed Executors"},{"line_number":31,"context_line":"-----------------"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":".. autoclass:: futurist.DelayedExecutorMixinBase"},{"line_number":34,"context_line":"    :members:"}],"source_content_type":"text/x-rst","patch_set":13,"id":"272ca1d2_d41ee233","line":31,"range":{"start_line":29,"start_character":0,"end_line":31,"end_character":17},"updated":"2026-08-05 01:44:22.000000000","message":"I will put this under \u0027Executors\u0027 heading only as a subheading maybe?","commit_id":"bc79ff2ee3c133cfba46159784e5a4f70e989828"}],"futurist/_futures.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf7d076cbd1c4549e18513f52df5b7aa5f5c478c","unresolved":true,"context_lines":[{"line_number":715,"context_line":"        })"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"class DelayedExecutorMixinBase(_futures.Executor):"},{"line_number":719,"context_line":""},{"line_number":720,"context_line":"    class Task:"},{"line_number":721,"context_line":"        def __init__(self, fn, args, kwargs, future: Future, delay: float):"}],"source_content_type":"text/x-python","patch_set":1,"id":"53b36e41_111fb558","line":718,"updated":"2026-02-03 13:45:06.000000000","message":"Add proper doc","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"e9d2549e61d78c1ef556b82b715ceb3ad9453a9c","unresolved":false,"context_lines":[{"line_number":715,"context_line":"        })"},{"line_number":716,"context_line":""},{"line_number":717,"context_line":""},{"line_number":718,"context_line":"class DelayedExecutorMixinBase(_futures.Executor):"},{"line_number":719,"context_line":""},{"line_number":720,"context_line":"    class Task:"},{"line_number":721,"context_line":"        def __init__(self, fn, args, kwargs, future: Future, delay: float):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ad6924da_2413548f","line":718,"in_reply_to":"53b36e41_111fb558","updated":"2026-07-16 15:12:17.000000000","message":"Done","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf7d076cbd1c4549e18513f52df5b7aa5f5c478c","unresolved":true,"context_lines":[{"line_number":748,"context_line":"        heapq.heapify(self._queue)"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"        self._sentinel \u003d self.Task("},{"line_number":751,"context_line":"            lambda: None, (), {}, None, sys.float_info.max)"},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        self._shutdown_requested \u003d False"},{"line_number":754,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"e560c1fa_010d9ecc","line":751,"updated":"2026-02-03 13:45:06.000000000","message":"sys.float_int.max is probably unsafe here as we will add time.monotic() to it when the Task is created. It would be better to create a Task derivative like SentinelTask or LastTask that overrides `__lt__` so that LastTask is always having the furthest deadline.","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"e9d2549e61d78c1ef556b82b715ceb3ad9453a9c","unresolved":false,"context_lines":[{"line_number":748,"context_line":"        heapq.heapify(self._queue)"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"        self._sentinel \u003d self.Task("},{"line_number":751,"context_line":"            lambda: None, (), {}, None, sys.float_info.max)"},{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        self._shutdown_requested \u003d False"},{"line_number":754,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"b1bf714d_7b546cdd","line":751,"in_reply_to":"e560c1fa_010d9ecc","updated":"2026-07-16 15:12:17.000000000","message":"Done","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf7d076cbd1c4549e18513f52df5b7aa5f5c478c","unresolved":true,"context_lines":[{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        self._shutdown_requested \u003d False"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"        self._scheduler \u003d self._start_thread(self._schedule)"},{"line_number":756,"context_line":""},{"line_number":757,"context_line":"    def _log(self, msg, *args):"},{"line_number":758,"context_line":"        print(msg % args)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f47e872_3482658f","line":755,"updated":"2026-02-03 13:45:06.000000000","message":"Making the thread daemon might be needed...","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"e9d2549e61d78c1ef556b82b715ceb3ad9453a9c","unresolved":false,"context_lines":[{"line_number":752,"context_line":""},{"line_number":753,"context_line":"        self._shutdown_requested \u003d False"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"        self._scheduler \u003d self._start_thread(self._schedule)"},{"line_number":756,"context_line":""},{"line_number":757,"context_line":"    def _log(self, msg, *args):"},{"line_number":758,"context_line":"        print(msg % args)"}],"source_content_type":"text/x-python","patch_set":1,"id":"b5306b41_aeaeacd1","line":755,"in_reply_to":"1f47e872_3482658f","updated":"2026-07-16 15:12:17.000000000","message":"Done","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf7d076cbd1c4549e18513f52df5b7aa5f5c478c","unresolved":true,"context_lines":[{"line_number":755,"context_line":"        self._scheduler \u003d self._start_thread(self._schedule)"},{"line_number":756,"context_line":""},{"line_number":757,"context_line":"    def _log(self, msg, *args):"},{"line_number":758,"context_line":"        print(msg % args)"},{"line_number":759,"context_line":"        LOG.debug(msg, *args)"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"    def _task_wrapper(self, task):"}],"source_content_type":"text/x-python","patch_set":1,"id":"6fc75b2a_4af86cab","line":758,"updated":"2026-02-03 13:45:06.000000000","message":"drop this","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"e9d2549e61d78c1ef556b82b715ceb3ad9453a9c","unresolved":false,"context_lines":[{"line_number":755,"context_line":"        self._scheduler \u003d self._start_thread(self._schedule)"},{"line_number":756,"context_line":""},{"line_number":757,"context_line":"    def _log(self, msg, *args):"},{"line_number":758,"context_line":"        print(msg % args)"},{"line_number":759,"context_line":"        LOG.debug(msg, *args)"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"    def _task_wrapper(self, task):"}],"source_content_type":"text/x-python","patch_set":1,"id":"e18604ba_fa67eadc","line":758,"in_reply_to":"6fc75b2a_4af86cab","updated":"2026-07-16 15:12:17.000000000","message":"Done","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf7d076cbd1c4549e18513f52df5b7aa5f5c478c","unresolved":true,"context_lines":[{"line_number":756,"context_line":""},{"line_number":757,"context_line":"    def _log(self, msg, *args):"},{"line_number":758,"context_line":"        print(msg % args)"},{"line_number":759,"context_line":"        LOG.debug(msg, *args)"},{"line_number":760,"context_line":""},{"line_number":761,"context_line":"    def _task_wrapper(self, task):"},{"line_number":762,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"c6d2aa47_c7697613","line":759,"updated":"2026-02-03 13:45:06.000000000","message":"I\u0027m not sure how futurist handles logging. Are we OK to log extensively in this class?","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf7d076cbd1c4549e18513f52df5b7aa5f5c478c","unresolved":true,"context_lines":[{"line_number":847,"context_line":"            return task.future"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":850,"context_line":"        pass"},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"        \"\"\"Shutdown the executor\"\"\""},{"line_number":853,"context_line":"        self._log(\"Shutdown requested\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"776653d5_151da79d","line":850,"updated":"2026-02-03 13:45:06.000000000","message":"drop it\n(obviously we are missing a lot of test coverage as noted in the commit message)","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"e9d2549e61d78c1ef556b82b715ceb3ad9453a9c","unresolved":false,"context_lines":[{"line_number":847,"context_line":"            return task.future"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":850,"context_line":"        pass"},{"line_number":851,"context_line":""},{"line_number":852,"context_line":"        \"\"\"Shutdown the executor\"\"\""},{"line_number":853,"context_line":"        self._log(\"Shutdown requested\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f9d0b19_a1e5ff97","line":850,"in_reply_to":"776653d5_151da79d","updated":"2026-07-16 15:12:17.000000000","message":"Done","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf7d076cbd1c4549e18513f52df5b7aa5f5c478c","unresolved":true,"context_lines":[{"line_number":881,"context_line":""},{"line_number":882,"context_line":"    @property"},{"line_number":883,"context_line":"    def alive(self) -\u003e bool:"},{"line_number":884,"context_line":"        return self._scheduler.is_alive() or super().alive"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ee54539b_966e06cb","line":884,"updated":"2026-02-03 13:45:06.000000000","message":"I\u0027m not sure if is_alive exists on GreenThread, we might need a compatibility method here","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"c79a24235a1241af0465593fb77cbbd6d66d5ce9","unresolved":false,"context_lines":[{"line_number":881,"context_line":""},{"line_number":882,"context_line":"    @property"},{"line_number":883,"context_line":"    def alive(self) -\u003e bool:"},{"line_number":884,"context_line":"        return self._scheduler.is_alive() or super().alive"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"b3b02a41_c6d145cc","line":884,"in_reply_to":"3b2fb67f_eb04e555","updated":"2026-07-17 13:42:36.000000000","message":"Done","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"e9d2549e61d78c1ef556b82b715ceb3ad9453a9c","unresolved":true,"context_lines":[{"line_number":881,"context_line":""},{"line_number":882,"context_line":"    @property"},{"line_number":883,"context_line":"    def alive(self) -\u003e bool:"},{"line_number":884,"context_line":"        return self._scheduler.is_alive() or super().alive"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3b2fb67f_eb04e555","line":884,"in_reply_to":"ee54539b_966e06cb","updated":"2026-07-16 15:12:17.000000000","message":"yes, it exist","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"cf7d076cbd1c4549e18513f52df5b7aa5f5c478c","unresolved":true,"context_lines":[{"line_number":884,"context_line":"        return self._scheduler.is_alive() or super().alive"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"},{"line_number":888,"context_line":"    @staticmethod"},{"line_number":889,"context_line":"    def _get_condition_object():"},{"line_number":890,"context_line":"        return _green.threading.condition_object()"}],"source_content_type":"text/x-python","patch_set":1,"id":"58129791_b2024f76","line":887,"updated":"2026-02-03 13:45:06.000000000","message":"This extra layer is only needed as futurist wants to support using eventlet primitives without monkey_patching. So we need to replace all std lib primitives with eventlet based variants to make the mixin work with eventlet outside of a monkey patched env.","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"464b0bd9b7c468a5c36c61d193674f0007c4766e","unresolved":false,"context_lines":[{"line_number":884,"context_line":"        return self._scheduler.is_alive() or super().alive"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"},{"line_number":888,"context_line":"    @staticmethod"},{"line_number":889,"context_line":"    def _get_condition_object():"},{"line_number":890,"context_line":"        return _green.threading.condition_object()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bc7e769a_17d3b323","line":887,"in_reply_to":"25d88d18_65cfc3d6","updated":"2026-08-05 01:44:22.000000000","message":"I see the usage in nova https://review.opendev.org/c/openstack/nova/+/997410 and agree to keep eventlet things here instead of Nova or any other users implemet two different things to handle eventlet.\n\nI am ok and it can go away when eventlet is removed.","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0f4d4964a06f3b95ad20ce4c89d0069af1454b65","unresolved":true,"context_lines":[{"line_number":884,"context_line":"        return self._scheduler.is_alive() or super().alive"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"},{"line_number":888,"context_line":"    @staticmethod"},{"line_number":889,"context_line":"    def _get_condition_object():"},{"line_number":890,"context_line":"        return _green.threading.condition_object()"}],"source_content_type":"text/x-python","patch_set":1,"id":"e88b72ba_7da8629a","line":887,"in_reply_to":"58129791_b2024f76","updated":"2026-07-31 03:56:02.000000000","message":"but do we need to provide its support as GreenThreadPoolExecutor will be going away soon once we remove the eventlet, I mean there will not be any use case of it. If we do not implement it then DelayedExecutor implementation can be easy just to inherit from ThreadPoolExecutor with submit_after capabilities.","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"217e32335daf6c236bec3d670fa0660ef8040073","unresolved":true,"context_lines":[{"line_number":884,"context_line":"        return self._scheduler.is_alive() or super().alive"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"},{"line_number":888,"context_line":"    @staticmethod"},{"line_number":889,"context_line":"    def _get_condition_object():"},{"line_number":890,"context_line":"        return _green.threading.condition_object()"}],"source_content_type":"text/x-python","patch_set":1,"id":"25d88d18_65cfc3d6","line":887,"in_reply_to":"6109cce4_b9a57fef","updated":"2026-08-03 15:13:00.000000000","message":"The design here already provides the single interface gibi describes: submit_after is defined once in DelayedExecutorMixinBase and never overridden, so both variants expose an identical api to callers. GreenDelayedExecutorMixin itself is 50 lines implementing five small factory methods,the scheduler logic is not duplicated at all. As long as GreenThreadPoolExecutor remains in futurist (even in deprecated state), it is consistent to allow submit_after with it; the two can be retired together in the same patch once eventlet upport is fully dropped.","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"603c6da6c7d35a704752cc0ef86b4ebe8c6fff8d","unresolved":false,"context_lines":[{"line_number":884,"context_line":"        return self._scheduler.is_alive() or super().alive"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"},{"line_number":888,"context_line":"    @staticmethod"},{"line_number":889,"context_line":"    def _get_condition_object():"},{"line_number":890,"context_line":"        return _green.threading.condition_object()"}],"source_content_type":"text/x-python","patch_set":1,"id":"dd2ab6d7_2fad155b","line":887,"in_reply_to":"bc7e769a_17d3b323","updated":"2026-08-06 09:16:44.000000000","message":"I\u0027m OK with the direction. Just a clarification on my part. The current solution has a single submit_after interface, yes. What I hinted at is if that interface is implemented in GreenDelayedExecutorMixin as just a forwarding to GreenThreadPool\u0027s submit_after instead of using the scheduler thread. That would be a different, small implementation with the same interface. We don\u0027t have to do it, I just said it might be possible.","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b6421a1491429d79df1bf9442752c3a9aadc33e0","unresolved":true,"context_lines":[{"line_number":884,"context_line":"        return self._scheduler.is_alive() or super().alive"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"},{"line_number":888,"context_line":"    @staticmethod"},{"line_number":889,"context_line":"    def _get_condition_object():"},{"line_number":890,"context_line":"        return _green.threading.condition_object()"}],"source_content_type":"text/x-python","patch_set":1,"id":"6109cce4_b9a57fef","line":887,"in_reply_to":"e88b72ba_7da8629a","updated":"2026-07-31 08:44:39.000000000","message":"\u003e This extra layer is only needed as futurist wants to support using eventlet primitives without monkey_patching.\n\nThis is a design goal of futurist at the moment. Also nova uses futurist to avoid caring about the differences between eventlet and native threading.\n\nSo if we don\u0027t want to build two different solution in nova one for the eventlet case and one for the threading case then we need futurist to support both cases. \n\n\u003e If we do not implement it then DelayedExecutor implementation can be easy just to inherit from ThreadPoolExecutor with submit_after capabilities.\n\nWe can try to see how would it look like if the futurist gives the submit_after interface as a single interface but implements it in two different ways, and the eventlet implementation simply uses submit_after in the GreenThreadPoolExecutor. If this is doable with a single consistent interface, so nova does not need to care which implementation it uses, then I\u0027m OK having two significantly different implementation in futurist for that interface.","commit_id":"e2c94d56d35b9edc938c3b00f20bc048bef45d78"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":843,"context_line":"        ``sys.float_info.max`` inside :class:`Task.__init__`."},{"line_number":844,"context_line":"        \"\"\""},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"        def __lt__(self, other):"},{"line_number":847,"context_line":"            # The sentinel is never before any other task."},{"line_number":848,"context_line":"            return False"},{"line_number":849,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"2df96dd6_683e33e0","line":846,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":847,"context_line":"            # The sentinel is never before any other task."},{"line_number":848,"context_line":"            return False"},{"line_number":849,"context_line":""},{"line_number":850,"context_line":"        def __repr__(self):"},{"line_number":851,"context_line":"            return \"SentinelTask\""},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"    class Task:"}],"source_content_type":"text/x-python","patch_set":2,"id":"d4c422f4_688a23fc","line":850,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":851,"context_line":"            return \"SentinelTask\""},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"    class Task:"},{"line_number":854,"context_line":"        def __init__(self, fn, args, kwargs, future: Future, delay: float):"},{"line_number":855,"context_line":"            self.fn \u003d fn"},{"line_number":856,"context_line":"            self.args \u003d args"},{"line_number":857,"context_line":"            self.kwargs \u003d kwargs"}],"source_content_type":"text/x-python","patch_set":2,"id":"168184fa_1c29f7d3","line":854,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation for one or more parameters  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":851,"context_line":"            return \"SentinelTask\""},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"    class Task:"},{"line_number":854,"context_line":"        def __init__(self, fn, args, kwargs, future: Future, delay: float):"},{"line_number":855,"context_line":"            self.fn \u003d fn"},{"line_number":856,"context_line":"            self.args \u003d args"},{"line_number":857,"context_line":"            self.kwargs \u003d kwargs"}],"source_content_type":"text/x-python","patch_set":2,"id":"5d726a7a_1789b24d","line":854,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Missing type arguments for generic type \"Future\"  [type-arg]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":859,"context_line":"            self.deadline \u003d time.monotonic() + delay"},{"line_number":860,"context_line":""},{"line_number":861,"context_line":"        @property"},{"line_number":862,"context_line":"        def _remaining_delay(self):"},{"line_number":863,"context_line":"            return self.deadline - time.monotonic()"},{"line_number":864,"context_line":""},{"line_number":865,"context_line":"        def __repr__(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"b77a52b6_91fe39fb","line":862,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":862,"context_line":"        def _remaining_delay(self):"},{"line_number":863,"context_line":"            return self.deadline - time.monotonic()"},{"line_number":864,"context_line":""},{"line_number":865,"context_line":"        def __repr__(self):"},{"line_number":866,"context_line":"            return ("},{"line_number":867,"context_line":"                f\"Task\u003d{self.fn}, \""},{"line_number":868,"context_line":"                f\"remaining_delay\u003d{self._remaining_delay}, \""}],"source_content_type":"text/x-python","patch_set":2,"id":"b48c1e04_9ca3f129","line":865,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":869,"context_line":"                f\"future\u003d{self.future}\""},{"line_number":870,"context_line":"            )"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        def __lt__(self, other):"},{"line_number":873,"context_line":"            if isinstance(other, DelayedExecutorMixinBase._SentinelTask):"},{"line_number":874,"context_line":"                # Regular tasks always sort before the sentinel."},{"line_number":875,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":2,"id":"37fa62d1_d7a2be32","line":872,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":877,"context_line":"                return NotImplemented"},{"line_number":878,"context_line":"            return self.deadline \u003c other.deadline"},{"line_number":879,"context_line":""},{"line_number":880,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":881,"context_line":"        super().__init__(*args, **kwargs)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"        self._queue_changed \u003d self._get_condition_object()"}],"source_content_type":"text/x-python","patch_set":2,"id":"eac86d5c_e8f07c22","line":880,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":880,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":881,"context_line":"        super().__init__(*args, **kwargs)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"        self._queue_changed \u003d self._get_condition_object()"},{"line_number":884,"context_line":"        self._queue: list[DelayedExecutorMixinBase.Task] \u003d []"},{"line_number":885,"context_line":"        heapq.heapify(self._queue)"},{"line_number":886,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"289958da_18667330","line":883,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_get_condition_object\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":888,"context_line":""},{"line_number":889,"context_line":"        self._shutdown_requested \u003d False"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"        self._scheduler \u003d self._start_thread(self._schedule)"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"    def _log(self, msg, *args):"},{"line_number":894,"context_line":"        LOG.debug(msg, *args)"}],"source_content_type":"text/x-python","patch_set":2,"id":"76336f24_7ca1890d","line":891,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_start_thread\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":890,"context_line":""},{"line_number":891,"context_line":"        self._scheduler \u003d self._start_thread(self._schedule)"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"    def _log(self, msg, *args):"},{"line_number":894,"context_line":"        LOG.debug(msg, *args)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"    def _task_wrapper(self, task):"}],"source_content_type":"text/x-python","patch_set":2,"id":"170ee06e_3ecc1b32","line":893,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":893,"context_line":"    def _log(self, msg, *args):"},{"line_number":894,"context_line":"        LOG.debug(msg, *args)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"    def _task_wrapper(self, task):"},{"line_number":897,"context_line":"        try:"},{"line_number":898,"context_line":"            task.future.set_result(task.fn(*task.args, **task.kwargs))"},{"line_number":899,"context_line":"        except BaseException as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ac2bc4bc_d32a9e16","line":896,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":899,"context_line":"        except BaseException as e:"},{"line_number":900,"context_line":"            task.future.set_exception(e)"},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"    def _schedule(self):"},{"line_number":903,"context_line":"        while True:"},{"line_number":904,"context_line":"            with self._queue_changed:"},{"line_number":905,"context_line":"                self._log(\"Waiting for task\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"d920578e_83a20847","line":902,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":902,"context_line":"    def _schedule(self):"},{"line_number":903,"context_line":"        while True:"},{"line_number":904,"context_line":"            with self._queue_changed:"},{"line_number":905,"context_line":"                self._log(\"Waiting for task\")"},{"line_number":906,"context_line":"                self._queue_changed.wait_for(lambda: len(self._queue))"},{"line_number":907,"context_line":"                task: DelayedExecutorMixinBase.Task \u003d heapq.heappop("},{"line_number":908,"context_line":"                    self._queue"}],"source_content_type":"text/x-python","patch_set":2,"id":"81c60c0a_88626955","line":905,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":907,"context_line":"                task: DelayedExecutorMixinBase.Task \u003d heapq.heappop("},{"line_number":908,"context_line":"                    self._queue"},{"line_number":909,"context_line":"                )"},{"line_number":910,"context_line":"                self._log(\"%s received\", task)"},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"                if isinstance(task, self._SentinelTask):"},{"line_number":913,"context_line":"                    # We are being shutdown.  As the sentinel always sorts"}],"source_content_type":"text/x-python","patch_set":2,"id":"865c9e74_ed344d7c","line":910,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":913,"context_line":"                    # We are being shutdown.  As the sentinel always sorts"},{"line_number":914,"context_line":"                    # after every real task we know all pending work has been"},{"line_number":915,"context_line":"                    # drained, so it is safe to shut down the inner executor."},{"line_number":916,"context_line":"                    self._log("},{"line_number":917,"context_line":"                        \"Sentinel task received, calling shutdown on %s\","},{"line_number":918,"context_line":"                        super().shutdown,"},{"line_number":919,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":2,"id":"473129a0_56f46fe5","line":916,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":923,"context_line":"                # task is now the one with the closest deadline"},{"line_number":924,"context_line":"                if task.future.cancelled():"},{"line_number":925,"context_line":"                    # task is cancelled, just start over"},{"line_number":926,"context_line":"                    self._log(\"%s was cancelled while in the queue\", task)"},{"line_number":927,"context_line":"                    continue"},{"line_number":928,"context_line":""},{"line_number":929,"context_line":"                # wait for the deadline or an outside trigger"}],"source_content_type":"text/x-python","patch_set":2,"id":"46b02339_aa5866bf","line":926,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":927,"context_line":"                    continue"},{"line_number":928,"context_line":""},{"line_number":929,"context_line":"                # wait for the deadline or an outside trigger"},{"line_number":930,"context_line":"                self._log(\"Waiting for the deadline of %s\", task)"},{"line_number":931,"context_line":"                changed \u003d self._queue_changed.wait(task._remaining_delay)"},{"line_number":932,"context_line":"                self._log("},{"line_number":933,"context_line":"                    \"Awaken while waiting on %s, queue changed\u003d%s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"e6cd215f_f2f7de92","line":930,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":929,"context_line":"                # wait for the deadline or an outside trigger"},{"line_number":930,"context_line":"                self._log(\"Waiting for the deadline of %s\", task)"},{"line_number":931,"context_line":"                changed \u003d self._queue_changed.wait(task._remaining_delay)"},{"line_number":932,"context_line":"                self._log("},{"line_number":933,"context_line":"                    \"Awaken while waiting on %s, queue changed\u003d%s\","},{"line_number":934,"context_line":"                    task,"},{"line_number":935,"context_line":"                    changed,"}],"source_content_type":"text/x-python","patch_set":2,"id":"5af6b3b7_c39f870b","line":932,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":939,"context_line":"                    # Something changed before the deadline."},{"line_number":940,"context_line":"                    if task.future.cancelled():"},{"line_number":941,"context_line":"                        # nothing to do with this task just start over"},{"line_number":942,"context_line":"                        self._log(\"%s is cancelled, skipping\", task)"},{"line_number":943,"context_line":"                        continue"},{"line_number":944,"context_line":"                    else:"},{"line_number":945,"context_line":"                        # Reinsert the task to the queue and start over; this"}],"source_content_type":"text/x-python","patch_set":2,"id":"606e6f73_6f17743e","line":942,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":945,"context_line":"                        # Reinsert the task to the queue and start over; this"},{"line_number":946,"context_line":"                        # allows handling a newer task with a closer deadline."},{"line_number":947,"context_line":"                        heapq.heappush(self._queue, task)"},{"line_number":948,"context_line":"                        self._log(\"Queue changed, re-scheduling %s\", task)"},{"line_number":949,"context_line":"                        continue"},{"line_number":950,"context_line":"                else:"},{"line_number":951,"context_line":"                    # We hit the deadline of the task so if it is not"}],"source_content_type":"text/x-python","patch_set":2,"id":"7bedee04_7fca9a0b","line":948,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":953,"context_line":"                    run_it \u003d task.future.set_running_or_notify_cancel()"},{"line_number":954,"context_line":"                    if not run_it:"},{"line_number":955,"context_line":"                        # Task is cancelled just start over"},{"line_number":956,"context_line":"                        self._log(\"%s is cancelled, skipping\", task)"},{"line_number":957,"context_line":"                        continue"},{"line_number":958,"context_line":""},{"line_number":959,"context_line":"                    try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"4d8d915c_5f55f766","line":956,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":959,"context_line":"                    try:"},{"line_number":960,"context_line":"                        self.submit(self._task_wrapper, task)"},{"line_number":961,"context_line":"                    except BaseException as e:"},{"line_number":962,"context_line":"                        self._log(\"Failed to submit %s: %s\", task, e)"},{"line_number":963,"context_line":"                        task.future.set_exception(e)"},{"line_number":964,"context_line":"                        continue"},{"line_number":965,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9bdc9555_326d0544","line":962,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":963,"context_line":"                        task.future.set_exception(e)"},{"line_number":964,"context_line":"                        continue"},{"line_number":965,"context_line":""},{"line_number":966,"context_line":"                    self._log(\"Task submitted %s\", task)"},{"line_number":967,"context_line":""},{"line_number":968,"context_line":"        self._log(\"Scheduler thread finished\")"},{"line_number":969,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"ae8e374c_a1568f6a","line":966,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":965,"context_line":""},{"line_number":966,"context_line":"                    self._log(\"Task submitted %s\", task)"},{"line_number":967,"context_line":""},{"line_number":968,"context_line":"        self._log(\"Scheduler thread finished\")"},{"line_number":969,"context_line":""},{"line_number":970,"context_line":"    def submit_after("},{"line_number":971,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":2,"id":"236d7c3e_cf286621","line":968,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":973,"context_line":"        fn: ty.Callable[..., ty.Any],"},{"line_number":974,"context_line":"        *args: ty.Any,"},{"line_number":975,"context_line":"        **kwargs: ty.Any,"},{"line_number":976,"context_line":"    ) -\u003e Future:"},{"line_number":977,"context_line":"        \"\"\"Schedule *fn* to run after *delay* seconds."},{"line_number":978,"context_line":""},{"line_number":979,"context_line":"        :param delay: Number of seconds to wait before executing *fn*."}],"source_content_type":"text/x-python","patch_set":2,"id":"aca6b566_a9707489","line":976,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Missing type arguments for generic type \"Future\"  [type-arg]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":994,"context_line":"                )"},{"line_number":995,"context_line":""},{"line_number":996,"context_line":"            task \u003d self.Task("},{"line_number":997,"context_line":"                fn, args, kwargs, self._get_future_object(), delay"},{"line_number":998,"context_line":"            )"},{"line_number":999,"context_line":"            heapq.heappush(self._queue, task)"},{"line_number":1000,"context_line":"            self._queue_changed.notify_all()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f52dc79_1cadb5c2","line":997,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_get_future_object\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":998,"context_line":"            )"},{"line_number":999,"context_line":"            heapq.heappush(self._queue, task)"},{"line_number":1000,"context_line":"            self._queue_changed.notify_all()"},{"line_number":1001,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1002,"context_line":"            return task.future"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"e9a4bce5_f26645fc","line":1001,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1002,"context_line":"            return task.future"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1005,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1006,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1007,"context_line":"        with self._queue_changed:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5d16b5a8_78c228bf","line":1004,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Signature of \"shutdown\" incompatible with supertype \"concurrent.futures._base.Executor\"  [override]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1002,"context_line":"            return task.future"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1005,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1006,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1007,"context_line":"        with self._queue_changed:"}],"source_content_type":"text/x-python","patch_set":2,"id":"ee81fa57_a3591229","line":1004,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: note:          def shutdown(self, wait: bool \u003d ...) -\u003e None","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1002,"context_line":"            return task.future"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1005,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1006,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1007,"context_line":"        with self._queue_changed:"}],"source_content_type":"text/x-python","patch_set":2,"id":"bbe2577f_468878ee","line":1004,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: note:          def shutdown(self, wait: bool \u003d ..., *, cancel_futures: bool \u003d ...) -\u003e None","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1002,"context_line":"            return task.future"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1005,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1006,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1007,"context_line":"        with self._queue_changed:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ab85cad_d6c3d893","line":1004,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: note:      Subclass:","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1002,"context_line":"            return task.future"},{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1005,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1006,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1007,"context_line":"        with self._queue_changed:"}],"source_content_type":"text/x-python","patch_set":2,"id":"88c3cf87_40ab3b8f","line":1004,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: note:      Superclass:","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1003,"context_line":""},{"line_number":1004,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1005,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1006,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1007,"context_line":"        with self._queue_changed:"},{"line_number":1008,"context_line":"            if not self._shutdown_requested:"},{"line_number":1009,"context_line":"                # Ensure that our thread wakes at least one more time to allow"}],"source_content_type":"text/x-python","patch_set":2,"id":"c57f262e_ca2f6710","line":1006,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1009,"context_line":"                # Ensure that our thread wakes at least one more time to allow"},{"line_number":1010,"context_line":"                # it to exit by queuing up a sentinel task after the shutdown"},{"line_number":1011,"context_line":"                # condition is set. This task won\u0027t be executed."},{"line_number":1012,"context_line":"                heapq.heappush(self._queue, self._sentinel)"},{"line_number":1013,"context_line":"                # We only want to queue 1 sentinel even if multiple shutdown"},{"line_number":1014,"context_line":"                # calls happen."},{"line_number":1015,"context_line":"                self._shutdown_requested \u003d True"}],"source_content_type":"text/x-python","patch_set":2,"id":"883900e5_47db146e","line":1012,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Cannot infer value of type parameter \"_T\" of \"heappush\"  [misc]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1014,"context_line":"                # calls happen."},{"line_number":1015,"context_line":"                self._shutdown_requested \u003d True"},{"line_number":1016,"context_line":"                self._queue_changed.notify_all()"},{"line_number":1017,"context_line":"                self._log(\"Shutdown signalled to the scheduler thread\")"},{"line_number":1018,"context_line":""},{"line_number":1019,"context_line":"        # If wait is set we need to wait for our sentinel to be processed and"},{"line_number":1020,"context_line":"        # therefore our thread to exit."}],"source_content_type":"text/x-python","patch_set":2,"id":"cc19c19b_79bc6d9f","line":1017,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"        # If wait is set we need to wait for our sentinel to be processed and"},{"line_number":1020,"context_line":"        # therefore our thread to exit."},{"line_number":1021,"context_line":"        if wait:"},{"line_number":1022,"context_line":"            self._log(\"Waiting for the scheduler thread to finish\")"},{"line_number":1023,"context_line":"            self._join_thread(self._scheduler)"},{"line_number":1024,"context_line":"            # Then it is safe to shutdown the internal executor as well"},{"line_number":1025,"context_line":"            # as no new work will be submitted by us any more."}],"source_content_type":"text/x-python","patch_set":2,"id":"cd31e5ff_f248aad9","line":1022,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1020,"context_line":"        # therefore our thread to exit."},{"line_number":1021,"context_line":"        if wait:"},{"line_number":1022,"context_line":"            self._log(\"Waiting for the scheduler thread to finish\")"},{"line_number":1023,"context_line":"            self._join_thread(self._scheduler)"},{"line_number":1024,"context_line":"            # Then it is safe to shutdown the internal executor as well"},{"line_number":1025,"context_line":"            # as no new work will be submitted by us any more."},{"line_number":1026,"context_line":"            self._log(\"Waiting for the internal executor to finish\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"b96f3298_deb11d22","line":1023,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_join_thread\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"            self._join_thread(self._scheduler)"},{"line_number":1024,"context_line":"            # Then it is safe to shutdown the internal executor as well"},{"line_number":1025,"context_line":"            # as no new work will be submitted by us any more."},{"line_number":1026,"context_line":"            self._log(\"Waiting for the internal executor to finish\")"},{"line_number":1027,"context_line":"            super().shutdown(wait)"},{"line_number":1028,"context_line":"        else:"},{"line_number":1029,"context_line":"            # This is tricky: at this point there might be tasks we will"}],"source_content_type":"text/x-python","patch_set":2,"id":"fe45cc14_57c81131","line":1026,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"    @property"},{"line_number":1036,"context_line":"    def alive(self) -\u003e bool:"},{"line_number":1037,"context_line":"        \"\"\"Accessor to determine if the executor is alive/active.\"\"\""},{"line_number":1038,"context_line":"        return self._is_scheduler_alive() or super().alive"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def _get_condition_object(self):"},{"line_number":1041,"context_line":"        raise NotImplementedError"}],"source_content_type":"text/x-python","patch_set":2,"id":"e45ec08c_b5b41d88","line":1038,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: \"alive\" undefined in superclass  [misc]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1037,"context_line":"        \"\"\"Accessor to determine if the executor is alive/active.\"\"\""},{"line_number":1038,"context_line":"        return self._is_scheduler_alive() or super().alive"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def _get_condition_object(self):"},{"line_number":1041,"context_line":"        raise NotImplementedError"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    def _get_future_object(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"36a8d517_ba632faf","line":1040,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1037,"context_line":"        \"\"\"Accessor to determine if the executor is alive/active.\"\"\""},{"line_number":1038,"context_line":"        return self._is_scheduler_alive() or super().alive"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def _get_condition_object(self):"},{"line_number":1041,"context_line":"        raise NotImplementedError"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    def _get_future_object(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfe8e014_28c6f835","line":1040,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: note: Use \"-\u003e None\" if function does not return a value","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1040,"context_line":"    def _get_condition_object(self):"},{"line_number":1041,"context_line":"        raise NotImplementedError"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    def _get_future_object(self):"},{"line_number":1044,"context_line":"        raise NotImplementedError"},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"    def _start_thread(self, fn, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"e523a9db_c07e8635","line":1043,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1040,"context_line":"    def _get_condition_object(self):"},{"line_number":1041,"context_line":"        raise NotImplementedError"},{"line_number":1042,"context_line":""},{"line_number":1043,"context_line":"    def _get_future_object(self):"},{"line_number":1044,"context_line":"        raise NotImplementedError"},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"    def _start_thread(self, fn, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fe9d5905_6135e7d1","line":1043,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: note: Use \"-\u003e None\" if function does not return a value","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1043,"context_line":"    def _get_future_object(self):"},{"line_number":1044,"context_line":"        raise NotImplementedError"},{"line_number":1045,"context_line":""},{"line_number":1046,"context_line":"    def _start_thread(self, fn, *args, **kwargs):"},{"line_number":1047,"context_line":"        raise NotImplementedError"},{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":"    def _join_thread(self, t):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7fe31eee_a0a4167b","line":1046,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1046,"context_line":"    def _start_thread(self, fn, *args, **kwargs):"},{"line_number":1047,"context_line":"        raise NotImplementedError"},{"line_number":1048,"context_line":""},{"line_number":1049,"context_line":"    def _join_thread(self, t):"},{"line_number":1050,"context_line":"        raise NotImplementedError"},{"line_number":1051,"context_line":""},{"line_number":1052,"context_line":"    def _is_scheduler_alive(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":2,"id":"2027a39b_052a15b3","line":1049,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1078,"context_line":"    \"\"\""},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"    @staticmethod"},{"line_number":1081,"context_line":"    def _get_condition_object():"},{"line_number":1082,"context_line":"        return _green.threading.condition_object()"},{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"79f3ddac_7a29a956","line":1081,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"    @staticmethod"},{"line_number":1081,"context_line":"    def _get_condition_object():"},{"line_number":1082,"context_line":"        return _green.threading.condition_object()"},{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":"    @staticmethod"},{"line_number":1085,"context_line":"    def _get_future_object():"}],"source_content_type":"text/x-python","patch_set":2,"id":"8e05383c_f055373d","line":1082,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Item \"None\" of \"GreenThreading | None\" has no attribute \"condition_object\"  [union-attr]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1082,"context_line":"        return _green.threading.condition_object()"},{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":"    @staticmethod"},{"line_number":1085,"context_line":"    def _get_future_object():"},{"line_number":1086,"context_line":"        return GreenFuture()"},{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"8bc281aa_3afe20b4","line":1085,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1086,"context_line":"        return GreenFuture()"},{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"    @staticmethod"},{"line_number":1089,"context_line":"    def _start_thread(fn, *args, **kwargs):"},{"line_number":1090,"context_line":"        return _green.spawn(fn, *args, **kwargs)"},{"line_number":1091,"context_line":""},{"line_number":1092,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"2cf3f743_13d8fa27","line":1089,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1090,"context_line":"        return _green.spawn(fn, *args, **kwargs)"},{"line_number":1091,"context_line":""},{"line_number":1092,"context_line":"    @staticmethod"},{"line_number":1093,"context_line":"    def _join_thread(t):"},{"line_number":1094,"context_line":"        return t.wait()"},{"line_number":1095,"context_line":""},{"line_number":1096,"context_line":"    def _is_scheduler_alive(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":2,"id":"44f507b6_22185359","line":1093,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1120,"context_line":"    \"\"\""},{"line_number":1121,"context_line":""},{"line_number":1122,"context_line":"    @staticmethod"},{"line_number":1123,"context_line":"    def _get_condition_object():"},{"line_number":1124,"context_line":"        return threading.Condition()"},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"d0492c4a_3a13e8cc","line":1123,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1124,"context_line":"        return threading.Condition()"},{"line_number":1125,"context_line":""},{"line_number":1126,"context_line":"    @staticmethod"},{"line_number":1127,"context_line":"    def _get_future_object():"},{"line_number":1128,"context_line":"        return Future()"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"39a858fb_4803b826","line":1127,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1128,"context_line":"        return Future()"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    @staticmethod"},{"line_number":1131,"context_line":"    def _start_thread(fn, *args, **kwargs):"},{"line_number":1132,"context_line":"        t \u003d threading.Thread(target\u003dfn, *args, **kwargs)"},{"line_number":1133,"context_line":"        t.daemon \u003d True"},{"line_number":1134,"context_line":"        t.start()"}],"source_content_type":"text/x-python","patch_set":2,"id":"05a4c09c_79420ba1","line":1131,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"    @staticmethod"},{"line_number":1131,"context_line":"    def _start_thread(fn, *args, **kwargs):"},{"line_number":1132,"context_line":"        t \u003d threading.Thread(target\u003dfn, *args, **kwargs)"},{"line_number":1133,"context_line":"        t.daemon \u003d True"},{"line_number":1134,"context_line":"        t.start()"},{"line_number":1135,"context_line":"        return t"}],"source_content_type":"text/x-python","patch_set":2,"id":"8b19eff0_dfc69b46","line":1132,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: \"Thread\" gets multiple values for keyword argument \"target\"  [misc]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"        return t"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"    @staticmethod"},{"line_number":1138,"context_line":"    def _join_thread(t):"},{"line_number":1139,"context_line":"        return t.join()"},{"line_number":1140,"context_line":""},{"line_number":1141,"context_line":"    def _is_scheduler_alive(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1c9936ee_2e304753","line":1138,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":1139,"context_line":"        return t.join()"},{"line_number":1140,"context_line":""},{"line_number":1141,"context_line":"    def _is_scheduler_alive(self) -\u003e bool:"},{"line_number":1142,"context_line":"        return self._scheduler.is_alive()"}],"source_content_type":"text/x-python","patch_set":2,"id":"a21d23e2_f19075f4","line":1142,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Returning Any from function declared to return \"bool\"  [no-any-return]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":843,"context_line":"        ``sys.float_info.max`` inside :class:`Task.__init__`."},{"line_number":844,"context_line":"        \"\"\""},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"        def __lt__(self, other):"},{"line_number":847,"context_line":"            # The sentinel is never before any other task."},{"line_number":848,"context_line":"            return False"},{"line_number":849,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"125f6414_a441c163","line":846,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":847,"context_line":"            # The sentinel is never before any other task."},{"line_number":848,"context_line":"            return False"},{"line_number":849,"context_line":""},{"line_number":850,"context_line":"        def __repr__(self):"},{"line_number":851,"context_line":"            return \"SentinelTask\""},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"    class Task:"}],"source_content_type":"text/x-python","patch_set":3,"id":"a3e53523_8bafa4b6","line":850,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":851,"context_line":"            return \"SentinelTask\""},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"    class Task:"},{"line_number":854,"context_line":"        def __init__(self, fn, args, kwargs, future: Future, delay: float):"},{"line_number":855,"context_line":"            self.fn \u003d fn"},{"line_number":856,"context_line":"            self.args \u003d args"},{"line_number":857,"context_line":"            self.kwargs \u003d kwargs"}],"source_content_type":"text/x-python","patch_set":3,"id":"226e2ddb_4cadcc07","line":854,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation for one or more parameters  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":851,"context_line":"            return \"SentinelTask\""},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"    class Task:"},{"line_number":854,"context_line":"        def __init__(self, fn, args, kwargs, future: Future, delay: float):"},{"line_number":855,"context_line":"            self.fn \u003d fn"},{"line_number":856,"context_line":"            self.args \u003d args"},{"line_number":857,"context_line":"            self.kwargs \u003d kwargs"}],"source_content_type":"text/x-python","patch_set":3,"id":"5b5ab993_c0d03c24","line":854,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Missing type arguments for generic type \"Future\"  [type-arg]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":859,"context_line":"            self.deadline \u003d time.monotonic() + delay"},{"line_number":860,"context_line":""},{"line_number":861,"context_line":"        @property"},{"line_number":862,"context_line":"        def _remaining_delay(self):"},{"line_number":863,"context_line":"            return self.deadline - time.monotonic()"},{"line_number":864,"context_line":""},{"line_number":865,"context_line":"        def __repr__(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba84ec38_e39a9bbc","line":862,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":862,"context_line":"        def _remaining_delay(self):"},{"line_number":863,"context_line":"            return self.deadline - time.monotonic()"},{"line_number":864,"context_line":""},{"line_number":865,"context_line":"        def __repr__(self):"},{"line_number":866,"context_line":"            return ("},{"line_number":867,"context_line":"                f\"Task\u003d{self.fn}, \""},{"line_number":868,"context_line":"                f\"remaining_delay\u003d{self._remaining_delay}, \""}],"source_content_type":"text/x-python","patch_set":3,"id":"89ea5288_58cdee5b","line":865,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":869,"context_line":"                f\"future\u003d{self.future}\""},{"line_number":870,"context_line":"            )"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        def __lt__(self, other):"},{"line_number":873,"context_line":"            if isinstance(other, DelayedExecutorMixinBase._SentinelTask):"},{"line_number":874,"context_line":"                # Regular tasks always sort before the sentinel."},{"line_number":875,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a348a78_45a40ff3","line":872,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":877,"context_line":"                return NotImplemented"},{"line_number":878,"context_line":"            return self.deadline \u003c other.deadline"},{"line_number":879,"context_line":""},{"line_number":880,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":881,"context_line":"        super().__init__(*args, **kwargs)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"        self._queue_changed \u003d self._get_condition_object()"}],"source_content_type":"text/x-python","patch_set":3,"id":"cc6f6a2d_251779f1","line":880,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":880,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":881,"context_line":"        super().__init__(*args, **kwargs)"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"        self._queue_changed \u003d self._get_condition_object()"},{"line_number":884,"context_line":"        self._queue: list[DelayedExecutorMixinBase.Task] \u003d []"},{"line_number":885,"context_line":"        heapq.heapify(self._queue)"},{"line_number":886,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"afd054e4_b81af6a4","line":883,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_get_condition_object\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":888,"context_line":""},{"line_number":889,"context_line":"        self._shutdown_requested \u003d False"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"        self._scheduler \u003d self._start_thread(self._schedule)"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"    def _log(self, msg, *args):"},{"line_number":894,"context_line":"        LOG.debug(msg, *args)"}],"source_content_type":"text/x-python","patch_set":3,"id":"f35ff93c_16693c44","line":891,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_start_thread\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":890,"context_line":""},{"line_number":891,"context_line":"        self._scheduler \u003d self._start_thread(self._schedule)"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"    def _log(self, msg, *args):"},{"line_number":894,"context_line":"        LOG.debug(msg, *args)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"    def _task_wrapper(self, task):"}],"source_content_type":"text/x-python","patch_set":3,"id":"b58eaea6_68d43523","line":893,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":893,"context_line":"    def _log(self, msg, *args):"},{"line_number":894,"context_line":"        LOG.debug(msg, *args)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"    def _task_wrapper(self, task):"},{"line_number":897,"context_line":"        try:"},{"line_number":898,"context_line":"            task.future.set_result(task.fn(*task.args, **task.kwargs))"},{"line_number":899,"context_line":"        except BaseException as e:"}],"source_content_type":"text/x-python","patch_set":3,"id":"8d1f8838_4e7ebd3b","line":896,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":899,"context_line":"        except BaseException as e:"},{"line_number":900,"context_line":"            task.future.set_exception(e)"},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"    def _schedule(self):"},{"line_number":903,"context_line":"        while True:"},{"line_number":904,"context_line":"            with self._queue_changed:"},{"line_number":905,"context_line":"                self._log(\"Waiting for task\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"c52e7ca2_9b7058e6","line":902,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":902,"context_line":"    def _schedule(self):"},{"line_number":903,"context_line":"        while True:"},{"line_number":904,"context_line":"            with self._queue_changed:"},{"line_number":905,"context_line":"                self._log(\"Waiting for task\")"},{"line_number":906,"context_line":"                self._queue_changed.wait_for(lambda: len(self._queue))"},{"line_number":907,"context_line":"                task: DelayedExecutorMixinBase.Task \u003d heapq.heappop("},{"line_number":908,"context_line":"                    self._queue"}],"source_content_type":"text/x-python","patch_set":3,"id":"0485629b_d1fe402e","line":905,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":907,"context_line":"                task: DelayedExecutorMixinBase.Task \u003d heapq.heappop("},{"line_number":908,"context_line":"                    self._queue"},{"line_number":909,"context_line":"                )"},{"line_number":910,"context_line":"                self._log(\"%s received\", task)"},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"                if isinstance(task, self._SentinelTask):"},{"line_number":913,"context_line":"                    # We are being shutdown.  As the sentinel always sorts"}],"source_content_type":"text/x-python","patch_set":3,"id":"dfb20a2c_aff4a06d","line":910,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":916,"context_line":"                    # let the caller\u0027s shutdown(wait\u003dTrue) drain the inner"},{"line_number":917,"context_line":"                    # executor; calling super().shutdown(wait\u003dFalse) here"},{"line_number":918,"context_line":"                    # races with submitted tasks still in the inner queue."},{"line_number":919,"context_line":"                    self._log(\"Sentinel task received, exiting scheduler\")"},{"line_number":920,"context_line":"                    break"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"                # task is now the one with the closest deadline"}],"source_content_type":"text/x-python","patch_set":3,"id":"6ffd49f2_ebeb61c0","line":919,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":922,"context_line":"                # task is now the one with the closest deadline"},{"line_number":923,"context_line":"                if task.future.cancelled():"},{"line_number":924,"context_line":"                    # task is cancelled, just start over"},{"line_number":925,"context_line":"                    self._log(\"%s was cancelled while in the queue\", task)"},{"line_number":926,"context_line":"                    continue"},{"line_number":927,"context_line":""},{"line_number":928,"context_line":"                # wait for the deadline or an outside trigger"}],"source_content_type":"text/x-python","patch_set":3,"id":"18aa94ea_c8374996","line":925,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":926,"context_line":"                    continue"},{"line_number":927,"context_line":""},{"line_number":928,"context_line":"                # wait for the deadline or an outside trigger"},{"line_number":929,"context_line":"                self._log(\"Waiting for the deadline of %s\", task)"},{"line_number":930,"context_line":"                changed \u003d self._queue_changed.wait(task._remaining_delay)"},{"line_number":931,"context_line":"                self._log("},{"line_number":932,"context_line":"                    \"Awaken while waiting on %s, queue changed\u003d%s\","}],"source_content_type":"text/x-python","patch_set":3,"id":"ad4ba02b_0123d6f5","line":929,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":928,"context_line":"                # wait for the deadline or an outside trigger"},{"line_number":929,"context_line":"                self._log(\"Waiting for the deadline of %s\", task)"},{"line_number":930,"context_line":"                changed \u003d self._queue_changed.wait(task._remaining_delay)"},{"line_number":931,"context_line":"                self._log("},{"line_number":932,"context_line":"                    \"Awaken while waiting on %s, queue changed\u003d%s\","},{"line_number":933,"context_line":"                    task,"},{"line_number":934,"context_line":"                    changed,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3787d07e_15f882d1","line":931,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":938,"context_line":"                    # Something changed before the deadline."},{"line_number":939,"context_line":"                    if task.future.cancelled():"},{"line_number":940,"context_line":"                        # nothing to do with this task just start over"},{"line_number":941,"context_line":"                        self._log(\"%s is cancelled, skipping\", task)"},{"line_number":942,"context_line":"                        continue"},{"line_number":943,"context_line":"                    else:"},{"line_number":944,"context_line":"                        # Reinsert the task to the queue and start over; this"}],"source_content_type":"text/x-python","patch_set":3,"id":"057569df_4ac075d4","line":941,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":944,"context_line":"                        # Reinsert the task to the queue and start over; this"},{"line_number":945,"context_line":"                        # allows handling a newer task with a closer deadline."},{"line_number":946,"context_line":"                        heapq.heappush(self._queue, task)"},{"line_number":947,"context_line":"                        self._log(\"Queue changed, re-scheduling %s\", task)"},{"line_number":948,"context_line":"                        continue"},{"line_number":949,"context_line":"                else:"},{"line_number":950,"context_line":"                    # We hit the deadline of the task so if it is not"}],"source_content_type":"text/x-python","patch_set":3,"id":"8fa195a9_368a6a7b","line":947,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":952,"context_line":"                    run_it \u003d task.future.set_running_or_notify_cancel()"},{"line_number":953,"context_line":"                    if not run_it:"},{"line_number":954,"context_line":"                        # Task is cancelled just start over"},{"line_number":955,"context_line":"                        self._log(\"%s is cancelled, skipping\", task)"},{"line_number":956,"context_line":"                        continue"},{"line_number":957,"context_line":""},{"line_number":958,"context_line":"                    try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"09acc83c_0abdf2e8","line":955,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":958,"context_line":"                    try:"},{"line_number":959,"context_line":"                        self.submit(self._task_wrapper, task)"},{"line_number":960,"context_line":"                    except BaseException as e:"},{"line_number":961,"context_line":"                        self._log(\"Failed to submit %s: %s\", task, e)"},{"line_number":962,"context_line":"                        task.future.set_exception(e)"},{"line_number":963,"context_line":"                        continue"},{"line_number":964,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"c0f4847d_f28d57e3","line":961,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":962,"context_line":"                        task.future.set_exception(e)"},{"line_number":963,"context_line":"                        continue"},{"line_number":964,"context_line":""},{"line_number":965,"context_line":"                    self._log(\"Task submitted %s\", task)"},{"line_number":966,"context_line":""},{"line_number":967,"context_line":"        self._log(\"Scheduler thread finished\")"},{"line_number":968,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"48544920_4a558567","line":965,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":964,"context_line":""},{"line_number":965,"context_line":"                    self._log(\"Task submitted %s\", task)"},{"line_number":966,"context_line":""},{"line_number":967,"context_line":"        self._log(\"Scheduler thread finished\")"},{"line_number":968,"context_line":""},{"line_number":969,"context_line":"    def submit_after("},{"line_number":970,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":3,"id":"d6811ddf_6cafc60e","line":967,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":972,"context_line":"        fn: ty.Callable[..., ty.Any],"},{"line_number":973,"context_line":"        *args: ty.Any,"},{"line_number":974,"context_line":"        **kwargs: ty.Any,"},{"line_number":975,"context_line":"    ) -\u003e Future:"},{"line_number":976,"context_line":"        \"\"\"Schedule *fn* to run after *delay* seconds."},{"line_number":977,"context_line":""},{"line_number":978,"context_line":"        :param delay: Number of seconds to wait before executing *fn*."}],"source_content_type":"text/x-python","patch_set":3,"id":"99adc269_ead08461","line":975,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Missing type arguments for generic type \"Future\"  [type-arg]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":993,"context_line":"                )"},{"line_number":994,"context_line":""},{"line_number":995,"context_line":"            task \u003d self.Task("},{"line_number":996,"context_line":"                fn, args, kwargs, self._get_future_object(), delay"},{"line_number":997,"context_line":"            )"},{"line_number":998,"context_line":"            heapq.heappush(self._queue, task)"},{"line_number":999,"context_line":"            self._queue_changed.notify_all()"}],"source_content_type":"text/x-python","patch_set":3,"id":"2daa420e_69a3ca7d","line":996,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_get_future_object\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":997,"context_line":"            )"},{"line_number":998,"context_line":"            heapq.heappush(self._queue, task)"},{"line_number":999,"context_line":"            self._queue_changed.notify_all()"},{"line_number":1000,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1001,"context_line":"            return task.future"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"}],"source_content_type":"text/x-python","patch_set":3,"id":"10dd6054_ad0899df","line":1000,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1001,"context_line":"            return task.future"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1004,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1005,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1006,"context_line":"        with self._queue_changed:"}],"source_content_type":"text/x-python","patch_set":3,"id":"f65af7ae_f398c8fc","line":1003,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Signature of \"shutdown\" incompatible with supertype \"concurrent.futures._base.Executor\"  [override]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1001,"context_line":"            return task.future"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1004,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1005,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1006,"context_line":"        with self._queue_changed:"}],"source_content_type":"text/x-python","patch_set":3,"id":"0f14a1fa_9557fccb","line":1003,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: note:          def shutdown(self, wait: bool \u003d ...) -\u003e None","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1001,"context_line":"            return task.future"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1004,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1005,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1006,"context_line":"        with self._queue_changed:"}],"source_content_type":"text/x-python","patch_set":3,"id":"df387557_831d0cf4","line":1003,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: note:          def shutdown(self, wait: bool \u003d ..., *, cancel_futures: bool \u003d ...) -\u003e None","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1001,"context_line":"            return task.future"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1004,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1005,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1006,"context_line":"        with self._queue_changed:"}],"source_content_type":"text/x-python","patch_set":3,"id":"b015c4c1_956a926d","line":1003,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: note:      Subclass:","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"            self._log(\"%s is queued\", task)"},{"line_number":1001,"context_line":"            return task.future"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1004,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1005,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1006,"context_line":"        with self._queue_changed:"}],"source_content_type":"text/x-python","patch_set":3,"id":"b3a31a25_b3000d1b","line":1003,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: note:      Superclass:","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    def shutdown(self, wait: bool \u003d True) -\u003e None:"},{"line_number":1004,"context_line":"        \"\"\"Shutdown the executor.\"\"\""},{"line_number":1005,"context_line":"        self._log(\"Shutdown requested\")"},{"line_number":1006,"context_line":"        with self._queue_changed:"},{"line_number":1007,"context_line":"            if not self._shutdown_requested:"},{"line_number":1008,"context_line":"                # Ensure that our thread wakes at least one more time to allow"}],"source_content_type":"text/x-python","patch_set":3,"id":"8fcb0abb_0eba8606","line":1005,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1008,"context_line":"                # Ensure that our thread wakes at least one more time to allow"},{"line_number":1009,"context_line":"                # it to exit by queuing up a sentinel task after the shutdown"},{"line_number":1010,"context_line":"                # condition is set. This task won\u0027t be executed."},{"line_number":1011,"context_line":"                heapq.heappush(self._queue, self._sentinel)"},{"line_number":1012,"context_line":"                # We only want to queue 1 sentinel even if multiple shutdown"},{"line_number":1013,"context_line":"                # calls happen."},{"line_number":1014,"context_line":"                self._shutdown_requested \u003d True"}],"source_content_type":"text/x-python","patch_set":3,"id":"5979e33e_62f3c1fe","line":1011,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Cannot infer value of type parameter \"_T\" of \"heappush\"  [misc]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1013,"context_line":"                # calls happen."},{"line_number":1014,"context_line":"                self._shutdown_requested \u003d True"},{"line_number":1015,"context_line":"                self._queue_changed.notify_all()"},{"line_number":1016,"context_line":"                self._log(\"Shutdown signalled to the scheduler thread\")"},{"line_number":1017,"context_line":""},{"line_number":1018,"context_line":"        # If wait is set we need to wait for our sentinel to be processed and"},{"line_number":1019,"context_line":"        # therefore our thread to exit."}],"source_content_type":"text/x-python","patch_set":3,"id":"a694a80e_95c66789","line":1016,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"        # If wait is set we need to wait for our sentinel to be processed and"},{"line_number":1019,"context_line":"        # therefore our thread to exit."},{"line_number":1020,"context_line":"        if wait:"},{"line_number":1021,"context_line":"            self._log(\"Waiting for the scheduler thread to finish\")"},{"line_number":1022,"context_line":"            self._join_thread(self._scheduler)"},{"line_number":1023,"context_line":"            # The scheduler has submitted all pending tasks to the inner"},{"line_number":1024,"context_line":"            # executor.  Now drain and shut down the inner executor so all"}],"source_content_type":"text/x-python","patch_set":3,"id":"72795dbd_6d2a75cc","line":1021,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"        # therefore our thread to exit."},{"line_number":1020,"context_line":"        if wait:"},{"line_number":1021,"context_line":"            self._log(\"Waiting for the scheduler thread to finish\")"},{"line_number":1022,"context_line":"            self._join_thread(self._scheduler)"},{"line_number":1023,"context_line":"            # The scheduler has submitted all pending tasks to the inner"},{"line_number":1024,"context_line":"            # executor.  Now drain and shut down the inner executor so all"},{"line_number":1025,"context_line":"            # submitted work completes before we return."}],"source_content_type":"text/x-python","patch_set":3,"id":"0e35fa3d_872afaab","line":1022,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_join_thread\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"            # The scheduler has submitted all pending tasks to the inner"},{"line_number":1024,"context_line":"            # executor.  Now drain and shut down the inner executor so all"},{"line_number":1025,"context_line":"            # submitted work completes before we return."},{"line_number":1026,"context_line":"            self._log(\"Waiting for the internal executor to finish\")"},{"line_number":1027,"context_line":"            super().shutdown(wait)"},{"line_number":1028,"context_line":"        else:"},{"line_number":1029,"context_line":"            # With wait\u003dFalse we return immediately.  The scheduler thread"}],"source_content_type":"text/x-python","patch_set":3,"id":"3e929889_160537d8","line":1026,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Call to untyped function \"_log\" in typed context  [no-untyped-call]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1036,"context_line":"    @property"},{"line_number":1037,"context_line":"    def alive(self) -\u003e bool:"},{"line_number":1038,"context_line":"        \"\"\"Accessor to determine if the executor is alive/active.\"\"\""},{"line_number":1039,"context_line":"        return self._is_scheduler_alive() or super().alive"},{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"    def _get_condition_object(self):"},{"line_number":1042,"context_line":"        raise NotImplementedError"}],"source_content_type":"text/x-python","patch_set":3,"id":"04c763b3_e4815e2e","line":1039,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: \"alive\" undefined in superclass  [misc]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"        \"\"\"Accessor to determine if the executor is alive/active.\"\"\""},{"line_number":1039,"context_line":"        return self._is_scheduler_alive() or super().alive"},{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"    def _get_condition_object(self):"},{"line_number":1042,"context_line":"        raise NotImplementedError"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"    def _get_future_object(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"710b5546_09034c79","line":1041,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1038,"context_line":"        \"\"\"Accessor to determine if the executor is alive/active.\"\"\""},{"line_number":1039,"context_line":"        return self._is_scheduler_alive() or super().alive"},{"line_number":1040,"context_line":""},{"line_number":1041,"context_line":"    def _get_condition_object(self):"},{"line_number":1042,"context_line":"        raise NotImplementedError"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"    def _get_future_object(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"0feb29c2_9513fb79","line":1041,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: note: Use \"-\u003e None\" if function does not return a value","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"    def _get_condition_object(self):"},{"line_number":1042,"context_line":"        raise NotImplementedError"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"    def _get_future_object(self):"},{"line_number":1045,"context_line":"        raise NotImplementedError"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"    def _start_thread(self, fn, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"6df3b2d5_bb5ef537","line":1044,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1041,"context_line":"    def _get_condition_object(self):"},{"line_number":1042,"context_line":"        raise NotImplementedError"},{"line_number":1043,"context_line":""},{"line_number":1044,"context_line":"    def _get_future_object(self):"},{"line_number":1045,"context_line":"        raise NotImplementedError"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"    def _start_thread(self, fn, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"6a628af7_718073d6","line":1044,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: note: Use \"-\u003e None\" if function does not return a value","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1044,"context_line":"    def _get_future_object(self):"},{"line_number":1045,"context_line":"        raise NotImplementedError"},{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"    def _start_thread(self, fn, *args, **kwargs):"},{"line_number":1048,"context_line":"        raise NotImplementedError"},{"line_number":1049,"context_line":""},{"line_number":1050,"context_line":"    def _join_thread(self, t):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1276a4eb_b8e839d5","line":1047,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"    def _start_thread(self, fn, *args, **kwargs):"},{"line_number":1048,"context_line":"        raise NotImplementedError"},{"line_number":1049,"context_line":""},{"line_number":1050,"context_line":"    def _join_thread(self, t):"},{"line_number":1051,"context_line":"        raise NotImplementedError"},{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    def _is_scheduler_alive(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":3,"id":"934c3b61_8f30f3cf","line":1050,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"    \"\"\""},{"line_number":1080,"context_line":""},{"line_number":1081,"context_line":"    @staticmethod"},{"line_number":1082,"context_line":"    def _get_condition_object():"},{"line_number":1083,"context_line":"        return _green.threading.condition_object()"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"b6cd1f0d_98f0a531","line":1082,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1080,"context_line":""},{"line_number":1081,"context_line":"    @staticmethod"},{"line_number":1082,"context_line":"    def _get_condition_object():"},{"line_number":1083,"context_line":"        return _green.threading.condition_object()"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    @staticmethod"},{"line_number":1086,"context_line":"    def _get_future_object():"}],"source_content_type":"text/x-python","patch_set":3,"id":"f61381b1_5cbd8827","line":1083,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Item \"None\" of \"GreenThreading | None\" has no attribute \"condition_object\"  [union-attr]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"        return _green.threading.condition_object()"},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"    @staticmethod"},{"line_number":1086,"context_line":"    def _get_future_object():"},{"line_number":1087,"context_line":"        return GreenFuture()"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"55c70c54_36729ccc","line":1086,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1087,"context_line":"        return GreenFuture()"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":"    @staticmethod"},{"line_number":1090,"context_line":"    def _start_thread(fn, *args, **kwargs):"},{"line_number":1091,"context_line":"        return _green.spawn(fn, *args, **kwargs)"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"405324ba_ceb8775c","line":1090,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1091,"context_line":"        return _green.spawn(fn, *args, **kwargs)"},{"line_number":1092,"context_line":""},{"line_number":1093,"context_line":"    @staticmethod"},{"line_number":1094,"context_line":"    def _join_thread(t):"},{"line_number":1095,"context_line":"        return t.wait()"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"    def _is_scheduler_alive(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":3,"id":"c657dfb7_3220a91a","line":1094,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1121,"context_line":"    \"\"\""},{"line_number":1122,"context_line":""},{"line_number":1123,"context_line":"    @staticmethod"},{"line_number":1124,"context_line":"    def _get_condition_object():"},{"line_number":1125,"context_line":"        return threading.Condition()"},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"aef7a4e2_6d781c14","line":1124,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1125,"context_line":"        return threading.Condition()"},{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"    @staticmethod"},{"line_number":1128,"context_line":"    def _get_future_object():"},{"line_number":1129,"context_line":"        return Future()"},{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"82ef9eac_12ad6c92","line":1128,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a return type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1129,"context_line":"        return Future()"},{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"    @staticmethod"},{"line_number":1132,"context_line":"    def _start_thread(fn, *args, **kwargs):"},{"line_number":1133,"context_line":"        t \u003d threading.Thread(target\u003dfn, *args, **kwargs)"},{"line_number":1134,"context_line":"        t.daemon \u003d True"},{"line_number":1135,"context_line":"        t.start()"}],"source_content_type":"text/x-python","patch_set":3,"id":"6dcf07d9_edb2f177","line":1132,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"    @staticmethod"},{"line_number":1132,"context_line":"    def _start_thread(fn, *args, **kwargs):"},{"line_number":1133,"context_line":"        t \u003d threading.Thread(target\u003dfn, *args, **kwargs)"},{"line_number":1134,"context_line":"        t.daemon \u003d True"},{"line_number":1135,"context_line":"        t.start()"},{"line_number":1136,"context_line":"        return t"}],"source_content_type":"text/x-python","patch_set":3,"id":"c90fe595_e6a3f2dd","line":1133,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: \"Thread\" gets multiple values for keyword argument \"target\"  [misc]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1136,"context_line":"        return t"},{"line_number":1137,"context_line":""},{"line_number":1138,"context_line":"    @staticmethod"},{"line_number":1139,"context_line":"    def _join_thread(t):"},{"line_number":1140,"context_line":"        return t.join()"},{"line_number":1141,"context_line":""},{"line_number":1142,"context_line":"    def _is_scheduler_alive(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ad70ab47_2add86ef","line":1139,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":1140,"context_line":"        return t.join()"},{"line_number":1141,"context_line":""},{"line_number":1142,"context_line":"    def _is_scheduler_alive(self) -\u003e bool:"},{"line_number":1143,"context_line":"        return self._scheduler.is_alive()"}],"source_content_type":"text/x-python","patch_set":3,"id":"87e400e0_699446dd","line":1143,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Returning Any from function declared to return \"bool\"  [no-any-return]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aeedfa0f88b805dd00e5e3d43344c223e5782343","unresolved":true,"context_lines":[{"line_number":881,"context_line":"                f\"future\u003d{self.future}\""},{"line_number":882,"context_line":"            )"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"        def __lt__(self, other: object) -\u003e bool:"},{"line_number":885,"context_line":"            if isinstance(other, DelayedExecutorMixinBase._SentinelTask):"},{"line_number":886,"context_line":"                # Regular tasks always sort before the sentinel."},{"line_number":887,"context_line":"                return True"},{"line_number":888,"context_line":"            if not isinstance(other, DelayedExecutorMixinBase.Task):"},{"line_number":889,"context_line":"                return NotImplemented"},{"line_number":890,"context_line":"            return self.deadline \u003c other.deadline"},{"line_number":891,"context_line":""},{"line_number":892,"context_line":"    def __init__(self, *args: ty.Any, **kwargs: ty.Any) -\u003e None:"},{"line_number":893,"context_line":"        super().__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"671f056c_4ba087a9","line":890,"range":{"start_line":884,"start_character":0,"end_line":890,"end_character":49},"updated":"2026-07-17 09:31:51.000000000","message":"hm I originally thought that we need `__lt__` on the _SentinelTask but special casing here works without calling `__lt__` on SentinelTask. I\u0027m wondering if we can solve the sorting with relying on `__lt__` instead of isinstance.","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"c79a24235a1241af0465593fb77cbbd6d66d5ce9","unresolved":false,"context_lines":[{"line_number":881,"context_line":"                f\"future\u003d{self.future}\""},{"line_number":882,"context_line":"            )"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"        def __lt__(self, other: object) -\u003e bool:"},{"line_number":885,"context_line":"            if isinstance(other, DelayedExecutorMixinBase._SentinelTask):"},{"line_number":886,"context_line":"                # Regular tasks always sort before the sentinel."},{"line_number":887,"context_line":"                return True"},{"line_number":888,"context_line":"            if not isinstance(other, DelayedExecutorMixinBase.Task):"},{"line_number":889,"context_line":"                return NotImplemented"},{"line_number":890,"context_line":"            return self.deadline \u003c other.deadline"},{"line_number":891,"context_line":""},{"line_number":892,"context_line":"    def __init__(self, *args: ty.Any, **kwargs: ty.Any) -\u003e None:"},{"line_number":893,"context_line":"        super().__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":6,"id":"74f234ff_b019346b","line":890,"range":{"start_line":884,"start_character":0,"end_line":890,"end_character":49},"in_reply_to":"671f056c_4ba087a9","updated":"2026-07-17 13:42:36.000000000","message":"Done","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aeedfa0f88b805dd00e5e3d43344c223e5782343","unresolved":true,"context_lines":[{"line_number":895,"context_line":"        self._queue_changed \u003d self._get_condition_object()"},{"line_number":896,"context_line":"        # Typed as list[ty.Any] because the heap holds both Task and"},{"line_number":897,"context_line":"        # _SentinelTask instances; the sentinel always sorts last."},{"line_number":898,"context_line":"        self._queue: list[ty.Any] \u003d []"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"        self._sentinel \u003d self._SentinelTask()"},{"line_number":901,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"98a4f099_72debf10","line":898,"updated":"2026-07-17 09:31:51.000000000","message":"this is a queue of Task (and SentinelTask if we don\u0027t make Sentinel inherit from Task)","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"c79a24235a1241af0465593fb77cbbd6d66d5ce9","unresolved":false,"context_lines":[{"line_number":895,"context_line":"        self._queue_changed \u003d self._get_condition_object()"},{"line_number":896,"context_line":"        # Typed as list[ty.Any] because the heap holds both Task and"},{"line_number":897,"context_line":"        # _SentinelTask instances; the sentinel always sorts last."},{"line_number":898,"context_line":"        self._queue: list[ty.Any] \u003d []"},{"line_number":899,"context_line":""},{"line_number":900,"context_line":"        self._sentinel \u003d self._SentinelTask()"},{"line_number":901,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"80514dbd_48c741d9","line":898,"in_reply_to":"98a4f099_72debf10","updated":"2026-07-17 13:42:36.000000000","message":"Done","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aeedfa0f88b805dd00e5e3d43344c223e5782343","unresolved":true,"context_lines":[{"line_number":904,"context_line":""},{"line_number":905,"context_line":"        self._scheduler \u003d self._start_thread(self._schedule)"},{"line_number":906,"context_line":""},{"line_number":907,"context_line":"    def _task_wrapper(self, task: Task) -\u003e None:"},{"line_number":908,"context_line":"        try:"},{"line_number":909,"context_line":"            result \u003d task.fn(*task.args, **task.kwargs)"},{"line_number":910,"context_line":"        except BaseException as e:"},{"line_number":911,"context_line":"            task.future.set_exception(e)"},{"line_number":912,"context_line":"        else:"},{"line_number":913,"context_line":"            task.future.set_result(result)"},{"line_number":914,"context_line":""},{"line_number":915,"context_line":"    def _schedule(self) -\u003e None:"},{"line_number":916,"context_line":"        \"\"\"Run the scheduler, submitting delayed tasks as they become due.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"83a07896_1ca4434b","line":913,"range":{"start_line":907,"start_character":0,"end_line":913,"end_character":42},"updated":"2026-07-17 09:31:51.000000000","message":"is there a functional reason this was rewritten from PS1? or it is just different style?","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"c79a24235a1241af0465593fb77cbbd6d66d5ce9","unresolved":false,"context_lines":[{"line_number":904,"context_line":""},{"line_number":905,"context_line":"        self._scheduler \u003d self._start_thread(self._schedule)"},{"line_number":906,"context_line":""},{"line_number":907,"context_line":"    def _task_wrapper(self, task: Task) -\u003e None:"},{"line_number":908,"context_line":"        try:"},{"line_number":909,"context_line":"            result \u003d task.fn(*task.args, **task.kwargs)"},{"line_number":910,"context_line":"        except BaseException as e:"},{"line_number":911,"context_line":"            task.future.set_exception(e)"},{"line_number":912,"context_line":"        else:"},{"line_number":913,"context_line":"            task.future.set_result(result)"},{"line_number":914,"context_line":""},{"line_number":915,"context_line":"    def _schedule(self) -\u003e None:"},{"line_number":916,"context_line":"        \"\"\"Run the scheduler, submitting delayed tasks as they become due.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"652ceebc_b154c322","line":913,"range":{"start_line":907,"start_character":0,"end_line":913,"end_character":42},"in_reply_to":"83a07896_1ca4434b","updated":"2026-07-17 13:42:36.000000000","message":"Done","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aeedfa0f88b805dd00e5e3d43344c223e5782343","unresolved":true,"context_lines":[{"line_number":921,"context_line":"                self._queue_changed.wait_for(lambda: bool(self._queue))"},{"line_number":922,"context_line":"                task: ("},{"line_number":923,"context_line":"                    DelayedExecutorMixinBase.Task"},{"line_number":924,"context_line":"                    | DelayedExecutorMixinBase._SentinelTask"},{"line_number":925,"context_line":"                ) \u003d heapq.heappop(self._queue)"},{"line_number":926,"context_line":"                LOG.debug(\"%s received\", task)"},{"line_number":927,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"266ae859_14652818","line":924,"updated":"2026-07-17 09:31:51.000000000","message":"I feel SentinelTask could be a child of Task","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"c79a24235a1241af0465593fb77cbbd6d66d5ce9","unresolved":false,"context_lines":[{"line_number":921,"context_line":"                self._queue_changed.wait_for(lambda: bool(self._queue))"},{"line_number":922,"context_line":"                task: ("},{"line_number":923,"context_line":"                    DelayedExecutorMixinBase.Task"},{"line_number":924,"context_line":"                    | DelayedExecutorMixinBase._SentinelTask"},{"line_number":925,"context_line":"                ) \u003d heapq.heappop(self._queue)"},{"line_number":926,"context_line":"                LOG.debug(\"%s received\", task)"},{"line_number":927,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"289a3a00_4c29d55c","line":924,"in_reply_to":"266ae859_14652818","updated":"2026-07-17 13:42:36.000000000","message":"Done","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aeedfa0f88b805dd00e5e3d43344c223e5782343","unresolved":true,"context_lines":[{"line_number":925,"context_line":"                ) \u003d heapq.heappop(self._queue)"},{"line_number":926,"context_line":"                LOG.debug(\"%s received\", task)"},{"line_number":927,"context_line":""},{"line_number":928,"context_line":"                if isinstance(task, self._SentinelTask):"},{"line_number":929,"context_line":"                    # We are being shutdown.  As the sentinel always sorts"},{"line_number":930,"context_line":"                    # after every real task we know all pending tasks have"},{"line_number":931,"context_line":"                    # been submitted to the inner executor.  Break out and"}],"source_content_type":"text/x-python","patch_set":6,"id":"dd6513ec_7a17f8a6","line":928,"updated":"2026-07-17 09:31:51.000000000","message":"we have self._sentinel if we queue that at shutdown then we can simply check task is self._sentinel here","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"c79a24235a1241af0465593fb77cbbd6d66d5ce9","unresolved":false,"context_lines":[{"line_number":925,"context_line":"                ) \u003d heapq.heappop(self._queue)"},{"line_number":926,"context_line":"                LOG.debug(\"%s received\", task)"},{"line_number":927,"context_line":""},{"line_number":928,"context_line":"                if isinstance(task, self._SentinelTask):"},{"line_number":929,"context_line":"                    # We are being shutdown.  As the sentinel always sorts"},{"line_number":930,"context_line":"                    # after every real task we know all pending tasks have"},{"line_number":931,"context_line":"                    # been submitted to the inner executor.  Break out and"}],"source_content_type":"text/x-python","patch_set":6,"id":"d7df8114_e44ea557","line":928,"in_reply_to":"dd6513ec_7a17f8a6","updated":"2026-07-17 13:42:36.000000000","message":"Done","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aeedfa0f88b805dd00e5e3d43344c223e5782343","unresolved":true,"context_lines":[{"line_number":931,"context_line":"                    # been submitted to the inner executor.  Break out and"},{"line_number":932,"context_line":"                    # let the caller\u0027s shutdown(wait\u003dTrue) drain the inner"},{"line_number":933,"context_line":"                    # executor; calling super().shutdown(wait\u003dFalse) here"},{"line_number":934,"context_line":"                    # races with submitted tasks still in the inner queue."},{"line_number":935,"context_line":"                    LOG.debug(\"Sentinel task received, exiting scheduler\")"},{"line_number":936,"context_line":"                    break"},{"line_number":937,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"45312d52_de03fbcd","line":934,"updated":"2026-07-17 09:31:51.000000000","message":"this is interesting. At this point we popped the sentinel from our queue. So we know that every other task is already submitted to the inner executor. So calling shutdown here should be valid and non racy if the inner executor.shutdown is safe. What exactly the failure mode when we race?","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"c79a24235a1241af0465593fb77cbbd6d66d5ce9","unresolved":false,"context_lines":[{"line_number":931,"context_line":"                    # been submitted to the inner executor.  Break out and"},{"line_number":932,"context_line":"                    # let the caller\u0027s shutdown(wait\u003dTrue) drain the inner"},{"line_number":933,"context_line":"                    # executor; calling super().shutdown(wait\u003dFalse) here"},{"line_number":934,"context_line":"                    # races with submitted tasks still in the inner queue."},{"line_number":935,"context_line":"                    LOG.debug(\"Sentinel task received, exiting scheduler\")"},{"line_number":936,"context_line":"                    break"},{"line_number":937,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"8384d40e_19bd2baa","line":934,"in_reply_to":"45312d52_de03fbcd","updated":"2026-07-17 13:42:36.000000000","message":"Done","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aeedfa0f88b805dd00e5e3d43344c223e5782343","unresolved":true,"context_lines":[{"line_number":975,"context_line":"                    task_to_submit \u003d task"},{"line_number":976,"context_line":""},{"line_number":977,"context_line":"            # Submit outside the lock so that concurrent submit_after calls"},{"line_number":978,"context_line":"            # are not blocked while the inner executor accepts the task."},{"line_number":979,"context_line":"            if task_to_submit is not None:"},{"line_number":980,"context_line":"                try:"},{"line_number":981,"context_line":"                    self.submit(self._task_wrapper, task_to_submit)"}],"source_content_type":"text/x-python","patch_set":6,"id":"a57738c1_225156a8","line":978,"updated":"2026-07-17 09:31:51.000000000","message":"as far as I understand the inner executor accepting a task is not a blocking call. So what kind of blocking we impose on submit_afters?","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aeedfa0f88b805dd00e5e3d43344c223e5782343","unresolved":true,"context_lines":[{"line_number":1035,"context_line":"        :param cancel_futures: If ``True``, cancel any delayed tasks that"},{"line_number":1036,"context_line":"            are still waiting for their deadline before shutting down."},{"line_number":1037,"context_line":"        \"\"\""},{"line_number":1038,"context_line":"        self._shutdown_called \u003d True"},{"line_number":1039,"context_line":"        LOG.debug(\"Shutdown requested\")"},{"line_number":1040,"context_line":"        with self._queue_changed:"},{"line_number":1041,"context_line":"            if cancel_futures:"}],"source_content_type":"text/x-python","patch_set":6,"id":"a634f6ff_536669d4","line":1038,"updated":"2026-07-17 09:31:51.000000000","message":"hm this is outside of any lock, is it used by multiple threads?","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"c79a24235a1241af0465593fb77cbbd6d66d5ce9","unresolved":false,"context_lines":[{"line_number":1035,"context_line":"        :param cancel_futures: If ``True``, cancel any delayed tasks that"},{"line_number":1036,"context_line":"            are still waiting for their deadline before shutting down."},{"line_number":1037,"context_line":"        \"\"\""},{"line_number":1038,"context_line":"        self._shutdown_called \u003d True"},{"line_number":1039,"context_line":"        LOG.debug(\"Shutdown requested\")"},{"line_number":1040,"context_line":"        with self._queue_changed:"},{"line_number":1041,"context_line":"            if cancel_futures:"}],"source_content_type":"text/x-python","patch_set":6,"id":"df7cdbe5_6c974f01","line":1038,"in_reply_to":"a634f6ff_536669d4","updated":"2026-07-17 13:42:36.000000000","message":"Done","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aeedfa0f88b805dd00e5e3d43344c223e5782343","unresolved":true,"context_lines":[{"line_number":1040,"context_line":"        with self._queue_changed:"},{"line_number":1041,"context_line":"            if cancel_futures:"},{"line_number":1042,"context_line":"                for item in self._queue:"},{"line_number":1043,"context_line":"                    if isinstance(item, self.Task):"},{"line_number":1044,"context_line":"                        item.future.cancel()"},{"line_number":1045,"context_line":"            if not self._shutdown_requested:"},{"line_number":1046,"context_line":"                # Ensure that our thread wakes at least one more time to allow"}],"source_content_type":"text/x-python","patch_set":6,"id":"de547ec0_cd2a8901","line":1043,"updated":"2026-07-17 09:31:51.000000000","message":"item is not self._sentinel","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"c79a24235a1241af0465593fb77cbbd6d66d5ce9","unresolved":false,"context_lines":[{"line_number":1040,"context_line":"        with self._queue_changed:"},{"line_number":1041,"context_line":"            if cancel_futures:"},{"line_number":1042,"context_line":"                for item in self._queue:"},{"line_number":1043,"context_line":"                    if isinstance(item, self.Task):"},{"line_number":1044,"context_line":"                        item.future.cancel()"},{"line_number":1045,"context_line":"            if not self._shutdown_requested:"},{"line_number":1046,"context_line":"                # Ensure that our thread wakes at least one more time to allow"}],"source_content_type":"text/x-python","patch_set":6,"id":"abc18022_6ae120c7","line":1043,"in_reply_to":"de547ec0_cd2a8901","updated":"2026-07-17 13:42:36.000000000","message":"Done","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aeedfa0f88b805dd00e5e3d43344c223e5782343","unresolved":true,"context_lines":[{"line_number":1065,"context_line":"            super().shutdown(wait\u003dwait, cancel_futures\u003dcancel_futures)"},{"line_number":1066,"context_line":"        # With wait\u003dFalse we return immediately.  The scheduler thread is"},{"line_number":1067,"context_line":"        # still running and will submit any remaining delayed tasks to the"},{"line_number":1068,"context_line":"        # inner executor before it exits.  The inner executor will be shut"},{"line_number":1069,"context_line":"        # down by the next call to shutdown(wait\u003dTrue), or cleaned up when"},{"line_number":1070,"context_line":"        # the object is garbage-collected."},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"    @property"},{"line_number":1073,"context_line":"    def alive(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":6,"id":"d4468b4a_653935ec","line":1070,"range":{"start_line":1068,"start_character":42,"end_line":1070,"end_character":42},"updated":"2026-07-17 09:31:51.000000000","message":"that is problematic. We cannot expect the caller to do a shutdown(wait\u003dTrue). I think the contract of shutdown(wait\u003dFalse) is:\n\n\u003e . If wait is False then this method will return immediately and the resources associated with the executor will be freed when all pending futures are done executing.\nhttps://docs.python.org/3/library/concurrent.futures.html\n\nSo we cannot wait for the resources freed until GC runs.\n\nIs there a problem using the _scheduler thread to shutdown the inner executor when the sentinel is processed?","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"e90105dfc5671c7d2ea707a2a2d54efdecfa250e","unresolved":false,"context_lines":[{"line_number":1065,"context_line":"            super().shutdown(wait\u003dwait, cancel_futures\u003dcancel_futures)"},{"line_number":1066,"context_line":"        # With wait\u003dFalse we return immediately.  The scheduler thread is"},{"line_number":1067,"context_line":"        # still running and will submit any remaining delayed tasks to the"},{"line_number":1068,"context_line":"        # inner executor before it exits.  The inner executor will be shut"},{"line_number":1069,"context_line":"        # down by the next call to shutdown(wait\u003dTrue), or cleaned up when"},{"line_number":1070,"context_line":"        # the object is garbage-collected."},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"    @property"},{"line_number":1073,"context_line":"    def alive(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":6,"id":"a0200982_0f7dd2bc","line":1070,"range":{"start_line":1068,"start_character":42,"end_line":1070,"end_character":42},"in_reply_to":"0dcf3349_3e681d5a","updated":"2026-07-29 08:07:23.000000000","message":"Done","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5ba24cc8a25112484b2418cc01fba3a63a021442","unresolved":false,"context_lines":[{"line_number":1065,"context_line":"            super().shutdown(wait\u003dwait, cancel_futures\u003dcancel_futures)"},{"line_number":1066,"context_line":"        # With wait\u003dFalse we return immediately.  The scheduler thread is"},{"line_number":1067,"context_line":"        # still running and will submit any remaining delayed tasks to the"},{"line_number":1068,"context_line":"        # inner executor before it exits.  The inner executor will be shut"},{"line_number":1069,"context_line":"        # down by the next call to shutdown(wait\u003dTrue), or cleaned up when"},{"line_number":1070,"context_line":"        # the object is garbage-collected."},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"    @property"},{"line_number":1073,"context_line":"    def alive(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":6,"id":"c1ebbb1d_9586adc2","line":1070,"range":{"start_line":1068,"start_character":42,"end_line":1070,"end_character":42},"in_reply_to":"0dcf3349_3e681d5a","updated":"2026-07-24 17:55:52.000000000","message":"Done","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"c79a24235a1241af0465593fb77cbbd6d66d5ce9","unresolved":true,"context_lines":[{"line_number":1065,"context_line":"            super().shutdown(wait\u003dwait, cancel_futures\u003dcancel_futures)"},{"line_number":1066,"context_line":"        # With wait\u003dFalse we return immediately.  The scheduler thread is"},{"line_number":1067,"context_line":"        # still running and will submit any remaining delayed tasks to the"},{"line_number":1068,"context_line":"        # inner executor before it exits.  The inner executor will be shut"},{"line_number":1069,"context_line":"        # down by the next call to shutdown(wait\u003dTrue), or cleaned up when"},{"line_number":1070,"context_line":"        # the object is garbage-collected."},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"    @property"},{"line_number":1073,"context_line":"    def alive(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":6,"id":"0dcf3349_3e681d5a","line":1070,"range":{"start_line":1068,"start_character":42,"end_line":1070,"end_character":42},"in_reply_to":"d4468b4a_653935ec","updated":"2026-07-17 13:42:36.000000000","message":"apparently not","commit_id":"324760904bf1d04b131c9a7f43c58bb82f363002"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":false,"context_lines":[{"line_number":880,"context_line":"        signal."},{"line_number":881,"context_line":"        \"\"\""},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"        def __init__(self) -\u003e None:"},{"line_number":884,"context_line":"            self.deadline \u003d float(\"inf\")"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":"        def __repr__(self) -\u003e str:"}],"source_content_type":"text/x-python","patch_set":10,"id":"4e9e7e58_1ae4c0b6","line":883,"updated":"2026-07-24 17:55:13.000000000","message":"we don\u0027t call `super().__init__()` that is not nice but I guess it is OK for us now. Calling it and passing some fake data to it is similarly strange anyhow. In a stricter language I would make __init__ private and expose only a single instance of it to the client. That would made the ugliness more contained. Be have the underscore before the name to suggest that sort of :)","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":false,"context_lines":[{"line_number":881,"context_line":"        \"\"\""},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"        def __init__(self) -\u003e None:"},{"line_number":884,"context_line":"            self.deadline \u003d float(\"inf\")"},{"line_number":885,"context_line":""},{"line_number":886,"context_line":"        def __repr__(self) -\u003e str:"},{"line_number":887,"context_line":"            return \"SentinelTask\""}],"source_content_type":"text/x-python","patch_set":10,"id":"a25b6998_9786d59e","line":884,"updated":"2026-07-24 17:55:13.000000000","message":"huhh, smart :) definitely better than my original MAX_INT\nI guess adding to inf is safe as it is still inf. And comparison sounds solid. \n\nhopefully we never want to do something like\n```\n\u003e\u003e\u003e self.deadline - self.deadline\nnan\n```\n:)","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":false,"context_lines":[{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    def _task_wrapper(self, task: Task) -\u003e None:"},{"line_number":906,"context_line":"        try:"},{"line_number":907,"context_line":"            task.future.set_result(task.fn(*task.args, **task.kwargs))"},{"line_number":908,"context_line":"        except BaseException as e:"},{"line_number":909,"context_line":"            task.future.set_exception(e)"},{"line_number":910,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"4ded8268_74978512","line":907,"range":{"start_line":907,"start_character":35,"end_line":907,"end_character":69},"updated":"2026-07-24 17:55:13.000000000","message":"nit: this is something that a task.run() method could hide. I\u0027m OK with this as Task is already inside DelayedExecutorMixinBase so it is not like any kind of external Task subclass needs to be supported.","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":false,"context_lines":[{"line_number":911,"context_line":"    def _schedule(self) -\u003e None:"},{"line_number":912,"context_line":"        \"\"\"Run the scheduler, submitting delayed tasks as they become due.\"\"\""},{"line_number":913,"context_line":"        while True:"},{"line_number":914,"context_line":"            task_to_submit: DelayedExecutorMixinBase.Task | None \u003d None"},{"line_number":915,"context_line":"            with self._queue_changed:"},{"line_number":916,"context_line":"                LOG.debug(\"Waiting for task\")"},{"line_number":917,"context_line":"                self._queue_changed.wait_for(lambda: bool(self._queue))"}],"source_content_type":"text/x-python","patch_set":10,"id":"b383c24c_0d5d6398","line":914,"updated":"2026-07-24 17:55:13.000000000","message":"OK by setting this to None at each iteration we ensure that a single task is only submitted at max once","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":false,"context_lines":[{"line_number":928,"context_line":"                    # not the caller passes wait\u003dTrue."},{"line_number":929,"context_line":"                    LOG.debug(\"Sentinel task received, exiting scheduler\")"},{"line_number":930,"context_line":"                    super().shutdown("},{"line_number":931,"context_line":"                        wait\u003dFalse,"},{"line_number":932,"context_line":"                        cancel_futures\u003dself._cancel_futures_on_shutdown,"},{"line_number":933,"context_line":"                    )"},{"line_number":934,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":10,"id":"d7ea264d_be2bfc13","line":931,"updated":"2026-07-24 17:55:13.000000000","message":"this is OK. If we are asked to shutdown with wait\u003dTrue we need to do that waiting in shutdown() anyhow to be able to block the caller.","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":false,"context_lines":[{"line_number":929,"context_line":"                    LOG.debug(\"Sentinel task received, exiting scheduler\")"},{"line_number":930,"context_line":"                    super().shutdown("},{"line_number":931,"context_line":"                        wait\u003dFalse,"},{"line_number":932,"context_line":"                        cancel_futures\u003dself._cancel_futures_on_shutdown,"},{"line_number":933,"context_line":"                    )"},{"line_number":934,"context_line":"                    break"},{"line_number":935,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"d488e0f0_64ed791e","line":932,"updated":"2026-07-24 17:55:13.000000000","message":"OK we are under the _queue_changed lock and shutdown() uses that as well when setting this variable before queuing the sentinel. \n\nThis seems solid.","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":true,"context_lines":[{"line_number":1049,"context_line":"                heapq.heappush(self._queue, self._sentinel)"},{"line_number":1050,"context_line":"                # We only want to queue 1 sentinel even if multiple shutdown"},{"line_number":1051,"context_line":"                # calls happen."},{"line_number":1052,"context_line":"                self._shutdown_requested \u003d True"},{"line_number":1053,"context_line":"                self._queue_changed.notify_all()"},{"line_number":1054,"context_line":"                LOG.debug(\"Shutdown signalled to the scheduler thread\")"},{"line_number":1055,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"4a68ed1a_37824eb0","line":1052,"updated":"2026-07-24 17:55:13.000000000","message":"nit: as both _shutdown_called and _shutdown_requested are set under the same lock I would say the more specific variable _shutdown_requested is enough and can be used every place where currently _shutdown_called is read.\n(do not respin if this is the only change you would do this is just a marginal optimizatin)","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"e90105dfc5671c7d2ea707a2a2d54efdecfa250e","unresolved":false,"context_lines":[{"line_number":1049,"context_line":"                heapq.heappush(self._queue, self._sentinel)"},{"line_number":1050,"context_line":"                # We only want to queue 1 sentinel even if multiple shutdown"},{"line_number":1051,"context_line":"                # calls happen."},{"line_number":1052,"context_line":"                self._shutdown_requested \u003d True"},{"line_number":1053,"context_line":"                self._queue_changed.notify_all()"},{"line_number":1054,"context_line":"                LOG.debug(\"Shutdown signalled to the scheduler thread\")"},{"line_number":1055,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"42c21cb9_5838145d","line":1052,"in_reply_to":"4a68ed1a_37824eb0","updated":"2026-07-29 08:07:23.000000000","message":"Done","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":false,"context_lines":[{"line_number":1065,"context_line":"            super().shutdown(wait\u003dwait, cancel_futures\u003dcancel_futures)"},{"line_number":1066,"context_line":"        # With wait\u003dFalse we return immediately.  The scheduler thread is"},{"line_number":1067,"context_line":"        # still running, will submit any remaining delayed tasks to the"},{"line_number":1068,"context_line":"        # inner executor, and will then shut down the inner executor itself."},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"    @property"},{"line_number":1071,"context_line":"    def alive(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":10,"id":"ec73dad5_5618ce67","line":1068,"updated":"2026-07-24 17:55:13.000000000","message":"OK this feel good now.","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":false,"context_lines":[{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"        Note: ``alive`` is not defined on the stdlib"},{"line_number":1081,"context_line":"        :class:`~concurrent.futures.Executor` base class, but every futurist"},{"line_number":1082,"context_line":"        executor exposes it.  This mixin is designed to be combined with a"},{"line_number":1083,"context_line":"        futurist executor, so ``super().alive`` will always resolve correctly"},{"line_number":1084,"context_line":"        at runtime even though the static type checker cannot verify it."},{"line_number":1085,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"dd084c92_f0385649","line":1082,"updated":"2026-07-24 17:55:13.000000000","message":"ahh, thanks for the explanation. I was about to ask :) When we finally delete eventlet we should transition to stdlib ThreadPoolExecutors for simplicity. But that is a future story.","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":true,"context_lines":[{"line_number":1086,"context_line":"        if self._shutdown_called:"},{"line_number":1087,"context_line":"            # Once shutdown has been requested, we are alive only while the"},{"line_number":1088,"context_line":"            # scheduler thread is still running. Ignoring super().alive"},{"line_number":1089,"context_line":"            # avoids a spurious True when shutdown(wait\u003dFalse) was used and"},{"line_number":1090,"context_line":"            # the inner executor was never explicitly shut down."},{"line_number":1091,"context_line":"            return self._is_scheduler_alive()"},{"line_number":1092,"context_line":"        return self._is_scheduler_alive() or super().alive  # type: ignore[misc]"}],"source_content_type":"text/x-python","patch_set":10,"id":"cf694257_125392c7","line":1089,"updated":"2026-07-24 17:55:13.000000000","message":"interesting. So the mixing got shutdown(wait\u003dfalse), the scheduler got the sentinel, and called shutdown on the inner executor, then exited. How can be that we end up in the case when scheduler is dead, but the inner is alive?","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"e90105dfc5671c7d2ea707a2a2d54efdecfa250e","unresolved":true,"context_lines":[{"line_number":1086,"context_line":"        if self._shutdown_called:"},{"line_number":1087,"context_line":"            # Once shutdown has been requested, we are alive only while the"},{"line_number":1088,"context_line":"            # scheduler thread is still running. Ignoring super().alive"},{"line_number":1089,"context_line":"            # avoids a spurious True when shutdown(wait\u003dFalse) was used and"},{"line_number":1090,"context_line":"            # the inner executor was never explicitly shut down."},{"line_number":1091,"context_line":"            return self._is_scheduler_alive()"},{"line_number":1092,"context_line":"        return self._is_scheduler_alive() or super().alive  # type: ignore[misc]"}],"source_content_type":"text/x-python","patch_set":10,"id":"e70f7a89_28a7178b","line":1089,"in_reply_to":"cf694257_125392c7","updated":"2026-07-29 08:07:23.000000000","message":"I think I created some weird mocking issue in my local tests, and I ended up with an issue like this","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a2e70b95bb7a84fe6b0d2ba08862db0ed8e5e7b9","unresolved":false,"context_lines":[{"line_number":1086,"context_line":"        if self._shutdown_called:"},{"line_number":1087,"context_line":"            # Once shutdown has been requested, we are alive only while the"},{"line_number":1088,"context_line":"            # scheduler thread is still running. Ignoring super().alive"},{"line_number":1089,"context_line":"            # avoids a spurious True when shutdown(wait\u003dFalse) was used and"},{"line_number":1090,"context_line":"            # the inner executor was never explicitly shut down."},{"line_number":1091,"context_line":"            return self._is_scheduler_alive()"},{"line_number":1092,"context_line":"        return self._is_scheduler_alive() or super().alive  # type: ignore[misc]"}],"source_content_type":"text/x-python","patch_set":10,"id":"1778c420_2fb546b7","line":1089,"in_reply_to":"e70f7a89_28a7178b","updated":"2026-07-31 08:56:24.000000000","message":"Acknowledged","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0f4d4964a06f3b95ad20ce4c89d0069af1454b65","unresolved":true,"context_lines":[{"line_number":817,"context_line":"        )"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":""},{"line_number":820,"context_line":"class DelayedExecutorMixinBase(_futures.Executor, abc.ABC):"},{"line_number":821,"context_line":"    \"\"\"Mixin that adds submit_after(delay, fn, ...) to any Executor subclass."},{"line_number":822,"context_line":""},{"line_number":823,"context_line":"    Maintains a single background scheduler thread that keeps a min-heap of"}],"source_content_type":"text/x-python","patch_set":11,"id":"1d023876_b4157344","line":820,"range":{"start_line":820,"start_character":32,"end_line":820,"end_character":48},"updated":"2026-07-31 03:56:02.000000000","message":"I commented below about no need to support greenthread executor, if we agree on that then can we just inherited from ThreadPoolExecutor itself and provide the submit_after() capability along with what ThreadPoolExecutor provides.","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"464b0bd9b7c468a5c36c61d193674f0007c4766e","unresolved":false,"context_lines":[{"line_number":817,"context_line":"        )"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":""},{"line_number":820,"context_line":"class DelayedExecutorMixinBase(_futures.Executor, abc.ABC):"},{"line_number":821,"context_line":"    \"\"\"Mixin that adds submit_after(delay, fn, ...) to any Executor subclass."},{"line_number":822,"context_line":""},{"line_number":823,"context_line":"    Maintains a single background scheduler thread that keeps a min-heap of"}],"source_content_type":"text/x-python","patch_set":11,"id":"784c0f9b_f2a07197","line":820,"range":{"start_line":820,"start_character":32,"end_line":820,"end_character":48},"in_reply_to":"1d023876_b4157344","updated":"2026-08-05 01:44:22.000000000","message":"Done","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0f4d4964a06f3b95ad20ce4c89d0069af1454b65","unresolved":true,"context_lines":[{"line_number":1095,"context_line":"        return self._is_scheduler_alive() or super().alive  # type: ignore[misc]"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"    @abc.abstractmethod"},{"line_number":1098,"context_line":"    def _get_condition_object(self) -\u003e threading.Condition:"},{"line_number":1099,"context_line":"        raise NotImplementedError"},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"    @abc.abstractmethod"},{"line_number":1102,"context_line":"    def _get_future_object(self) -\u003e Future[ty.Any]:"},{"line_number":1103,"context_line":"        raise NotImplementedError"},{"line_number":1104,"context_line":""},{"line_number":1105,"context_line":"    @abc.abstractmethod"},{"line_number":1106,"context_line":"    def _start_thread(self, fn: ty.Callable[[], None]) -\u003e ty.Any:"},{"line_number":1107,"context_line":"        raise NotImplementedError"},{"line_number":1108,"context_line":""},{"line_number":1109,"context_line":"    @abc.abstractmethod"},{"line_number":1110,"context_line":"    def _join_thread(self, t: ty.Any) -\u003e None:"},{"line_number":1111,"context_line":"        raise NotImplementedError"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"    @abc.abstractmethod"},{"line_number":1114,"context_line":"    def _is_scheduler_alive(self) -\u003e bool:"},{"line_number":1115,"context_line":"        raise NotImplementedError"},{"line_number":1116,"context_line":""},{"line_number":1117,"context_line":""},{"line_number":1118,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"0641cee7_b1544fe7","line":1115,"range":{"start_line":1098,"start_character":0,"end_line":1115,"end_character":33},"updated":"2026-07-31 03:56:02.000000000","message":"as we are not going to provide greenthread mixin for this, what else this abstract can be used other than native thread? if not then I think we can directly provide a DelayedExecutor ?","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"217e32335daf6c236bec3d670fa0660ef8040073","unresolved":true,"context_lines":[{"line_number":1095,"context_line":"        return self._is_scheduler_alive() or super().alive  # type: ignore[misc]"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"    @abc.abstractmethod"},{"line_number":1098,"context_line":"    def _get_condition_object(self) -\u003e threading.Condition:"},{"line_number":1099,"context_line":"        raise NotImplementedError"},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"    @abc.abstractmethod"},{"line_number":1102,"context_line":"    def _get_future_object(self) -\u003e Future[ty.Any]:"},{"line_number":1103,"context_line":"        raise NotImplementedError"},{"line_number":1104,"context_line":""},{"line_number":1105,"context_line":"    @abc.abstractmethod"},{"line_number":1106,"context_line":"    def _start_thread(self, fn: ty.Callable[[], None]) -\u003e ty.Any:"},{"line_number":1107,"context_line":"        raise NotImplementedError"},{"line_number":1108,"context_line":""},{"line_number":1109,"context_line":"    @abc.abstractmethod"},{"line_number":1110,"context_line":"    def _join_thread(self, t: ty.Any) -\u003e None:"},{"line_number":1111,"context_line":"        raise NotImplementedError"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"    @abc.abstractmethod"},{"line_number":1114,"context_line":"    def _is_scheduler_alive(self) -\u003e bool:"},{"line_number":1115,"context_line":"        raise NotImplementedError"},{"line_number":1116,"context_line":""},{"line_number":1117,"context_line":""},{"line_number":1118,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"32318438_e03aff00","line":1115,"range":{"start_line":1098,"start_character":0,"end_line":1115,"end_character":33},"in_reply_to":"0641cee7_b1544fe7","updated":"2026-08-03 15:13:00.000000000","message":"Agreed on the abstract base — it only earns its keep while both green and native variants exist. Once GreenDelayedExecutorMixin is deprecated alongside GreenThreadPoolExecutor, we can collapse DelayedExecutorMixinBase directly into DelayedExecutorMixin. But I wanted to keep this two implementations separatly","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"464b0bd9b7c468a5c36c61d193674f0007c4766e","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"        return self._is_scheduler_alive() or super().alive  # type: ignore[misc]"},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"    @abc.abstractmethod"},{"line_number":1098,"context_line":"    def _get_condition_object(self) -\u003e threading.Condition:"},{"line_number":1099,"context_line":"        raise NotImplementedError"},{"line_number":1100,"context_line":""},{"line_number":1101,"context_line":"    @abc.abstractmethod"},{"line_number":1102,"context_line":"    def _get_future_object(self) -\u003e Future[ty.Any]:"},{"line_number":1103,"context_line":"        raise NotImplementedError"},{"line_number":1104,"context_line":""},{"line_number":1105,"context_line":"    @abc.abstractmethod"},{"line_number":1106,"context_line":"    def _start_thread(self, fn: ty.Callable[[], None]) -\u003e ty.Any:"},{"line_number":1107,"context_line":"        raise NotImplementedError"},{"line_number":1108,"context_line":""},{"line_number":1109,"context_line":"    @abc.abstractmethod"},{"line_number":1110,"context_line":"    def _join_thread(self, t: ty.Any) -\u003e None:"},{"line_number":1111,"context_line":"        raise NotImplementedError"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"    @abc.abstractmethod"},{"line_number":1114,"context_line":"    def _is_scheduler_alive(self) -\u003e bool:"},{"line_number":1115,"context_line":"        raise NotImplementedError"},{"line_number":1116,"context_line":""},{"line_number":1117,"context_line":""},{"line_number":1118,"context_line":"class GreenDelayedExecutorMixin(DelayedExecutorMixinBase):"}],"source_content_type":"text/x-python","patch_set":11,"id":"c96ea326_1b8e4a8a","line":1115,"range":{"start_line":1098,"start_character":0,"end_line":1115,"end_character":33},"in_reply_to":"32318438_e03aff00","updated":"2026-08-05 01:44:22.000000000","message":"yeah, until we have eventlet here, we can go with abstract.","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"}],"futurist/_green.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    Pool \u003d None"},{"line_number":72,"context_line":"    Queue \u003d None"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def is_monkey_patched(mod):"},{"line_number":75,"context_line":"        return False"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    spawn \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"0cfa0378_bc89dde7","line":74,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":71,"context_line":"    Pool \u003d None"},{"line_number":72,"context_line":"    Queue \u003d None"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def is_monkey_patched(mod):"},{"line_number":75,"context_line":"        return False"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    spawn \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"34335c4f_b71417bd","line":74,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Function is missing a type annotation  [no-untyped-def]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0f4d4964a06f3b95ad20ce4c89d0069af1454b65","unresolved":true,"context_lines":[{"line_number":44,"context_line":"    Pool \u003d greenpool.GreenPool"},{"line_number":45,"context_line":"    Queue \u003d greenqueue.Queue"},{"line_number":46,"context_line":"    is_monkey_patched \u003d greenpatcher.is_monkey_patched"},{"line_number":47,"context_line":"    spawn \u003d greenthread.spawn"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    class GreenThreading:"},{"line_number":50,"context_line":"        @staticmethod"}],"source_content_type":"text/x-python","patch_set":11,"id":"e10a88d9_52ba8fa3","line":47,"range":{"start_line":47,"start_character":0,"end_line":47,"end_character":29},"updated":"2026-07-31 03:56:02.000000000","message":"not sure if anyone going to need it when we will be removing eventlet soon","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"464b0bd9b7c468a5c36c61d193674f0007c4766e","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    Pool \u003d greenpool.GreenPool"},{"line_number":45,"context_line":"    Queue \u003d greenqueue.Queue"},{"line_number":46,"context_line":"    is_monkey_patched \u003d greenpatcher.is_monkey_patched"},{"line_number":47,"context_line":"    spawn \u003d greenthread.spawn"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    class GreenThreading:"},{"line_number":50,"context_line":"        @staticmethod"}],"source_content_type":"text/x-python","patch_set":11,"id":"4c419e17_5360a45e","line":47,"range":{"start_line":47,"start_character":0,"end_line":47,"end_character":29},"in_reply_to":"e10a88d9_52ba8fa3","updated":"2026-08-05 01:44:22.000000000","message":"Done","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"}],"futurist/tests/test_executors.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":441,"context_line":"    def setUp(self):"},{"line_number":442,"context_line":"        super().setUp()"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        class DelayedExecutor(self.mixin_cls, self.executor_cls):"},{"line_number":445,"context_line":"            pass"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        self.executor \u003d DelayedExecutor(max_workers\u003d1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"514b4dcb_df58b76c","line":444,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Name \"self.executor_cls\" is not defined  [name-defined]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1f08f0147d989d30882a7ee4bf99ec7108ace984","unresolved":false,"context_lines":[{"line_number":441,"context_line":"    def setUp(self):"},{"line_number":442,"context_line":"        super().setUp()"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        class DelayedExecutor(self.mixin_cls, self.executor_cls):"},{"line_number":445,"context_line":"            pass"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        self.executor \u003d DelayedExecutor(max_workers\u003d1)"}],"source_content_type":"text/x-python","patch_set":2,"id":"05fa6b44_6639dd87","line":444,"updated":"2026-07-07 16:16:41.000000000","message":"pep8: error: Name \"self.mixin_cls\" is not defined  [name-defined]","commit_id":"ad438f6de5d12cf020de129ffb4e33f6c061e6f3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":441,"context_line":"    def setUp(self):"},{"line_number":442,"context_line":"        super().setUp()"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        class DelayedExecutor(self.mixin_cls, self.executor_cls):"},{"line_number":445,"context_line":"            pass"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        self.executor \u003d DelayedExecutor(max_workers\u003d1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"be738425_90102632","line":444,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Name \"self.executor_cls\" is not defined  [name-defined]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"2465edcad284b402811f4348d0c8e938f47f5bdc","unresolved":false,"context_lines":[{"line_number":441,"context_line":"    def setUp(self):"},{"line_number":442,"context_line":"        super().setUp()"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        class DelayedExecutor(self.mixin_cls, self.executor_cls):"},{"line_number":445,"context_line":"            pass"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        self.executor \u003d DelayedExecutor(max_workers\u003d1)"}],"source_content_type":"text/x-python","patch_set":3,"id":"b6594f9d_22ec80ef","line":444,"updated":"2026-07-13 10:25:29.000000000","message":"pep8: error: Name \"self.mixin_cls\" is not defined  [name-defined]","commit_id":"6888a648efde29e2226469c380acb29204a8e6ac"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"88f5de94161cd067db941e20acba97f3a1a8b8e5","unresolved":false,"context_lines":[{"line_number":441,"context_line":"    def setUp(self):"},{"line_number":442,"context_line":"        super().setUp()"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        class DelayedExecutor(self.mixin_cls, self.executor_cls):"},{"line_number":445,"context_line":"            pass"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        self.executor \u003d DelayedExecutor(max_workers\u003d1)"}],"source_content_type":"text/x-python","patch_set":4,"id":"a431e34c_7c0c2e70","line":444,"updated":"2026-07-15 16:24:08.000000000","message":"pep8: error: Name \"self.executor_cls\" is not defined  [name-defined]","commit_id":"aec4c0c57f634c033fca85165cf875cee291983e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"88f5de94161cd067db941e20acba97f3a1a8b8e5","unresolved":false,"context_lines":[{"line_number":441,"context_line":"    def setUp(self):"},{"line_number":442,"context_line":"        super().setUp()"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        class DelayedExecutor(self.mixin_cls, self.executor_cls):"},{"line_number":445,"context_line":"            pass"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        self.executor \u003d DelayedExecutor(max_workers\u003d1)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7b27b8d5_d7bdcecc","line":444,"updated":"2026-07-15 16:24:08.000000000","message":"pep8: error: Name \"self.mixin_cls\" is not defined  [name-defined]","commit_id":"aec4c0c57f634c033fca85165cf875cee291983e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"a8e4df82895167764d8617ca072806a9fc2e3971","unresolved":false,"context_lines":[{"line_number":441,"context_line":"    def setUp(self):"},{"line_number":442,"context_line":"        super().setUp()"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        class DelayedExecutor(self.mixin_cls, self.executor_cls):"},{"line_number":445,"context_line":"            pass"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        self.executor \u003d DelayedExecutor(max_workers\u003d1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"6670e2ba_29512993","line":444,"updated":"2026-07-16 16:39:35.000000000","message":"pep8: error: Name \"self.executor_cls\" is not defined  [name-defined]","commit_id":"cfb82c87a1d4b25327a7982d7ac8f2fa63f6169d"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"a8e4df82895167764d8617ca072806a9fc2e3971","unresolved":false,"context_lines":[{"line_number":441,"context_line":"    def setUp(self):"},{"line_number":442,"context_line":"        super().setUp()"},{"line_number":443,"context_line":""},{"line_number":444,"context_line":"        class DelayedExecutor(self.mixin_cls, self.executor_cls):"},{"line_number":445,"context_line":"            pass"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        self.executor \u003d DelayedExecutor(max_workers\u003d1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"312d105e_843dbf2a","line":444,"updated":"2026-07-16 16:39:35.000000000","message":"pep8: error: Name \"self.mixin_cls\" is not defined  [name-defined]","commit_id":"cfb82c87a1d4b25327a7982d7ac8f2fa63f6169d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"605be9f42ef179e5c8915d2ef3a459b770bb8314","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"dcd6b99e_5d27cc73","line":612,"updated":"2026-07-24 17:55:13.000000000","message":"we are missing test coverage for the task cancellation logic during shutdown","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"e90105dfc5671c7d2ea707a2a2d54efdecfa250e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"1d845e76_ec39d571","line":612,"in_reply_to":"dcd6b99e_5d27cc73","updated":"2026-07-29 08:07:23.000000000","message":"Done","commit_id":"a043d1b4f9e0332c66a7e830ae1d3e3b9b2c29f7"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0f4d4964a06f3b95ad20ce4c89d0069af1454b65","unresolved":true,"context_lines":[{"line_number":505,"context_line":"    def test_multiple_tasks_execute_in_delay_order(self):"},{"line_number":506,"context_line":"        \"\"\"Three tasks with distinct delays finish in deadline order.\"\"\""},{"line_number":507,"context_line":"        # Submit in non-deadline order to prove sorting, not submission order."},{"line_number":508,"context_line":"        task_medium \u003d self.executor.submit_after(0.2, returns_clock)"},{"line_number":509,"context_line":"        task_long \u003d self.executor.submit_after(0.3, returns_clock)"},{"line_number":510,"context_line":"        task_short \u003d self.executor.submit_after(0.1, returns_clock)"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        t_short \u003d task_short.result()"}],"source_content_type":"text/x-python","patch_set":11,"id":"cf2fee32_805a3559","line":509,"range":{"start_line":508,"start_character":0,"end_line":509,"end_character":66},"updated":"2026-07-31 03:56:02.000000000","message":"as self.executor is with max_worker\u003d1, this does not actually make sure if delay time submitting the task_medium before task_long or the submission order as pool is empty after task_short.\n\ncan we submit task_long first and then task_medium so that we know task_medium even submitted later than task_long is picked first.","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"217e32335daf6c236bec3d670fa0660ef8040073","unresolved":false,"context_lines":[{"line_number":505,"context_line":"    def test_multiple_tasks_execute_in_delay_order(self):"},{"line_number":506,"context_line":"        \"\"\"Three tasks with distinct delays finish in deadline order.\"\"\""},{"line_number":507,"context_line":"        # Submit in non-deadline order to prove sorting, not submission order."},{"line_number":508,"context_line":"        task_medium \u003d self.executor.submit_after(0.2, returns_clock)"},{"line_number":509,"context_line":"        task_long \u003d self.executor.submit_after(0.3, returns_clock)"},{"line_number":510,"context_line":"        task_short \u003d self.executor.submit_after(0.1, returns_clock)"},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"        t_short \u003d task_short.result()"}],"source_content_type":"text/x-python","patch_set":11,"id":"375b8ae6_cbe6bf18","line":509,"range":{"start_line":508,"start_character":0,"end_line":509,"end_character":66},"in_reply_to":"cf2fee32_805a3559","updated":"2026-08-03 15:13:00.000000000","message":"Done","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0f4d4964a06f3b95ad20ce4c89d0069af1454b65","unresolved":true,"context_lines":[{"line_number":514,"context_line":"        t_long \u003d task_long.result()"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        self.assertLess(t_short, t_medium)"},{"line_number":517,"context_line":"        self.assertLess(t_medium, t_long)"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    def test_submit_after_raises_after_shutdown(self):"},{"line_number":520,"context_line":"        \"\"\"submit_after raises RuntimeError once the executor is shut down.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"84ec548e_dbf322a1","line":517,"range":{"start_line":517,"start_character":40,"end_line":517,"end_character":41},"updated":"2026-07-31 03:56:02.000000000","message":"also, can we add a test with executor max_worker\u003e1 and see if task is delay to run even pool is empty","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"217e32335daf6c236bec3d670fa0660ef8040073","unresolved":false,"context_lines":[{"line_number":514,"context_line":"        t_long \u003d task_long.result()"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"        self.assertLess(t_short, t_medium)"},{"line_number":517,"context_line":"        self.assertLess(t_medium, t_long)"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":"    def test_submit_after_raises_after_shutdown(self):"},{"line_number":520,"context_line":"        \"\"\"submit_after raises RuntimeError once the executor is shut down.\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"bea96c75_f18ea79e","line":517,"range":{"start_line":517,"start_character":40,"end_line":517,"end_character":41},"in_reply_to":"84ec548e_dbf322a1","updated":"2026-08-03 15:13:00.000000000","message":"Done","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a2e70b95bb7a84fe6b0d2ba08862db0ed8e5e7b9","unresolved":true,"context_lines":[{"line_number":649,"context_line":"        quick \u003d self.executor.submit_after(0.1, returns_one)"},{"line_number":650,"context_line":"        slow \u003d self.executor.submit_after(100.0, fn)"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"        # Cancel slow while the scheduler is busy waiting on quick\u0027s deadline."},{"line_number":653,"context_line":"        # future.cancel() does NOT notify _queue_changed, so the scheduler"},{"line_number":654,"context_line":"        # is not woken; slow simply sits in the queue as CANCELLED."},{"line_number":655,"context_line":"        self.assertTrue(slow.cancel())"}],"source_content_type":"text/x-python","patch_set":11,"id":"7cd84d18_fab027bd","line":652,"updated":"2026-07-31 08:56:24.000000000","message":"this is probably racy as the first task has a 0.1 delay, so if for some reason the test is slower than that, then the scheduler will be waiting for the second task when it is cancelled not the first. So this might not test the scenario it declares. I\u0027m not sure what we can do to stabilize it","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"217e32335daf6c236bec3d670fa0660ef8040073","unresolved":false,"context_lines":[{"line_number":649,"context_line":"        quick \u003d self.executor.submit_after(0.1, returns_one)"},{"line_number":650,"context_line":"        slow \u003d self.executor.submit_after(100.0, fn)"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"        # Cancel slow while the scheduler is busy waiting on quick\u0027s deadline."},{"line_number":653,"context_line":"        # future.cancel() does NOT notify _queue_changed, so the scheduler"},{"line_number":654,"context_line":"        # is not woken; slow simply sits in the queue as CANCELLED."},{"line_number":655,"context_line":"        self.assertTrue(slow.cancel())"}],"source_content_type":"text/x-python","patch_set":11,"id":"7abd2d7d_b3202ed8","line":652,"in_reply_to":"7cd84d18_fab027bd","updated":"2026-08-03 15:13:00.000000000","message":"Done","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a2e70b95bb7a84fe6b0d2ba08862db0ed8e5e7b9","unresolved":true,"context_lines":[{"line_number":658,"context_line":"        self.assertEqual(1, quick.result(timeout\u003d5))"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"        # Give the scheduler one more cycle to process the cancelled slow task."},{"line_number":661,"context_line":"        time.sleep(0.1)"},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"        self.assertTrue(slow.cancelled())"},{"line_number":664,"context_line":"        self.assertEqual([], call_count, \"slow callable must not have run\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"1dff1eef_62b332fc","line":661,"updated":"2026-07-31 08:56:24.000000000","message":"instead of sleep that can be racy, can we just shutdown the executor with wait\u003dtrue and then assert that the slow task is not run as it was cancelled?","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"217e32335daf6c236bec3d670fa0660ef8040073","unresolved":false,"context_lines":[{"line_number":658,"context_line":"        self.assertEqual(1, quick.result(timeout\u003d5))"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"        # Give the scheduler one more cycle to process the cancelled slow task."},{"line_number":661,"context_line":"        time.sleep(0.1)"},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"        self.assertTrue(slow.cancelled())"},{"line_number":664,"context_line":"        self.assertEqual([], call_count, \"slow callable must not have run\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffa4780c_3a7ac1c9","line":661,"in_reply_to":"1dff1eef_62b332fc","updated":"2026-08-03 15:13:00.000000000","message":"Done","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"a2e70b95bb7a84fe6b0d2ba08862db0ed8e5e7b9","unresolved":true,"context_lines":[{"line_number":700,"context_line":""},{"line_number":701,"context_line":"        self.assertEqual(1, sentinel_future.result(timeout\u003d5))"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"        # At this point slow_future.future is in RUNNING state; it is no"},{"line_number":704,"context_line":"        # longer in the delay queue, so cancel_futures\u003dTrue has no effect."},{"line_number":705,"context_line":"        executor.shutdown(cancel_futures\u003dTrue, wait\u003dTrue)"},{"line_number":706,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"248e0da3_29006d65","line":703,"updated":"2026-07-31 08:56:24.000000000","message":"can we assert that state?","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"217e32335daf6c236bec3d670fa0660ef8040073","unresolved":false,"context_lines":[{"line_number":700,"context_line":""},{"line_number":701,"context_line":"        self.assertEqual(1, sentinel_future.result(timeout\u003d5))"},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"        # At this point slow_future.future is in RUNNING state; it is no"},{"line_number":704,"context_line":"        # longer in the delay queue, so cancel_futures\u003dTrue has no effect."},{"line_number":705,"context_line":"        executor.shutdown(cancel_futures\u003dTrue, wait\u003dTrue)"},{"line_number":706,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"064307ea_b2cb7238","line":703,"in_reply_to":"248e0da3_29006d65","updated":"2026-08-03 15:13:00.000000000","message":"Done","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"603c6da6c7d35a704752cc0ef86b4ebe8c6fff8d","unresolved":true,"context_lines":[{"line_number":721,"context_line":"        # GreenFuture objects whose .result() yields to the eventlet hub,"},{"line_number":722,"context_line":"        # so the test and the worker interleave correctly without"},{"line_number":723,"context_line":"        # time.sleep() blocking the entire event loop."},{"line_number":724,"context_line":"        running_signal \u003d executor._get_future_object()"},{"line_number":725,"context_line":"        hold_signal \u003d executor._get_future_object()"},{"line_number":726,"context_line":""},{"line_number":727,"context_line":"        # Release hold_signal in cleanup so the worker is never left dangling"},{"line_number":728,"context_line":"        # if the test fails before the explicit set_result() call below."},{"line_number":729,"context_line":"        def _release_hold():"},{"line_number":730,"context_line":"            try:"},{"line_number":731,"context_line":"                hold_signal.set_result(None)"},{"line_number":732,"context_line":"            except Exception:"},{"line_number":733,"context_line":"                pass  # already set by the test body"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"        self.addCleanup(_release_hold)"},{"line_number":736,"context_line":""},{"line_number":737,"context_line":"        def controlled_task():"},{"line_number":738,"context_line":"            running_signal.set_result(True)  # signal: task is now running"},{"line_number":739,"context_line":"            hold_signal.result(timeout\u003d10)  # park until the test proceeds"},{"line_number":740,"context_line":""},{"line_number":741,"context_line":"        slow_future \u003d executor.submit_after(0.0, controlled_task)"},{"line_number":742,"context_line":"        # Block until controlled_task has actually started executing.  In the"}],"source_content_type":"text/x-python","patch_set":14,"id":"a4f951e6_74ad890e","line":739,"range":{"start_line":724,"start_character":0,"end_line":739,"end_character":74},"updated":"2026-08-06 09:16:44.000000000","message":"we don\u0027t need a future objects for hits. Both running and hold can be a threading.Event.\n//later\nIs it a future because this test needs to run with eventlet without monkey patching and therefore threading.Event won\u0027t work as that is not good for an non-monkey patched eventlet env?","commit_id":"350e39d788a04fdbd38529564a0f44f3e395f80f"}],"futurist/tests/test_waiters.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0f4d4964a06f3b95ad20ce4c89d0069af1454b65","unresolved":true,"context_lines":[{"line_number":72,"context_line":"            \u0027process\u0027,"},{"line_number":73,"context_line":"            {"},{"line_number":74,"context_line":"                \u0027executor_cls\u0027: futurist.ProcessPoolExecutor,"},{"line_number":75,"context_line":"                \u0027executor_kwargs\u0027: {"},{"line_number":76,"context_line":"                    \u0027mp_context\u0027: multiprocessing.get_context(\u0027spawn\u0027),"},{"line_number":77,"context_line":"                },"},{"line_number":78,"context_line":"                \u0027use_eventlet_sleep\u0027: False,"},{"line_number":79,"context_line":"            },"},{"line_number":80,"context_line":"        ),"}],"source_content_type":"text/x-python","patch_set":11,"id":"be5cf4e6_9715970f","line":77,"range":{"start_line":75,"start_character":0,"end_line":77,"end_character":18},"updated":"2026-07-31 03:56:02.000000000","message":"did not get why we need this change? I am not seeing any change for ProcessPoolExecutor","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"217e32335daf6c236bec3d670fa0660ef8040073","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            \u0027process\u0027,"},{"line_number":73,"context_line":"            {"},{"line_number":74,"context_line":"                \u0027executor_cls\u0027: futurist.ProcessPoolExecutor,"},{"line_number":75,"context_line":"                \u0027executor_kwargs\u0027: {"},{"line_number":76,"context_line":"                    \u0027mp_context\u0027: multiprocessing.get_context(\u0027spawn\u0027),"},{"line_number":77,"context_line":"                },"},{"line_number":78,"context_line":"                \u0027use_eventlet_sleep\u0027: False,"},{"line_number":79,"context_line":"            },"},{"line_number":80,"context_line":"        ),"}],"source_content_type":"text/x-python","patch_set":11,"id":"6bff8db9_fcb4971c","line":77,"range":{"start_line":75,"start_character":0,"end_line":77,"end_character":18},"in_reply_to":"be5cf4e6_9715970f","updated":"2026-08-03 15:13:00.000000000","message":"Done","commit_id":"428afe9266bd8458cb0ceaa3a4136050d4872adb"}],"releasenotes/notes/delayed-executor-mixin-a4f3c8d1b9e20571.yaml":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"c815772e3d5538ad765b192b607f55e67369cbe4","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    call accepts its own *delay* value, so different tasks submitted to the"},{"line_number":19,"context_line":"    same executor can have different delays."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    Example::"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"        class DelayedThreadExecutor("},{"line_number":24,"context_line":"            futurist.DelayedExecutorMixin,"},{"line_number":25,"context_line":"            futurist.ThreadPoolExecutor,"},{"line_number":26,"context_line":"        ):"},{"line_number":27,"context_line":"            pass"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"        executor \u003d DelayedThreadExecutor(max_workers\u003d4)"},{"line_number":30,"context_line":"        fut \u003d executor.submit_after(0.5, my_func, arg1, kwarg\u003dval)"},{"line_number":31,"context_line":"        result \u003d fut.result()"},{"line_number":32,"context_line":"        executor.shutdown()"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"fc0450a1_5d87594e","line":32,"range":{"start_line":21,"start_character":0,"end_line":32,"end_character":27},"updated":"2026-08-06 18:32:47.000000000","message":"we have example doc now which can be referenced here but its fine.","commit_id":"350e39d788a04fdbd38529564a0f44f3e395f80f"}]}
