)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":23851,"name":"Riccardo Pittau","email":"elfosardo@gmail.com","username":"elfosardo"},"change_message_id":"329760da731183ec8c0c2d9c2197e60c03691c5d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e9f279de_72fb57e0","updated":"2025-08-12 15:19:59.000000000","message":"recheck","commit_id":"b1e4315c17206a28c0f78828f1dc2535425a7f0d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"ec1db457e7abd8d392a4a2ad0a91dd1b37525d01","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b692d95d_fe67d968","updated":"2025-08-14 13:40:38.000000000","message":"I feel like we\u0027re no longer fixing the basic issue/bug if we\u0027re disabling the fix and requireing operators to change their configurations or add new configurations to cleanup the stale records. That feels worse to me. Could we somehow find a happy path where we still delete orphaned conductor records by default after sufficient time has passed? That was the consensus when this issue was discussed in IRC.","commit_id":"e75d0307364296a7bed418683330139b88647a6b"},{"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":"393d913c2bcf5b85a57044ad981370999d2a0687","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"5f62f63f_71430908","updated":"2025-08-13 03:26:40.000000000","message":"It would\u0027ve been Ok to let the earlier version land and follow it up :) Thanks for the update!","commit_id":"e75d0307364296a7bed418683330139b88647a6b"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"90b0e67b82df1d32e4bd2636b4576ce2697bd4b9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"d90fa545_907016b0","in_reply_to":"b692d95d_fe67d968","updated":"2025-08-14 21:04:03.000000000","message":"ack","commit_id":"e75d0307364296a7bed418683330139b88647a6b"},{"author":{"_account_id":24828,"name":"Kaifeng Wang","email":"kaifeng.w@gmail.com","username":"wangkf"},"change_message_id":"58e8fe5702084baed8e92e9f0b4bf89cab1159a0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"930baaea_a0ed2936","updated":"2025-08-16 07:05:53.000000000","message":"LGTM","commit_id":"6135a00c3b817f9bb548420bbcc34cd3b2eb3e9d"}],"ironic/conductor/manager.py":[{"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":"de0261bc90108d86852cfc3fa71f7d86352fc2ee","unresolved":true,"context_lines":[{"line_number":3787,"context_line":"        spacing\u003dCONF.conductor.conductor_cleanup_interval,"},{"line_number":3788,"context_line":"        enabled\u003dCONF.conductor.conductor_cleanup_interval \u003e 0"},{"line_number":3789,"context_line":"    )"},{"line_number":3790,"context_line":"    def cleanup_dead_conductors(self, context):"},{"line_number":3791,"context_line":"        \"\"\"Periodically clean up dead conductors from the database."},{"line_number":3792,"context_line":""},{"line_number":3793,"context_line":"        This task removes conductors that have been offline for longer than"}],"source_content_type":"text/x-python","patch_set":3,"id":"801e51b3_3d706399","line":3790,"updated":"2025-08-12 16:20:05.000000000","message":"as a followup, can we also add a guard that ensures this doesn\u0027t run if heartbeat_timeout is not larger (significantly, perhaps?) than conductor_cleanup_interval?","commit_id":"b1e4315c17206a28c0f78828f1dc2535425a7f0d"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"90b0e67b82df1d32e4bd2636b4576ce2697bd4b9","unresolved":false,"context_lines":[{"line_number":3787,"context_line":"        spacing\u003dCONF.conductor.conductor_cleanup_interval,"},{"line_number":3788,"context_line":"        enabled\u003dCONF.conductor.conductor_cleanup_interval \u003e 0"},{"line_number":3789,"context_line":"    )"},{"line_number":3790,"context_line":"    def cleanup_dead_conductors(self, context):"},{"line_number":3791,"context_line":"        \"\"\"Periodically clean up dead conductors from the database."},{"line_number":3792,"context_line":""},{"line_number":3793,"context_line":"        This task removes conductors that have been offline for longer than"}],"source_content_type":"text/x-python","patch_set":3,"id":"f9b17658_b35b2a78","line":3790,"in_reply_to":"801e51b3_3d706399","updated":"2025-08-14 21:04:03.000000000","message":"Acknowledged","commit_id":"b1e4315c17206a28c0f78828f1dc2535425a7f0d"}],"ironic/conf/conductor.py":[{"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":"de0261bc90108d86852cfc3fa71f7d86352fc2ee","unresolved":true,"context_lines":[{"line_number":423,"context_line":"                      \u0027because it defines how long a conductor can be \u0027"},{"line_number":424,"context_line":"                      \u0027offline before being considered dead and eligible \u0027"},{"line_number":425,"context_line":"                      \u0027for cleanup. If this value is too low (less than or \u0027"},{"line_number":426,"context_line":"                      \u0027equal to heartbeat_timeout), active conductors might \u0027"},{"line_number":427,"context_line":"                      \u0027be mistakenly removed from the database.\u0027)),"},{"line_number":428,"context_line":"    cfg.IntOpt(\u0027conductor_cleanup_batch_size\u0027,"},{"line_number":429,"context_line":"               min\u003d1,"}],"source_content_type":"text/x-python","patch_set":3,"id":"382aeb42_95069e1e","line":426,"updated":"2025-08-12 16:20:05.000000000","message":"ideally, we\u0027d add a validator that ensures that","commit_id":"b1e4315c17206a28c0f78828f1dc2535425a7f0d"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"90b0e67b82df1d32e4bd2636b4576ce2697bd4b9","unresolved":false,"context_lines":[{"line_number":423,"context_line":"                      \u0027because it defines how long a conductor can be \u0027"},{"line_number":424,"context_line":"                      \u0027offline before being considered dead and eligible \u0027"},{"line_number":425,"context_line":"                      \u0027for cleanup. If this value is too low (less than or \u0027"},{"line_number":426,"context_line":"                      \u0027equal to heartbeat_timeout), active conductors might \u0027"},{"line_number":427,"context_line":"                      \u0027be mistakenly removed from the database.\u0027)),"},{"line_number":428,"context_line":"    cfg.IntOpt(\u0027conductor_cleanup_batch_size\u0027,"},{"line_number":429,"context_line":"               min\u003d1,"}],"source_content_type":"text/x-python","patch_set":3,"id":"10a5d86e_86634adf","line":426,"in_reply_to":"382aeb42_95069e1e","updated":"2025-08-14 21:04:03.000000000","message":"Acknowledged","commit_id":"b1e4315c17206a28c0f78828f1dc2535425a7f0d"}],"ironic/db/sqlalchemy/api.py":[{"author":{"_account_id":32230,"name":"luocanhui","email":"luocanhui_jk@163.com","username":"luocanhui"},"change_message_id":"c75dfe6d41fe4fc05fa0909d601e7d0dcbace74e","unresolved":true,"context_lines":[{"line_number":1470,"context_line":"            # Reset state to prevent transitional or inconsistent states and"},{"line_number":1471,"context_line":"            # orphaned power state requests after deletion."},{"line_number":1472,"context_line":"            self.clear_node_target_power_state(hostname)"},{"line_number":1473,"context_line":""},{"line_number":1474,"context_line":"            # Delete conductor hardware interfaces"},{"line_number":1475,"context_line":"            query \u003d sa.delete(models.ConductorHardwareInterfaces).where("},{"line_number":1476,"context_line":"                models.ConductorHardwareInterfaces.conductor_id \u003d\u003d ("}],"source_content_type":"text/x-python","patch_set":7,"id":"c92925c4_df1ae88e","line":1473,"updated":"2026-03-23 12:24:12.000000000","message":"delete conductor will fail when nodes hold conductor_affinity FK references","commit_id":"6135a00c3b817f9bb548420bbcc34cd3b2eb3e9d"}],"releasenotes/notes/cleanup-stale-conductors-654c2bcc4ffb4c43.yaml":[{"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":"abea8fb037c60d50ce22f43ba48a1ee3d1046614","unresolved":true,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"fixes:"},{"line_number":27,"context_line":"  - |"},{"line_number":28,"context_line":"    [`Bug 2069771 \u003chttps://bugs.launchpad.net/ironic/+bug/2069771\u003e`_]"},{"line_number":29,"context_line":"    Fixes an issue where deleted or decommissioned conductors would remain"},{"line_number":30,"context_line":"    in ``openstack baremetal conductor list`` indefinitely with"},{"line_number":31,"context_line":"    ``Alive \u003d False`` status. The new periodic cleanup task automatically"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"8e55ae6c_d4dcbd30","line":28,"updated":"2025-08-22 17:51:08.000000000","message":"Not blocking feedback, but ideally we don\u0027t rely on external sources to continue existing to document stuff. If we commit a description to git, it can outlive launchpad.","commit_id":"6135a00c3b817f9bb548420bbcc34cd3b2eb3e9d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"84cd12a52f02a4f98892984c8531c0666b72db0c","unresolved":true,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"fixes:"},{"line_number":27,"context_line":"  - |"},{"line_number":28,"context_line":"    [`Bug 2069771 \u003chttps://bugs.launchpad.net/ironic/+bug/2069771\u003e`_]"},{"line_number":29,"context_line":"    Fixes an issue where deleted or decommissioned conductors would remain"},{"line_number":30,"context_line":"    in ``openstack baremetal conductor list`` indefinitely with"},{"line_number":31,"context_line":"    ``Alive \u003d False`` status. The new periodic cleanup task automatically"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"4b7b1dd9_8569ce93","line":28,"in_reply_to":"8e55ae6c_d4dcbd30","updated":"2025-08-22 19:05:49.000000000","message":"Yeah, generally we rely upon links as \"you can read more here\" and if that disappears that is fine.","commit_id":"6135a00c3b817f9bb548420bbcc34cd3b2eb3e9d"}]}
