)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"41e3ffb65611f883dd1f3db609ff41705804b402","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b171e3f5_7bf468ac","updated":"2026-08-03 09:34:22.000000000","message":"For the sake of reducing the implementation: can we treat a normal update as a batched update with size 1?","commit_id":"d1888db23ea7e9ed2393000820b65961437bfd05"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"0abed81031f82c43c91ec7bfd133f2786cdb0881","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5c686086_9a6971cd","updated":"2026-08-04 05:39:25.000000000","message":"Thank you for your comments Dmitry, answers inline. Will push next revision later today.","commit_id":"fdb6a02d1a5a53dd2772cddb646f655b0c8b4226"}],"ironic/drivers/modules/redfish/firmware.py":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"41e3ffb65611f883dd1f3db609ff41705804b402","unresolved":true,"context_lines":[{"line_number":66,"context_line":"        component \u003d s.get(\u0027component\u0027, \u0027\u0027)"},{"line_number":67,"context_line":"        if redfish_utils.get_component_type(component) \u003d\u003d redfish_utils.BMC:"},{"line_number":68,"context_line":"            return i"},{"line_number":69,"context_line":"        if component in seen:"},{"line_number":70,"context_line":"            return i"},{"line_number":71,"context_line":"        seen.add(component)"},{"line_number":72,"context_line":"    return len(settings)"}],"source_content_type":"text/x-python","patch_set":2,"id":"c732c687_a4f559e3","line":69,"updated":"2026-08-03 09:34:22.000000000","message":"nit: you disallow this situation in the validation","commit_id":"d1888db23ea7e9ed2393000820b65961437bfd05"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a68533d2be539f66c2af73215c3a8f8a2cdb1618","unresolved":true,"context_lines":[{"line_number":59,"context_line":"    This function returns the length of that leading run."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    Duplicate components are rejected at validation time in update()"},{"line_number":62,"context_line":"    when allow_grouping_reboots is True."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    :param settings: list of firmware update dicts"},{"line_number":65,"context_line":"    :returns: int — number of components in the leading batchable run"}],"source_content_type":"text/x-python","patch_set":3,"id":"3146a9ab_c299b3f3","line":62,"updated":"2026-08-03 15:58:45.000000000","message":"It\u0027s not the case until the next patch (may be a reason to squash them..)","commit_id":"fdb6a02d1a5a53dd2772cddb646f655b0c8b4226"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"0abed81031f82c43c91ec7bfd133f2786cdb0881","unresolved":true,"context_lines":[{"line_number":59,"context_line":"    This function returns the length of that leading run."},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    Duplicate components are rejected at validation time in update()"},{"line_number":62,"context_line":"    when allow_grouping_reboots is True."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    :param settings: list of firmware update dicts"},{"line_number":65,"context_line":"    :returns: int — number of components in the leading batchable run"}],"source_content_type":"text/x-python","patch_set":3,"id":"9bcb45c1_4b0e7a92","line":62,"in_reply_to":"3146a9ab_c299b3f3","updated":"2026-08-04 05:39:25.000000000","message":"I agree. I got Claudes to compress and slice up the patches (first iteration was thousands of lines) but I think pushed it too far and started to make it harder. Will squash the two.","commit_id":"fdb6a02d1a5a53dd2772cddb646f655b0c8b4226"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a68533d2be539f66c2af73215c3a8f8a2cdb1618","unresolved":true,"context_lines":[{"line_number":754,"context_line":"            LOG.error(\u0027Batched firmware submission failed at component \u0027"},{"line_number":755,"context_line":"                      \u0027%(component)s (%(idx)d/%(total)d) for node \u0027"},{"line_number":756,"context_line":"                      \u0027%(node)s. Error: %(error)s. No consolidated \u0027"},{"line_number":757,"context_line":"                      \u0027reboot will be issued.\u0027,"},{"line_number":758,"context_line":"                      {\u0027component\u0027: component, \u0027idx\u0027: idx + 1,"},{"line_number":759,"context_line":"                       \u0027total\u0027: len(settings), \u0027node\u0027: node.uuid,"},{"line_number":760,"context_line":"                       \u0027error\u0027: e})"}],"source_content_type":"text/x-python","patch_set":3,"id":"c2ea5c16_1eeaa538","line":757,"updated":"2026-08-03 15:58:45.000000000","message":"I really wonder if this will leave stale jobs in iDRAC..","commit_id":"fdb6a02d1a5a53dd2772cddb646f655b0c8b4226"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"0abed81031f82c43c91ec7bfd133f2786cdb0881","unresolved":true,"context_lines":[{"line_number":754,"context_line":"            LOG.error(\u0027Batched firmware submission failed at component \u0027"},{"line_number":755,"context_line":"                      \u0027%(component)s (%(idx)d/%(total)d) for node \u0027"},{"line_number":756,"context_line":"                      \u0027%(node)s. Error: %(error)s. No consolidated \u0027"},{"line_number":757,"context_line":"                      \u0027reboot will be issued.\u0027,"},{"line_number":758,"context_line":"                      {\u0027component\u0027: component, \u0027idx\u0027: idx + 1,"},{"line_number":759,"context_line":"                       \u0027total\u0027: len(settings), \u0027node\u0027: node.uuid,"},{"line_number":760,"context_line":"                       \u0027error\u0027: e})"}],"source_content_type":"text/x-python","patch_set":3,"id":"54d85aaa_b7c07fd1","line":757,"in_reply_to":"c2ea5c16_1eeaa538","updated":"2026-08-04 05:39:25.000000000","message":"It may. In my testing, I have not seen a situation where job scheduling failed but it later ran. But I did routinely cleaned up dead jobs to help my own record-keeping.\n\nShould we consider cleaning job queue on failure? It feels a touch uncomfortable but I am not against this idea if you see merit in it.","commit_id":"fdb6a02d1a5a53dd2772cddb646f655b0c8b4226"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"a68533d2be539f66c2af73215c3a8f8a2cdb1618","unresolved":true,"context_lines":[{"line_number":1691,"context_line":"        else:"},{"line_number":1692,"context_line":"            self._check_batched_staging(task, settings)"},{"line_number":1693,"context_line":""},{"line_number":1694,"context_line":"    def _check_batched_staging(self, task, settings):"},{"line_number":1695,"context_line":"        \"\"\"Phase 1: poll the current component and advance when staged.\"\"\""},{"line_number":1696,"context_line":"        node \u003d task.node"},{"line_number":1697,"context_line":"        current_idx \u003d node.driver_internal_info.get("}],"source_content_type":"text/x-python","patch_set":3,"id":"e75dcddf_a03fab32","line":1694,"updated":"2026-08-03 15:58:45.000000000","message":"Not sure if you saw my top-level comment: is it possible to reduce the amount of new code by treating normal updates as batched updates with a fixed batch size of 1?","commit_id":"fdb6a02d1a5a53dd2772cddb646f655b0c8b4226"},{"author":{"_account_id":32177,"name":"Jacob Anders","email":"jacob-anders-dev@proton.me","username":"janders"},"change_message_id":"0abed81031f82c43c91ec7bfd133f2786cdb0881","unresolved":true,"context_lines":[{"line_number":1691,"context_line":"        else:"},{"line_number":1692,"context_line":"            self._check_batched_staging(task, settings)"},{"line_number":1693,"context_line":""},{"line_number":1694,"context_line":"    def _check_batched_staging(self, task, settings):"},{"line_number":1695,"context_line":"        \"\"\"Phase 1: poll the current component and advance when staged.\"\"\""},{"line_number":1696,"context_line":"        node \u003d task.node"},{"line_number":1697,"context_line":"        current_idx \u003d node.driver_internal_info.get("}],"source_content_type":"text/x-python","patch_set":3,"id":"80fefb73_825dd71a","line":1694,"in_reply_to":"e75dcddf_a03fab32","updated":"2026-08-04 05:39:25.000000000","message":"I thought I improved this but clearly not enough - I blame 2200hrs brain. Will revisit and retest, next set of patches coming later tonight.","commit_id":"fdb6a02d1a5a53dd2772cddb646f655b0c8b4226"}]}
