)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f7b460a2d45b5aa05fe535b35eb6f2b228a37626","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Daniel Bengtsson \u003cdbengt@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-02-04 13:39:55 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Call thread_done() automatically when threads finish (threading backend)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Wrap the callback in add_thread() so thread_done(threading.current_thread())"},{"line_number":10,"context_line":"is invoked in a finally block when the thread completes. Completed threads"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"b0c29de1_2777056d","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":72},"updated":"2026-02-04 17:47:26.000000000","message":"Could you please try describing the problem you are fixing, not how you are fixing it. The method you are touching and the logic change you are making is quite apparent in git diff.\n \nI think the core point is that you fix the growing thread list in ThreadGroup and just focus on describing it.","commit_id":"6ef384c127a3b7458f361029613d36223f9226bd"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"5774dafe9fd3ef435afbf3b9800bae51f4935085","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Daniel Bengtsson \u003cdbengt@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-02-04 13:39:55 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Call thread_done() automatically when threads finish (threading backend)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Wrap the callback in add_thread() so thread_done(threading.current_thread())"},{"line_number":10,"context_line":"is invoked in a finally block when the thread completes. Completed threads"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"2ccc1904_1e112dac","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":72},"in_reply_to":"b0c29de1_2777056d","updated":"2026-02-05 11:59:00.000000000","message":"Done","commit_id":"6ef384c127a3b7458f361029613d36223f9226bd"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"8ab84b96c9ee82d05366c9c9ee48b13e3f8ed701","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"777bdc9e_9fad8ec0","updated":"2026-02-04 13:09:29.000000000","message":"All these changes LGTM, indeed, I think that not having this completion awarness in the threading backend seems to be a design flaw. Only +1 by waiting for the CI outcomes","commit_id":"6ef384c127a3b7458f361029613d36223f9226bd"},{"author":{"_account_id":11628,"name":"Michael Johnson","email":"johnsomor@gmail.com","username":"johnsom"},"change_message_id":"895ca83bbb093850b2b94d44f4ec7001e2304514","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"42419b3a_3bd41af9","updated":"2026-02-04 19:51:57.000000000","message":"LGTM and this resolves the issue I observed in Designate with the unbounded growth of the thread list.","commit_id":"6ef384c127a3b7458f361029613d36223f9226bd"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f7b460a2d45b5aa05fe535b35eb6f2b228a37626","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"06fd1843_d8801991","updated":"2026-02-04 17:47:26.000000000","message":"The logic update looks good but I have several suggestions about documentation part.","commit_id":"6ef384c127a3b7458f361029613d36223f9226bd"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"af21a704049164ee819876ad4f442a536fc61a74","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"948f4cbb_c66379c4","updated":"2026-02-05 12:50:37.000000000","message":"LGTM. Latest comments seems all addressed.","commit_id":"ed7eb804092a0606750e7568db81d3d4e4c37e37"}],"oslo_service/backend/_threading/threadgroup.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f7b460a2d45b5aa05fe535b35eb6f2b228a37626","unresolved":true,"context_lines":[{"line_number":66,"context_line":"    def add_thread(self, callback, *args, **kwargs):"},{"line_number":67,"context_line":"        \"\"\"Add a new thread to the group."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        When the thread finishes (normally or by exception), thread_done() is"},{"line_number":70,"context_line":"        called automatically so the thread is removed from the group."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param callback: The function to run in the thread"}],"source_content_type":"text/x-python","patch_set":2,"id":"85da0275_b492dd94","line":69,"updated":"2026-02-04 17:47:26.000000000","message":"The same is already mentioned in thread_done so I think this is just redundant.","commit_id":"6ef384c127a3b7458f361029613d36223f9226bd"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"5774dafe9fd3ef435afbf3b9800bae51f4935085","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    def add_thread(self, callback, *args, **kwargs):"},{"line_number":67,"context_line":"        \"\"\"Add a new thread to the group."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        When the thread finishes (normally or by exception), thread_done() is"},{"line_number":70,"context_line":"        called automatically so the thread is removed from the group."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param callback: The function to run in the thread"}],"source_content_type":"text/x-python","patch_set":2,"id":"c2e20765_20c73705","line":69,"in_reply_to":"85da0275_b492dd94","updated":"2026-02-05 11:59:00.000000000","message":"Done","commit_id":"6ef384c127a3b7458f361029613d36223f9226bd"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f7b460a2d45b5aa05fe535b35eb6f2b228a37626","unresolved":true,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _wait_threads(self):"},{"line_number":124,"context_line":"        \"\"\"Wait for all threads to complete."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        Copy the thread list under lock then join without holding the lock,"},{"line_number":127,"context_line":"        so that threads calling thread_done() on completion do not deadlock."},{"line_number":128,"context_line":"        \"\"\""},{"line_number":129,"context_line":"        current \u003d threading.current_thread()"},{"line_number":130,"context_line":"        with self._lock:"}],"source_content_type":"text/x-python","patch_set":2,"id":"2d515fa7_ec0a0a9a","line":127,"range":{"start_line":125,"start_character":0,"end_line":127,"end_character":76},"updated":"2026-02-04 17:47:26.000000000","message":"This is a private method and describing its internal logic isn\u0027t needed. Just remove this.","commit_id":"6ef384c127a3b7458f361029613d36223f9226bd"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"5774dafe9fd3ef435afbf3b9800bae51f4935085","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _wait_threads(self):"},{"line_number":124,"context_line":"        \"\"\"Wait for all threads to complete."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        Copy the thread list under lock then join without holding the lock,"},{"line_number":127,"context_line":"        so that threads calling thread_done() on completion do not deadlock."},{"line_number":128,"context_line":"        \"\"\""},{"line_number":129,"context_line":"        current \u003d threading.current_thread()"},{"line_number":130,"context_line":"        with self._lock:"}],"source_content_type":"text/x-python","patch_set":2,"id":"47cb84d8_11cdbe13","line":127,"range":{"start_line":125,"start_character":0,"end_line":127,"end_character":76},"in_reply_to":"2d515fa7_ec0a0a9a","updated":"2026-02-05 11:59:00.000000000","message":"Done","commit_id":"6ef384c127a3b7458f361029613d36223f9226bd"}],"releasenotes/notes/threading-threadgroup-thread-done-auto-call-e64f74c8cd6c6d3c.yaml":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"f7b460a2d45b5aa05fe535b35eb6f2b228a37626","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In the threading backend, :meth:`ThreadGroup.thread_done` is now called"},{"line_number":5,"context_line":"    automatically when a thread started via :meth:`ThreadGroup.add_thread`"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"8f7e1243_7920d5ed","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":7},"updated":"2026-02-04 17:47:26.000000000","message":"The pydoc says\n\n```\n    def thread_done(self, thread):\n        \"\"\"Remove a completed thread from the group.\n        This method is automatically called on completion of a thread in\n        the group, and should not be called explicitly.\n        \"\"\"\n```\n\nso this is the expected behavior, not a new feature. IMO we should report a bug and classify this as a bug fix.\n\nAlso, like I mentioned for the commit message, do not describe detail of the methods you fixed. Please describe the problem or the behavior.","commit_id":"6ef384c127a3b7458f361029613d36223f9226bd"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"5774dafe9fd3ef435afbf3b9800bae51f4935085","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In the threading backend, :meth:`ThreadGroup.thread_done` is now called"},{"line_number":5,"context_line":"    automatically when a thread started via :meth:`ThreadGroup.add_thread`"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"ba01b86a_750d5976","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":7},"in_reply_to":"8f7e1243_7920d5ed","updated":"2026-02-05 11:59:00.000000000","message":"Done","commit_id":"6ef384c127a3b7458f361029613d36223f9226bd"}]}
