)]}'
{".zuul.yaml":[{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"5d7eb7e36417c0df8216f0be3b5fe24a1880103e","unresolved":true,"context_lines":[{"line_number":53,"context_line":"    vars:"},{"line_number":54,"context_line":"      tox_environment:"},{"line_number":55,"context_line":"        OSLO_LOG_TEST_EVENTLET: 1"},{"line_number":56,"context_line":"        EVENTLET_HUB: asyncio"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"- project:"},{"line_number":59,"context_line":"    check:"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"392f9a87_dc874b94","line":56,"updated":"2025-01-24 20:10:37.000000000","message":"is it possible to add a test that verifies that this actually uses the new code? like how can we be sure that this job doesn\u0027t just run the same thing as the previous one?","commit_id":"9fc2db5bc0a68f255b60720ffbbae56a16c77980"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"8fad28976d265ee83e27fb05be2910253dcfc08e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"183354bb_69796830","updated":"2024-12-16 14:20:34.000000000","message":"Do you mind if we attach this gerrit review to the \"eventlet-removal\" gerrit topic?\nhttps://review.opendev.org/q/topic:%22eventlet-removal%22","commit_id":"f1d11538eae5b43604748e7a6581aeb933d110a2"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"2dcd1fcfc3bf6f0f3cf984d982ce799b5bb00d0f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"13b93bf6_b5eb898d","updated":"2024-12-18 13:34:35.000000000","message":"The gates of the depends-on patch are green since yesterday, so lets retry the jobs of this one.","commit_id":"f1d11538eae5b43604748e7a6581aeb933d110a2"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"e7e149c021a3fa085c85c92e444170ed311a4871","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7c4e14a4_154da4df","updated":"2024-12-18 13:33:44.000000000","message":"recheck","commit_id":"f1d11538eae5b43604748e7a6581aeb933d110a2"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"1043b868e761275207e9beb34b46db8b3b850b12","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8dace000_2cbac592","updated":"2024-12-16 14:19:26.000000000","message":"recheck\n\nAs this morning I updated the requirements bump, and so your depends-on https://review.opendev.org/c/openstack/requirements/+/933257","commit_id":"f1d11538eae5b43604748e7a6581aeb933d110a2"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"6af7e6d2a191fab6e660e129adf56e192618000e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"d6eaeafe_b597c585","updated":"2025-01-02 21:03:27.000000000","message":"not a full review, just two questions","commit_id":"d8599b648bb4d1f7a609a68550c7867402bdf7ed"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0159cc551d96392aad526c4145e51ed1b4b04e32","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"b3d1bd60_525cbff4","updated":"2025-01-14 15:07:14.000000000","message":"This is a significant change, I\u0027d suggest to add a release note (https://docs.openstack.org/reno/latest/user/usage.html)","commit_id":"61305fd40230ed6aebdf58659c37008c566f1191"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"8e59f2fb86950009e6a6d13ce8cf096aca311660","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"4241e7cb_7d64c373","updated":"2025-03-13 10:56:35.000000000","message":"I\u0027m ok with that version.\nMaybe the test suggested by Jens could be added with a follow up patch.\n@JayF @itamar@pythonspeed.com thoughts?","commit_id":"9fc2db5bc0a68f255b60720ffbbae56a16c77980"},{"author":{"_account_id":36603,"name":"Itamar Turner-Trauring","display_name":"Itamar Turner-Trauring","email":"itamar@pythonspeed.com","username":"itamarst2"},"change_message_id":"6a5ba71c89962c8c728dbd2c7a0f3b5d15491d84","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"6a483a3b_967d0b58","in_reply_to":"4241e7cb_7d64c373","updated":"2025-03-25 14:02:40.000000000","message":"It\u0027s pretty difficult to have an automated test for _everything_; how can you trust the automated test? Maybe you need an automated test for the automated test for the automated test...\n\nIn this particular case, the abstraction layers don\u0027t work very well for this sort of testing.\n\nBut, to address the concern, I added a print statement in the test run that outputs which hub is being used. This will allow at least looking at Zuul logs and manually validating that the expected hub is being used.","commit_id":"9fc2db5bc0a68f255b60720ffbbae56a16c77980"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"1e95f358f7ba9ce110efca66fb5a89611c656e56","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"b672b7de_609e3a9f","in_reply_to":"6a483a3b_967d0b58","updated":"2025-04-10 09:32:39.000000000","message":"Thank you Itamar.","commit_id":"9fc2db5bc0a68f255b60720ffbbae56a16c77980"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"39530197320f167debca078344066525f84b1342","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"f91057e8_23821737","updated":"2025-05-22 09:54:31.000000000","message":"@jay@jvf.cc: Do you mind solving the conflict? This way we will approve it again and merge it.","commit_id":"f9c67c6bf7815ac99eaadad163e7bbd0c965b696"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"ecce8a6e11c6f9ecbe1eaf076744292170bd1cff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"252e6b1b_4722a5e2","updated":"2025-05-05 11:53:43.000000000","message":"Current patch set LGTM","commit_id":"f9c67c6bf7815ac99eaadad163e7bbd0c965b696"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"c95769912126d4ec8db4ddae54a03664991fa480","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7cfe73f5_1f45e49b","in_reply_to":"f91057e8_23821737","updated":"2025-05-23 16:23:39.000000000","message":"It\u0027s solved, thanks!","commit_id":"f9c67c6bf7815ac99eaadad163e7bbd0c965b696"}],"oslo_log/pipe_mutex.py":[{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"6af7e6d2a191fab6e660e129adf56e192618000e","unresolved":true,"context_lines":[{"line_number":28,"context_line":"import eventlet.patcher"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# We want the blocking APIs, because we set file descriptors to non-blocking."},{"line_number":31,"context_line":"os \u003d eventlet.patcher.original(\"os\")"},{"line_number":32,"context_line":"# Used to communicate between real threads:"},{"line_number":33,"context_line":"SimpleQueue \u003d eventlet.patcher.original(\"queue\").SimpleQueue"},{"line_number":34,"context_line":"# Real OS-level threads:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9796b942_cfbb5105","line":31,"updated":"2025-01-02 21:03:27.000000000","message":"duplicate of L38?","commit_id":"d8599b648bb4d1f7a609a68550c7867402bdf7ed"},{"author":{"_account_id":36603,"name":"Itamar Turner-Trauring","display_name":"Itamar Turner-Trauring","email":"itamar@pythonspeed.com","username":"itamarst2"},"change_message_id":"ac7fdc4cdd41b94a9370314a9c431690e0b236d3","unresolved":false,"context_lines":[{"line_number":28,"context_line":"import eventlet.patcher"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"# We want the blocking APIs, because we set file descriptors to non-blocking."},{"line_number":31,"context_line":"os \u003d eventlet.patcher.original(\"os\")"},{"line_number":32,"context_line":"# Used to communicate between real threads:"},{"line_number":33,"context_line":"SimpleQueue \u003d eventlet.patcher.original(\"queue\").SimpleQueue"},{"line_number":34,"context_line":"# Real OS-level threads:"}],"source_content_type":"text/x-python","patch_set":3,"id":"43da2a2d_41e2006d","line":31,"in_reply_to":"9796b942_cfbb5105","updated":"2025-01-03 15:06:05.000000000","message":"Done","commit_id":"d8599b648bb4d1f7a609a68550c7867402bdf7ed"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"6af7e6d2a191fab6e660e129adf56e192618000e","unresolved":true,"context_lines":[{"line_number":261,"context_line":"    )"},{"line_number":262,"context_line":"    if (major, minor, patch) \u003c (0, 38, 2):"},{"line_number":263,"context_line":"        raise RuntimeError("},{"line_number":264,"context_line":"            \"eventlet 0.38.2 or later is required when using asyncio hub\""},{"line_number":265,"context_line":"        )"},{"line_number":266,"context_line":"    PipeMutex \u003d _AsyncioMutex"},{"line_number":267,"context_line":"else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9eef5c1a_7ccdbfea","line":264,"updated":"2025-01-02 21:03:27.000000000","message":"is this really necessary? it may be true for the versions on pypi, but e.g. debian has backported some parts of 0.38.2 into older packaging","commit_id":"d8599b648bb4d1f7a609a68550c7867402bdf7ed"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"9081cf0a61dc46e38843bcba9fd2cb77a6ea48ca","unresolved":true,"context_lines":[{"line_number":261,"context_line":"    )"},{"line_number":262,"context_line":"    if (major, minor, patch) \u003c (0, 38, 2):"},{"line_number":263,"context_line":"        raise RuntimeError("},{"line_number":264,"context_line":"            \"eventlet 0.38.2 or later is required when using asyncio hub\""},{"line_number":265,"context_line":"        )"},{"line_number":266,"context_line":"    PipeMutex \u003d _AsyncioMutex"},{"line_number":267,"context_line":"else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7c836c7b_1c806274","line":264,"in_reply_to":"0f2edfde_5ad62a55","updated":"2025-01-08 18:36:57.000000000","message":"Maybe a middle ground would be printing a very angry message on startup if the version is too old?","commit_id":"d8599b648bb4d1f7a609a68550c7867402bdf7ed"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"230674472d616d0f9d54877defa04f7b47fada3f","unresolved":false,"context_lines":[{"line_number":261,"context_line":"    )"},{"line_number":262,"context_line":"    if (major, minor, patch) \u003c (0, 38, 2):"},{"line_number":263,"context_line":"        raise RuntimeError("},{"line_number":264,"context_line":"            \"eventlet 0.38.2 or later is required when using asyncio hub\""},{"line_number":265,"context_line":"        )"},{"line_number":266,"context_line":"    PipeMutex \u003d _AsyncioMutex"},{"line_number":267,"context_line":"else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"a9dd4630_e631c5e5","line":264,"in_reply_to":"7c836c7b_1c806274","updated":"2025-01-09 11:02:37.000000000","message":"Not sure, who reads logs? ;-) \n\nso I don\u0027t see this as blocking, I just wanted to see whether there might be some easy functional check that could used instead of looking at the version numbers, but if there isn\u0027t, let\u0027s stick to this, distros can still patch this away if needed","commit_id":"d8599b648bb4d1f7a609a68550c7867402bdf7ed"},{"author":{"_account_id":36603,"name":"Itamar Turner-Trauring","display_name":"Itamar Turner-Trauring","email":"itamar@pythonspeed.com","username":"itamarst2"},"change_message_id":"152534a1ec2bb021d8161d8b9e2f996785667014","unresolved":true,"context_lines":[{"line_number":261,"context_line":"    )"},{"line_number":262,"context_line":"    if (major, minor, patch) \u003c (0, 38, 2):"},{"line_number":263,"context_line":"        raise RuntimeError("},{"line_number":264,"context_line":"            \"eventlet 0.38.2 or later is required when using asyncio hub\""},{"line_number":265,"context_line":"        )"},{"line_number":266,"context_line":"    PipeMutex \u003d _AsyncioMutex"},{"line_number":267,"context_line":"else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"0f2edfde_5ad62a55","line":264,"in_reply_to":"9eef5c1a_7ccdbfea","updated":"2025-01-02 22:14:44.000000000","message":"The issue is that with older versions (ignoring backporting for now) it will sometimes work ... until it breaks horribly. It\u0027s not like it fails on import. So I wanted a way to ensure it\u0027s not using buggy versions.\n\nThe specific fixes are spread across multiple files in eventlet (hubs/asyncio.py and patcher.py) so one would have to make sure they\u0027re all backported...","commit_id":"d8599b648bb4d1f7a609a68550c7867402bdf7ed"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a657979906169aa60eead08831c55edcdd89dc0b","unresolved":true,"context_lines":[{"line_number":57,"context_line":"            self.recursion_depth +\u003d 1"},{"line_number":58,"context_line":"            return True"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        return self._acquire_eventlet(blocking, current_greenthread_id)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def release(self):"},{"line_number":63,"context_line":"        \"\"\"Release the mutex.\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"46883c55_42a7250f","line":60,"updated":"2025-04-10 10:14:20.000000000","message":"Any reason we need the `_eventlet` suffix? I don\u0027t see a \"non-eventlet\" equivalent\n\n```suggestion\n        return self._acquire(blocking, current_greenthread_id)\n```\n\n*Later:* Actually, I think this should probably be a abstract method with separate definitions in the two base classes.","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a657979906169aa60eead08831c55edcdd89dc0b","unresolved":true,"context_lines":[{"line_number":70,"context_line":"            return"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.owner \u003d None"},{"line_number":73,"context_line":"        self._release_eventlet()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def close(self):"},{"line_number":76,"context_line":"        \"\"\"Close the mutex."}],"source_content_type":"text/x-python","patch_set":7,"id":"2e4e1ecd_4d46583b","line":73,"range":{"start_line":73,"start_character":13,"end_line":73,"end_character":30},"updated":"2025-04-10 10:14:20.000000000","message":"Same as above\n\n```suggestion\n        self._release()\n```","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a657979906169aa60eead08831c55edcdd89dc0b","unresolved":true,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        self.owner \u003d None"},{"line_number":73,"context_line":"        self._release_eventlet()"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def close(self):"},{"line_number":76,"context_line":"        \"\"\"Close the mutex."},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"749fa280_1a548793","line":74,"updated":"2025-04-10 10:14:20.000000000","message":"Can we make this an abstract base class and define abstract methods for both `_release` and `_acquire`?","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a657979906169aa60eead08831c55edcdd89dc0b","unresolved":true,"context_lines":[{"line_number":91,"context_line":"    Related eventlet bug: https://github.com/eventlet/eventlet/issues/432"},{"line_number":92,"context_line":"    \"\"\""},{"line_number":93,"context_line":"    def __init__(self):"},{"line_number":94,"context_line":"        _BaseMutex.__init__(self)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        self.rfd, self.wfd \u003d os.pipe()"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9e132304_2f1cf6ca","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":18},"updated":"2025-04-10 10:14:20.000000000","message":"Any reason we don\u0027t use `super()` here?\n\n\n```suggestion\n        super().__init__()\n```","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":36603,"name":"Itamar Turner-Trauring","display_name":"Itamar Turner-Trauring","email":"itamar@pythonspeed.com","username":"itamarst2"},"change_message_id":"2d9c99d7e5b4d3ea193feb8200b376eda7da865d","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    Related eventlet bug: https://github.com/eventlet/eventlet/issues/432"},{"line_number":92,"context_line":"    \"\"\""},{"line_number":93,"context_line":"    def __init__(self):"},{"line_number":94,"context_line":"        _BaseMutex.__init__(self)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        self.rfd, self.wfd \u003d os.pipe()"},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3b89f061_c4878f17","line":94,"range":{"start_line":94,"start_character":8,"end_line":94,"end_character":18},"in_reply_to":"9e132304_2f1cf6ca","updated":"2025-05-01 17:30:19.000000000","message":"Done","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a657979906169aa60eead08831c55edcdd89dc0b","unresolved":true,"context_lines":[{"line_number":153,"context_line":"        if self.rfd is not None:"},{"line_number":154,"context_line":"            os.close(self.rfd)"},{"line_number":155,"context_line":"            self.rfd \u003d None"},{"line_number":156,"context_line":"        _BaseMutex.close(self)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def __del__(self):"},{"line_number":159,"context_line":"        # We need this so we don\u0027t leak file descriptors. Otherwise, if you"}],"source_content_type":"text/x-python","patch_set":7,"id":"8ae3a9e8_ef6c3af7","line":156,"range":{"start_line":156,"start_character":8,"end_line":156,"end_character":18},"updated":"2025-04-10 10:14:20.000000000","message":"```suggestion\n        super.close()\n```","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":36603,"name":"Itamar Turner-Trauring","display_name":"Itamar Turner-Trauring","email":"itamar@pythonspeed.com","username":"itamarst2"},"change_message_id":"2d9c99d7e5b4d3ea193feb8200b376eda7da865d","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        if self.rfd is not None:"},{"line_number":154,"context_line":"            os.close(self.rfd)"},{"line_number":155,"context_line":"            self.rfd \u003d None"},{"line_number":156,"context_line":"        _BaseMutex.close(self)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def __del__(self):"},{"line_number":159,"context_line":"        # We need this so we don\u0027t leak file descriptors. Otherwise, if you"}],"source_content_type":"text/x-python","patch_set":7,"id":"168d2d2c_aa433868","line":156,"range":{"start_line":156,"start_character":8,"end_line":156,"end_character":18},"in_reply_to":"8ae3a9e8_ef6c3af7","updated":"2025-05-01 17:30:19.000000000","message":"Done","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a657979906169aa60eead08831c55edcdd89dc0b","unresolved":true,"context_lines":[{"line_number":189,"context_line":"           thread (each OS thread running greenlets has its own asyncio loop)"},{"line_number":190,"context_line":"    \"\"\""},{"line_number":191,"context_line":"    def __init__(self):"},{"line_number":192,"context_line":"        _BaseMutex.__init__(self)"},{"line_number":193,"context_line":"        self._asyncio_lock \u003d asyncio.Lock()"},{"line_number":194,"context_line":"        self._threading_lock \u003d threading.RLock()"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"17f40681_8ad073be","line":192,"updated":"2025-04-10 10:14:20.000000000","message":"```suggestion\n        super.__init__()\n```","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":36603,"name":"Itamar Turner-Trauring","display_name":"Itamar Turner-Trauring","email":"itamar@pythonspeed.com","username":"itamarst2"},"change_message_id":"2d9c99d7e5b4d3ea193feb8200b376eda7da865d","unresolved":false,"context_lines":[{"line_number":189,"context_line":"           thread (each OS thread running greenlets has its own asyncio loop)"},{"line_number":190,"context_line":"    \"\"\""},{"line_number":191,"context_line":"    def __init__(self):"},{"line_number":192,"context_line":"        _BaseMutex.__init__(self)"},{"line_number":193,"context_line":"        self._asyncio_lock \u003d asyncio.Lock()"},{"line_number":194,"context_line":"        self._threading_lock \u003d threading.RLock()"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"e02df9e3_b0b57df3","line":192,"in_reply_to":"17f40681_8ad073be","updated":"2025-05-01 17:30:19.000000000","message":"I did all these.","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a657979906169aa60eead08831c55edcdd89dc0b","unresolved":true,"context_lines":[{"line_number":228,"context_line":"            # on a short but not too-short sleep."},{"line_number":229,"context_line":"            eventlet.sleep(0.0001)"},{"line_number":230,"context_line":"        # Then, do the eventlet locking:"},{"line_number":231,"context_line":"        return _BaseMutex.acquire(self, blocking\u003dblocking)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    # Preserve documentation, without copy/pasting:"},{"line_number":234,"context_line":"    acquire.__doc__ \u003d _BaseMutex.acquire.__doc__"}],"source_content_type":"text/x-python","patch_set":7,"id":"ccc3b730_f24943f3","line":231,"updated":"2025-04-10 10:14:20.000000000","message":"So the call pattern for this is:\n\n```\n_AsyncioMutex.acquire\n  _BaseMutex.acquire\n    _AsyncioMutex._aquire_eventlet\n```\n\nand the only thing in `_BaseMutex.acquire` is these 4 lines:\n\n```\ncurrent_greenthread_id \u003d id(eventlet.greenthread.getcurrent())\nif self.owner \u003d\u003d current_greenthread_id:\n    self.recursion_depth +\u003d 1\n    return True\n    \nreturn self._acquire_eventlet(blocking, current_greenthread_id)\n```\n\nIMO it would be clearer if you just copied those lines here and fold in `_aquire_eventlet` too.","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":36603,"name":"Itamar Turner-Trauring","display_name":"Itamar Turner-Trauring","email":"itamar@pythonspeed.com","username":"itamarst2"},"change_message_id":"2d9c99d7e5b4d3ea193feb8200b376eda7da865d","unresolved":true,"context_lines":[{"line_number":228,"context_line":"            # on a short but not too-short sleep."},{"line_number":229,"context_line":"            eventlet.sleep(0.0001)"},{"line_number":230,"context_line":"        # Then, do the eventlet locking:"},{"line_number":231,"context_line":"        return _BaseMutex.acquire(self, blocking\u003dblocking)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    # Preserve documentation, without copy/pasting:"},{"line_number":234,"context_line":"    acquire.__doc__ \u003d _BaseMutex.acquire.__doc__"}],"source_content_type":"text/x-python","patch_set":7,"id":"18f3b9b8_adeacf3a","line":231,"in_reply_to":"ccc3b730_f24943f3","updated":"2025-05-01 17:30:19.000000000","message":"If we go down this route, I would suggest copy/pasting all the code from the base class and just getting rid of it, otherwise you have implementation smeared across multiple classes.\n\nMore broadly, though: this is, as you say, internal code. And more importantly, it\u0027s horrible horrible bug fix for using eventlet, and the goal is to rip out eventlet, so this is fundamentally just polishing a turd. The ideal is for this code to get deleted ASAP, by continuing work on ripping out eventlet... so I would say just leave it as is, none of is this important for code people aren\u0027t using externally anyway.","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a657979906169aa60eead08831c55edcdd89dc0b","unresolved":true,"context_lines":[{"line_number":231,"context_line":"        return _BaseMutex.acquire(self, blocking\u003dblocking)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    # Preserve documentation, without copy/pasting:"},{"line_number":234,"context_line":"    acquire.__doc__ \u003d _BaseMutex.acquire.__doc__"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def _release_eventlet(self):"},{"line_number":237,"context_line":"        self._asyncio_lock.release()"}],"source_content_type":"text/x-python","patch_set":7,"id":"322f4b1f_9c1cd3e7","line":234,"updated":"2025-04-10 10:14:20.000000000","message":"Just copy-paste the definition, IMO.","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"89ea33ed0e099970d6bb0bb921a7e7f26766ffb4","unresolved":true,"context_lines":[{"line_number":231,"context_line":"        return _BaseMutex.acquire(self, blocking\u003dblocking)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"    # Preserve documentation, without copy/pasting:"},{"line_number":234,"context_line":"    acquire.__doc__ \u003d _BaseMutex.acquire.__doc__"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    def _release_eventlet(self):"},{"line_number":237,"context_line":"        self._asyncio_lock.release()"}],"source_content_type":"text/x-python","patch_set":7,"id":"fe9416e7_5dd23095","line":234,"in_reply_to":"322f4b1f_9c1cd3e7","updated":"2025-04-10 10:15:18.000000000","message":"s/definition/docstring/","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a657979906169aa60eead08831c55edcdd89dc0b","unresolved":true,"context_lines":[{"line_number":240,"context_line":"        \"\"\"Release the mutex.\"\"\""},{"line_number":241,"context_line":"        # We release in reverse order from acquire(), first eventlet and then"},{"line_number":242,"context_line":"        # the RLock:"},{"line_number":243,"context_line":"        _BaseMutex.release(self)"},{"line_number":244,"context_line":"        self._threading_lock.release()"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def close(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"f7844a61_0a0fe862","line":243,"updated":"2025-04-10 10:14:20.000000000","message":"```suggestion\n        super.release()\n```","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":36603,"name":"Itamar Turner-Trauring","display_name":"Itamar Turner-Trauring","email":"itamar@pythonspeed.com","username":"itamarst2"},"change_message_id":"2d9c99d7e5b4d3ea193feb8200b376eda7da865d","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        \"\"\"Release the mutex.\"\"\""},{"line_number":241,"context_line":"        # We release in reverse order from acquire(), first eventlet and then"},{"line_number":242,"context_line":"        # the RLock:"},{"line_number":243,"context_line":"        _BaseMutex.release(self)"},{"line_number":244,"context_line":"        self._threading_lock.release()"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def close(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"da3480f3_b8365e0c","line":243,"in_reply_to":"f7844a61_0a0fe862","updated":"2025-05-01 17:30:19.000000000","message":"Done","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a657979906169aa60eead08831c55edcdd89dc0b","unresolved":true,"context_lines":[{"line_number":247,"context_line":"        \"\"\"Close the mutex.\"\"\""},{"line_number":248,"context_line":"        del self._asyncio_lock"},{"line_number":249,"context_line":"        del self._threading_lock"},{"line_number":250,"context_line":"        _BaseMutex.close(self)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"_HUB \u003d eventlet.hubs.get_hub()"}],"source_content_type":"text/x-python","patch_set":7,"id":"7408443e_cc1f2316","line":250,"updated":"2025-04-10 10:14:20.000000000","message":"```suggestion\n        super().close()\n```","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":36603,"name":"Itamar Turner-Trauring","display_name":"Itamar Turner-Trauring","email":"itamar@pythonspeed.com","username":"itamarst2"},"change_message_id":"2d9c99d7e5b4d3ea193feb8200b376eda7da865d","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        \"\"\"Close the mutex.\"\"\""},{"line_number":248,"context_line":"        del self._asyncio_lock"},{"line_number":249,"context_line":"        del self._threading_lock"},{"line_number":250,"context_line":"        _BaseMutex.close(self)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"_HUB \u003d eventlet.hubs.get_hub()"}],"source_content_type":"text/x-python","patch_set":7,"id":"1c1a3fb9_3c42a15f","line":250,"in_reply_to":"7408443e_cc1f2316","updated":"2025-05-01 17:30:19.000000000","message":"Done","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a657979906169aa60eead08831c55edcdd89dc0b","unresolved":true,"context_lines":[{"line_number":250,"context_line":"        _BaseMutex.close(self)"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"_HUB \u003d eventlet.hubs.get_hub()"},{"line_number":254,"context_line":"if isinstance(_HUB, eventlet.hubs.asyncio.Hub):"},{"line_number":255,"context_line":"    major, minor, patch \u003d map("},{"line_number":256,"context_line":"        int,"},{"line_number":257,"context_line":"        importlib.metadata.version(\"eventlet\").split(\".\")[:3]"},{"line_number":258,"context_line":"    )"},{"line_number":259,"context_line":"    if (major, minor, patch) \u003c (0, 38, 2):"},{"line_number":260,"context_line":"        raise RuntimeError("},{"line_number":261,"context_line":"            \"eventlet 0.38.2 or later is required when using asyncio hub\""},{"line_number":262,"context_line":"        )"},{"line_number":263,"context_line":"    PipeMutex \u003d _AsyncioMutex"},{"line_number":264,"context_line":"else:"},{"line_number":265,"context_line":"    PipeMutex \u003d _ReallyPipeMutex"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"def pipe_createLock(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"b75ac0ac_4af6804f","line":265,"range":{"start_line":253,"start_character":0,"end_line":265,"end_character":32},"updated":"2025-04-10 10:14:20.000000000","message":"A look at codesearch.o.o suggests no-one is using this outside of oslo.log itself (Swift have their own version). Rather than having runtime behavior at module level like this, could we move this logic into the `pipe_createLock` method below?\n\n\n```\ndef pipe_createLock(self):\n    \"\"\"Replacement for logging.Handler.createLock method.\"\"\"\n    if isinstance(_HUB, eventlet.hubs.asyncio.Hub):\n        ...\n        self.lock \u003d _AsyncioMutex\n    else:\n        self.lock \u003d _ReallyPipeMutex\n        \n```\n\nIn order to maintain API compatibility, you\u0027re supposed to keep the existing PipeMutex class as-is but immediately deprecate it. tbh though, no one outside of OpenStack is using this library (and no one in OpenStack is using the class) so if you just wanted to remove it and release the next version as a MAJOR release, I\u0027d be fine with that.","commit_id":"ecfbfab0941f9b959107c97b775924d52eacf23e"}],"releasenotes/notes/pipemutex-for-asyncio-hub-1292d9253e9aff68.yaml":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"e09e8baefab18c58f63cadce97f53b8ae9f018c6","unresolved":true,"context_lines":[{"line_number":2,"context_line":"  - |"},{"line_number":3,"context_line":"    Implements new version of PipeMutex that can be used with the eventlet"},{"line_number":4,"context_line":"    asyncio hub. This should ensure projects using the eventlet asyncio hub"},{"line_number":5,"context_line":"    can containue to use oslo.log without issue."},{"line_number":6,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":5,"id":"222b34ba_ed3b3bbb","line":5,"range":{"start_line":5,"start_character":8,"end_line":5,"end_character":17},"updated":"2025-01-15 06:02:25.000000000","message":"continue?","commit_id":"8dcfda0b0d5bdbcb47a83472afacb00a78be547c"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"5d7eb7e36417c0df8216f0be3b5fe24a1880103e","unresolved":false,"context_lines":[{"line_number":2,"context_line":"  - |"},{"line_number":3,"context_line":"    Implements new version of PipeMutex that can be used with the eventlet"},{"line_number":4,"context_line":"    asyncio hub. This should ensure projects using the eventlet asyncio hub"},{"line_number":5,"context_line":"    can containue to use oslo.log without issue."},{"line_number":6,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":5,"id":"05063ac3_e08ce13d","line":5,"range":{"start_line":5,"start_character":8,"end_line":5,"end_character":17},"in_reply_to":"222b34ba_ed3b3bbb","updated":"2025-01-24 20:10:37.000000000","message":"already fixed in PS6","commit_id":"8dcfda0b0d5bdbcb47a83472afacb00a78be547c"}]}
