)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"1adc22e5b76d26075c9b8b5184eeaaf239cb969b","unresolved":true,"context_lines":[{"line_number":13,"context_line":"* deploy_utils.reboot_to_finish_step adds rebooting to it."},{"line_number":14,"context_line":"* BaseInterface.iter_nodes wraps BaseConductorManager.iter_nodes,"},{"line_number":15,"context_line":"  adding TaskManager integration and check on interface compatibility."},{"line_number":16,"context_line":"  RedfishManagement has been updated to use the new helper."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I88540268d3bacebda775a0e94015c29a82c2c6a0"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"81c25855_ccd66a84","line":16,"range":{"start_line":16,"start_character":2,"end_line":16,"end_character":58},"updated":"2021-09-06 12:39:56.000000000","message":"for other current occurrences it\u0027s intended to be updated as necessary?","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11076,"name":"Shivanand Tendulker","email":"stendulker@gmail.com","username":"stendulker"},"change_message_id":"d0ac2770bf2c684fe0f366dc71d8b4810572c084","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"8b52907b_2f234c06","updated":"2021-10-14 06:28:45.000000000","message":"Thank you Dmitry.","commit_id":"7f9badb5437631fdea0f31b85aee3373f7bbb985"}],"doc/source/contributor/deploy-steps.rst":[{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"1adc22e5b76d26075c9b8b5184eeaaf239cb969b","unresolved":true,"context_lines":[{"line_number":125,"context_line":"Combined in-band and out-of-band step"},{"line_number":126,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"If your step stars as out-of-band and then proceeds as in-band (i.e. inside"},{"line_number":129,"context_line":"the agent), you only need to return ``CLEANWAIT``/``DEPLOYWAIT`` from"},{"line_number":130,"context_line":"the step."},{"line_number":131,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"3743195f_7cc11635","line":128,"range":{"start_line":128,"start_character":13,"end_line":128,"end_character":19},"updated":"2021-09-06 12:39:56.000000000","message":"starts","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"f8af9afca481e8b85e37b508235477937f344765","unresolved":false,"context_lines":[{"line_number":125,"context_line":"Combined in-band and out-of-band step"},{"line_number":126,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"If your step stars as out-of-band and then proceeds as in-band (i.e. inside"},{"line_number":129,"context_line":"the agent), you only need to return ``CLEANWAIT``/``DEPLOYWAIT`` from"},{"line_number":130,"context_line":"the step."},{"line_number":131,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"97bdd871_e76734a1","line":128,"range":{"start_line":128,"start_character":13,"end_line":128,"end_character":19},"in_reply_to":"3743195f_7cc11635","updated":"2021-10-07 10:20:15.000000000","message":"Done","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"1adc22e5b76d26075c9b8b5184eeaaf239cb969b","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"            return deploy_utils.reboot_to_finish_step(task)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"Polling for completion"},{"line_number":192,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"Finally, you may want to poll the BMC until the operation is complete. Often"}],"source_content_type":"text/x-rst","patch_set":2,"id":"34531c1d_145550d8","line":191,"range":{"start_line":191,"start_character":0,"end_line":191,"end_character":22},"updated":"2021-09-06 12:39:56.000000000","message":"JFYI, this polling pattern is heavily used in idrac modules (both redfish and wsman). When time permits I\u0027ll check if helpers can be created otherwise there is boilerplate code all over the place. Haven\u0027t checked how useful that would be for other vendor modules.","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":192,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"Finally, you may want to poll the BMC until the operation is complete. Often"},{"line_number":195,"context_line":"enough, this also involves a reboot."},{"line_number":196,"context_line":""},{"line_number":197,"context_line":".. code-block:: python"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"854d9a67_f2ffa6be","line":195,"updated":"2021-09-08 16:08:44.000000000","message":"I\u0027d hope for a note saying there *can* be a database performance hit depending on how the poller db query is written. Of course, it could just be pointed out in-line.","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":231,"context_line":"        @periodics.periodic(spacing\u003d_STATUS_CHECK_INTERVAL"},{"line_number":232,"context_line":"                            enabled\u003d_STATUS_CHECK_INTERVAL \u003e 0)"},{"line_number":233,"context_line":"        def _query_my_action_status(self, manager, context):"},{"line_number":234,"context_line":"            # This pattern allows filtering nodes you\u0027re interested in"},{"line_number":235,"context_line":"            filters \u003d {\u0027provision_state\u0027: states.CLEANWAIT}"},{"line_number":236,"context_line":"            for task in self.iter_nodes(manager, context, filters\u003dfilters,"},{"line_number":237,"context_line":"                                        purpose\u003d\u0027checking my_action status\u0027):"}],"source_content_type":"text/x-rst","patch_set":2,"id":"06a63126_48af8d0f","line":234,"updated":"2021-09-08 16:08:44.000000000","message":"nit: I\u0027d add a note to restrict this as reasonably as possible as you don\u0027t want to be creating tasks for nodes which have nothing to do with your specific driver or case.","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":233,"context_line":"        def _query_my_action_status(self, manager, context):"},{"line_number":234,"context_line":"            # This pattern allows filtering nodes you\u0027re interested in"},{"line_number":235,"context_line":"            filters \u003d {\u0027provision_state\u0027: states.CLEANWAIT}"},{"line_number":236,"context_line":"            for task in self.iter_nodes(manager, context, filters\u003dfilters,"},{"line_number":237,"context_line":"                                        purpose\u003d\u0027checking my_action status\u0027):"},{"line_number":238,"context_line":"                try:"},{"line_number":239,"context_line":"                    self._check_my_action_status(task)"}],"source_content_type":"text/x-rst","patch_set":2,"id":"346e89aa_c680b336","line":236,"range":{"start_line":236,"start_character":5,"end_line":236,"end_character":20},"updated":"2021-09-08 16:08:44.000000000","message":"like, base_manager\u0027s iter_nodes?\n\nIt returns a tuple, not a task.\n\nEdit: Okay, I see what is going on. Your proposing a helper to handle node iteration as a single action to return tasks. I have major concerns over the performance/scalability since in essence we\u0027re double selecting needlessly where a number of the examples in ironic try to further prune the node down before creating the task from the original list of nodes to.\n\nAt a small implementation scale, this is not really a big deal, but we\u0027ve seen with the larger operators, where the the conductor quickly does huge numbers of database selects.... and I would really prefer we not encourage that pattern and try to keep a pattern where we encourage operators to go down the path of trying to be very explicit upfront.","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":238,"context_line":"                try:"},{"line_number":239,"context_line":"                    self._check_my_action_status(task)"},{"line_number":240,"context_line":"                except exception.NodeNotFound:"},{"line_number":241,"context_line":"                    # This can happen because of the shared lock"},{"line_number":242,"context_line":"                    LOG.info(\u0027During _query_my_action_status, node \u0027"},{"line_number":243,"context_line":"                             \u0027%(node)s was not found and presumed deleted by \u0027"},{"line_number":244,"context_line":"                             \u0027another process.\u0027, {\u0027node\u0027: node_uuid})"}],"source_content_type":"text/x-rst","patch_set":2,"id":"ad2f0469_14d1b5d7","line":241,"range":{"start_line":241,"start_character":20,"end_line":241,"end_character":64},"updated":"2021-09-08 16:08:44.000000000","message":"Can happen if the node was deleted between the start of the iter_nodes query list being generated and the node being reached.","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"}],"ironic/drivers/base.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":360,"context_line":"        \"\"\""},{"line_number":361,"context_line":"        return self._execute_step(task, step)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def iter_nodes(self, manager, context, filters, purpose):"},{"line_number":364,"context_line":"        \"\"\"Iterator over nodes that use this interface."},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        Locked nodes are ignored, however because of the shared lock there"},{"line_number":367,"context_line":"        is a possibility that another process will lock the same node."},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bf2f242f_13709371","line":365,"range":{"start_line":363,"start_character":0,"end_line":365,"end_character":0},"updated":"2021-09-08 16:08:44.000000000","message":"This is somewhat of a nit, but I think it would be good to use a different name as to not cause confusion with manager.iter_nodes","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":364,"context_line":"        \"\"\"Iterator over nodes that use this interface."},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        Locked nodes are ignored, however because of the shared lock there"},{"line_number":367,"context_line":"        is a possibility that another process will lock the same node."},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        :param manager: Conductor manager."},{"line_number":370,"context_line":"        :param context: A task context."}],"source_content_type":"text/x-python","patch_set":2,"id":"e4ca6b2e_f12ea435","line":367,"updated":"2021-09-08 16:08:44.000000000","message":"I guess I would be more accepting of this if we note this may not be ideal for all database interactions and developers may wish to consider other paths, but again as noted below, food for thought.","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":376,"context_line":"        from ironic.conductor import task_manager"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"        filters.setdefault(\u0027reserved\u0027, False)"},{"line_number":379,"context_line":"        node_list \u003d manager.iter_nodes(filters\u003dfilters)"},{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        for (node_uuid, driver, conductor_group) in node_list:"},{"line_number":382,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"a1afd3c5_060c311f","line":379,"range":{"start_line":379,"start_character":0,"end_line":379,"end_character":55},"updated":"2021-09-08 16:08:44.000000000","message":"At least this filters out nodes by the hash ring too :)","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":386,"context_line":"                    if not isinstance("},{"line_number":387,"context_line":"                            getattr(task.driver, self.interface_type),"},{"line_number":388,"context_line":"                            self.__class__):"},{"line_number":389,"context_line":"                        continue"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"                    LOG.debug(\"%(action)s: node %(node)s\","},{"line_number":392,"context_line":"                              {\u0027action\u0027: purpose.capitalize(),"}],"source_content_type":"text/x-python","patch_set":2,"id":"7641ebf2_b99ca9ff","line":389,"updated":"2021-09-08 16:08:44.000000000","message":"I get the idea of this is to spawn the task, and then check that the spawned task contains matches the interface the iterator is attached to. Not a bad feature, but... why not just add the filter of the interface name mapping to restrict the query set.  Of course that also means we have to determine it *or* the author of the iterator explicitly knows it. Maybe food for thought.\n\nExample with this:\n\nSay we have 100 ipmi nodes in say cleanwait, and then 100 redfish nodes in cleanwait \u003d\u003d 201 nodes table select queries and related overhead to return a task object.\n\nExample if we require interface name:\n\n100 ipmi nodes in clean wait, 100 redfish in clean wait, 10 of which with driver_internal_info flag related to the oller which is part of the iterator. \u003d\u003d 11 nodes table select queries.","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":380,"context_line":""},{"line_number":381,"context_line":"        for (node_uuid, driver, conductor_group) in node_list:"},{"line_number":382,"context_line":"            try:"},{"line_number":383,"context_line":"                with task_manager.acquire(context, node_uuid,"},{"line_number":384,"context_line":"                                          purpose\u003dpurpose,"},{"line_number":385,"context_line":"                                          shared\u003dTrue) as task:"},{"line_number":386,"context_line":"                    if not isinstance("},{"line_number":387,"context_line":"                            getattr(task.driver, self.interface_type),"},{"line_number":388,"context_line":"                            self.__class__):"},{"line_number":389,"context_line":"                        continue"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"                    LOG.debug(\"%(action)s: node %(node)s\","},{"line_number":392,"context_line":"                              {\u0027action\u0027: purpose.capitalize(),"},{"line_number":393,"context_line":"                               \u0027node\u0027: task.node.uuid})"}],"source_content_type":"text/x-python","patch_set":2,"id":"242df4a1_9769188e","line":390,"range":{"start_line":383,"start_character":7,"end_line":390,"end_character":0},"updated":"2021-09-08 16:08:44.000000000","message":"I\u0027m a bit of a -1 over embedding a default node -\u003e shared task for documentation example purposes.\n\nSince this means, if a conductor has a thousand nodes, and all are in a state where this iter_nodes is used, then we end up generating a thousand tasks, with a a minimum of a thousand selects against nodes, and potentially other tables.\n\nI\u0027d much rather prefer people to write polling tasks that attempt to minimize the excess database activity in large scale deployments.","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"}],"ironic/drivers/modules/redfish/bios.py":[{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"85d97cbfd1867a394743142ea8debb9784572eb8","unresolved":true,"context_lines":[{"line_number":268,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":269,"context_line":"        \"\"\""},{"line_number":270,"context_line":"        deploy_utils.prepare_agent_boot(task)"},{"line_number":271,"context_line":"        self._reboot(task)"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def post_configuration(self, task, settings):"},{"line_number":274,"context_line":"        \"\"\"Perform post configuration action to store the BIOS settings."}],"source_content_type":"text/x-python","patch_set":3,"id":"07745b32_92f92675","line":271,"range":{"start_line":271,"start_character":8,"end_line":271,"end_character":1},"updated":"2021-10-08 08:00:40.000000000","message":"any reason why keeping this helper here and below instead of replacing this all with `reboot_to_finish_step`. Because here it does not return `get_async_step_return_state`?","commit_id":"ba621a4e0fc41b64e0dbee367bcdee35b15d037f"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"441112787f1472c73b9c145a8ba7e30f0e61c0f0","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":269,"context_line":"        \"\"\""},{"line_number":270,"context_line":"        deploy_utils.prepare_agent_boot(task)"},{"line_number":271,"context_line":"        self._reboot(task)"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def post_configuration(self, task, settings):"},{"line_number":274,"context_line":"        \"\"\"Perform post configuration action to store the BIOS settings."}],"source_content_type":"text/x-python","patch_set":3,"id":"6b034b55_2d4dff09","line":271,"range":{"start_line":271,"start_character":8,"end_line":271,"end_character":1},"in_reply_to":"07745b32_92f92675","updated":"2021-10-11 15:23:01.000000000","message":"I don\u0027t remember why _reboot was introduced, I assume it may be overridden?","commit_id":"ba621a4e0fc41b64e0dbee367bcdee35b15d037f"},{"author":{"_account_id":27909,"name":"Aija Jauntēva","email":"code@clusums.eu","username":"ajya"},"change_message_id":"286fcde5d64ff58f9b48d597b7e024f51b009827","unresolved":false,"context_lines":[{"line_number":268,"context_line":"        :param task: a TaskManager instance containing the node to act on."},{"line_number":269,"context_line":"        \"\"\""},{"line_number":270,"context_line":"        deploy_utils.prepare_agent_boot(task)"},{"line_number":271,"context_line":"        self._reboot(task)"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def post_configuration(self, task, settings):"},{"line_number":274,"context_line":"        \"\"\"Perform post configuration action to store the BIOS settings."}],"source_content_type":"text/x-python","patch_set":3,"id":"5b6161fb_f832e22c","line":271,"range":{"start_line":271,"start_character":8,"end_line":271,"end_character":1},"in_reply_to":"6b034b55_2d4dff09","updated":"2021-10-12 07:46:28.000000000","message":"rather to use `require_exclusive_lock`. As far as I recall, methods meant for override didn\u0027t start with `_`.","commit_id":"ba621a4e0fc41b64e0dbee367bcdee35b15d037f"}],"ironic/drivers/modules/redfish/management.py":[{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":880,"context_line":"                                      RedfishManagement):"},{"line_number":881,"context_line":"                        continue"},{"line_number":882,"context_line":""},{"line_number":883,"context_line":"                    firmware_updates \u003d driver_internal_info.get("},{"line_number":884,"context_line":"                        \u0027firmware_updates\u0027)"},{"line_number":885,"context_line":"                    if not firmware_updates:"},{"line_number":886,"context_line":"                        continue"},{"line_number":887,"context_line":""},{"line_number":888,"context_line":"                    node \u003d task.node"},{"line_number":889,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"4e51b93b_486ccf79","side":"PARENT","line":886,"range":{"start_line":883,"start_character":0,"end_line":886,"end_character":32},"updated":"2021-09-08 16:08:44.000000000","message":"Ugh, this is flipped and backwards. This portion should be up before we create a task.","commit_id":"afa80199652af30e6e127110eb1b92809c397107"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":929,"context_line":"                                      RedfishManagement):"},{"line_number":930,"context_line":"                        continue"},{"line_number":931,"context_line":""},{"line_number":932,"context_line":"                    firmware_updates \u003d driver_internal_info.get("},{"line_number":933,"context_line":"                        \u0027firmware_updates\u0027)"},{"line_number":934,"context_line":"                    if not firmware_updates:"},{"line_number":935,"context_line":"                        continue"},{"line_number":936,"context_line":""},{"line_number":937,"context_line":"                    self._check_node_firmware_update(task)"},{"line_number":938,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"f384239f_16eb89ea","side":"PARENT","line":935,"range":{"start_line":932,"start_character":0,"end_line":935,"end_character":32},"updated":"2021-09-08 16:08:44.000000000","message":"Ugh, same as above.","commit_id":"afa80199652af30e6e127110eb1b92809c397107"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"f11cb9ae54d32a87c5ddbb0cab3fbbd466c9c292","unresolved":true,"context_lines":[{"line_number":899,"context_line":"        filters \u003d {\u0027provision_state\u0027: states.CLEANWAIT}"},{"line_number":900,"context_line":"        lock_purpose \u003d \u0027checking async firmware update tasks.\u0027"},{"line_number":901,"context_line":""},{"line_number":902,"context_line":"        for task in self.iter_nodes(manager, context, filters\u003dfilters,"},{"line_number":903,"context_line":"                                    purpose\u003dlock_purpose):"},{"line_number":904,"context_line":"            firmware_updates \u003d task.node.driver_internal_info.get("},{"line_number":905,"context_line":"                \u0027firmware_updates\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"31b9f1ed_b295105d","line":902,"updated":"2021-09-08 16:08:44.000000000","message":"I\u0027d kind of prefer to avoid the double select unless we have to. Unfortunately the original base ones were not...  ideal db impact/performance wise.","commit_id":"cf93f73268698ea30d01b5e9508041a6ca809416"}]}
