)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"27aff682c8102fe00dc7843ad811db836335c8f4","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Compute resources were previously updated during host"},{"line_number":10,"context_line":"object initialization and at the end of"},{"line_number":11,"context_line":"update_available_resource(). It could cause some inconsistencies"},{"line_number":12,"context_line":"in host states between DB and host for a while."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This change ensures that resources are updated only once per"},{"line_number":15,"context_line":"update_available_resource() call."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"df87a7cf_210dd88f","line":12,"range":{"start_line":11,"start_character":29,"end_line":12,"end_character":47},"updated":"2017-12-15 15:47:19.000000000","message":"This could use a bit more explanation in the commit message. I know there are details in the bug, but it would be good to summarize or give some example of what can go wrong without this change.\n\nI think I\u0027ve asked for confirmation within the resource tracker change so maybe that can be copied here.","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"78c13f8dd608e827ec5ff006580933ba000891b2","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Compute resources were previously updated during host"},{"line_number":10,"context_line":"object initialization and at the end of"},{"line_number":11,"context_line":"update_available_resource(). It could cause some inconsistencies"},{"line_number":12,"context_line":"in host states between DB and host for a while."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This change ensures that resources are updated only once per"},{"line_number":15,"context_line":"update_available_resource() call."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"df87a7cf_fdbe8263","line":12,"range":{"start_line":11,"start_character":29,"end_line":12,"end_character":47},"in_reply_to":"df87a7cf_210dd88f","updated":"2017-12-18 14:36:56.000000000","message":"Ok, I\u0027ll change it to be more verbose here.","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"7b66654761546beccf13fb537c9159a7fe8695d4","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Compute resources were previously updated during host"},{"line_number":10,"context_line":"object initialization and at the end of"},{"line_number":11,"context_line":"update_available_resource(). It could cause some inconsistencies"},{"line_number":12,"context_line":"in host states between DB and host for a while."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This change ensures that resources are updated only once per"},{"line_number":15,"context_line":"update_available_resource() call."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"bf8cb3f7_4e05d1c1","line":12,"range":{"start_line":11,"start_character":29,"end_line":12,"end_character":47},"in_reply_to":"df87a7cf_fdbe8263","updated":"2017-12-22 09:29:24.000000000","message":"@Matt done, please check if its ok for you :)! Thanks","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"}],"nova/compute/resource_tracker.py":[{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6529e48235b08404c53ac93290abce5ac060db6d","unresolved":false,"context_lines":[{"line_number":516,"context_line":"            self._copy_resources(cn, resources)"},{"line_number":517,"context_line":"            self._setup_pci_tracker(context, cn, resources)"},{"line_number":518,"context_line":"            if populate:"},{"line_number":519,"context_line":"                self._update(context, cn)"},{"line_number":520,"context_line":"            return"},{"line_number":521,"context_line":""},{"line_number":522,"context_line":"        # now try to get the compute node record from the"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f485f77_adce61b1","line":519,"updated":"2017-11-15 16:05:03.000000000","message":"This call is needed here if nodename is in self.compute_nodes. Otherwise nova.tests.functional.compute.test_resource_tracker.IronicResourceTrackerTest.test_ironic_ocata_to_pike fails.","commit_id":"19973065e486a0acc65c0957b105abe5edf7ee56"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6529e48235b08404c53ac93290abce5ac060db6d","unresolved":false,"context_lines":[{"line_number":527,"context_line":"            self._copy_resources(cn, resources)"},{"line_number":528,"context_line":"            self._setup_pci_tracker(context, cn, resources)"},{"line_number":529,"context_line":"            if populate:"},{"line_number":530,"context_line":"                self._update(context, cn)"},{"line_number":531,"context_line":"            return"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"        # there was no local copy and none in the database"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f485f77_cdf07d00","line":530,"updated":"2017-11-15 16:05:03.000000000","message":"This call causes the problem. It should be removed.","commit_id":"19973065e486a0acc65c0957b105abe5edf7ee56"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b88ebd6eeac7adfbac60fdb1ac2baaff55c7de47","unresolved":false,"context_lines":[{"line_number":663,"context_line":"        # Populate them at the end of this function to make process"},{"line_number":664,"context_line":"        # more atomic."},{"line_number":665,"context_line":"        # See bug #1729621"},{"line_number":666,"context_line":"        self._init_compute_node(context, resources, populate\u003dFalse)"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"        nodename \u003d resources[\u0027hypervisor_hostname\u0027]"},{"line_number":669,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f485f77_f4766ba4","line":666,"updated":"2017-11-15 11:12:00.000000000","message":"As far as I see this is the only call to _init_compute_node() so I think we don\u0027t need to introduce the extra populate flag just as it is always called with populate\u003dFalse","commit_id":"19973065e486a0acc65c0957b105abe5edf7ee56"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"6529e48235b08404c53ac93290abce5ac060db6d","unresolved":false,"context_lines":[{"line_number":663,"context_line":"        # Populate them at the end of this function to make process"},{"line_number":664,"context_line":"        # more atomic."},{"line_number":665,"context_line":"        # See bug #1729621"},{"line_number":666,"context_line":"        self._init_compute_node(context, resources, populate\u003dFalse)"},{"line_number":667,"context_line":""},{"line_number":668,"context_line":"        nodename \u003d resources[\u0027hypervisor_hostname\u0027]"},{"line_number":669,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f485f77_4d8fed74","line":666,"in_reply_to":"1f485f77_f4766ba4","updated":"2017-11-15 16:05:03.000000000","message":"Agreed. I\u0027ll remove it.","commit_id":"19973065e486a0acc65c0957b105abe5edf7ee56"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"401263c32c62cd2525af73f1b17d9e389bb47392","unresolved":false,"context_lines":[{"line_number":706,"context_line":"        cn.metrics \u003d jsonutils.dumps(metrics)"},{"line_number":707,"context_line":""},{"line_number":708,"context_line":"        # update the compute_node"},{"line_number":709,"context_line":"        self._update(context, cn)"},{"line_number":710,"context_line":"        LOG.debug(\u0027Compute_service record updated for %(host)s:%(node)s\u0027,"},{"line_number":711,"context_line":"                  {\u0027host\u0027: self.host, \u0027node\u0027: nodename})"},{"line_number":712,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1f485f77_8cd94758","side":"PARENT","line":709,"updated":"2017-11-16 14:10:10.000000000","message":"It\u0027s not being executed because _resource_change() returns False","commit_id":"008bc4065da3fe972f1e7f3bc26cf4ca546059db"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"401263c32c62cd2525af73f1b17d9e389bb47392","unresolved":false,"context_lines":[{"line_number":1083,"context_line":"        instances assigned to the local compute host, even if they are not"},{"line_number":1084,"context_line":"        currently powered on."},{"line_number":1085,"context_line":"        \"\"\""},{"line_number":1086,"context_line":"        self.tracked_instances.clear()"},{"line_number":1087,"context_line":""},{"line_number":1088,"context_line":"        cn \u003d self.compute_nodes[nodename]"},{"line_number":1089,"context_line":"        # set some initial values, reserve room for host/hypervisor:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1f485f77_2c96d34d","side":"PARENT","line":1086,"updated":"2017-11-16 14:10:10.000000000","message":"This clean makes _resource_change() to return False.","commit_id":"008bc4065da3fe972f1e7f3bc26cf4ca546059db"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"27aff682c8102fe00dc7843ad811db836335c8f4","unresolved":false,"context_lines":[{"line_number":526,"context_line":"            self.compute_nodes[nodename] \u003d cn"},{"line_number":527,"context_line":"            self._copy_resources(cn, resources)"},{"line_number":528,"context_line":"            self._setup_pci_tracker(context, cn, resources)"},{"line_number":529,"context_line":"            self._update(context, cn)"},{"line_number":530,"context_line":"            return True"},{"line_number":531,"context_line":"        elif len(cn_candidates) \u003e 1:"},{"line_number":532,"context_line":"            LOG.error("}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_c11bccc7","line":529,"range":{"start_line":529,"start_character":12,"end_line":529,"end_character":37},"updated":"2017-12-15 15:47:19.000000000","message":"What about this? I know this is new since you originally wrote this patch.","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"78c13f8dd608e827ec5ff006580933ba000891b2","unresolved":false,"context_lines":[{"line_number":526,"context_line":"            self.compute_nodes[nodename] \u003d cn"},{"line_number":527,"context_line":"            self._copy_resources(cn, resources)"},{"line_number":528,"context_line":"            self._setup_pci_tracker(context, cn, resources)"},{"line_number":529,"context_line":"            self._update(context, cn)"},{"line_number":530,"context_line":"            return True"},{"line_number":531,"context_line":"        elif len(cn_candidates) \u003e 1:"},{"line_number":532,"context_line":"            LOG.error("}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_5da52e46","line":529,"range":{"start_line":529,"start_character":12,"end_line":529,"end_character":37},"in_reply_to":"df87a7cf_3cdf3f3b","updated":"2017-12-18 14:36:56.000000000","message":"Thanks for the catch! I\u0027ll check it and report here.","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"7b66654761546beccf13fb537c9159a7fe8695d4","unresolved":false,"context_lines":[{"line_number":526,"context_line":"            self.compute_nodes[nodename] \u003d cn"},{"line_number":527,"context_line":"            self._copy_resources(cn, resources)"},{"line_number":528,"context_line":"            self._setup_pci_tracker(context, cn, resources)"},{"line_number":529,"context_line":"            self._update(context, cn)"},{"line_number":530,"context_line":"            return True"},{"line_number":531,"context_line":"        elif len(cn_candidates) \u003e 1:"},{"line_number":532,"context_line":"            LOG.error("}],"source_content_type":"text/x-python","patch_set":6,"id":"bf8cb3f7_eef62590","line":529,"range":{"start_line":529,"start_character":12,"end_line":529,"end_character":37},"in_reply_to":"df87a7cf_5da52e46","updated":"2017-12-22 09:29:24.000000000","message":"About _check_for_nodes_rebalance() in _init_compute_node():\nhttps://github.com/openstack/nova/blob/master/nova/compute/resource_tracker.py#L574\n\n\nOk, so - only ironic driver is able to do rebalance, _check_for_nodes_rebalance() function checks it:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/resource_tracker.py#L511\nhttps://github.com/openstack/nova/blob/master/nova/virt/driver.py#L140\n\nSo I think we\u0027re safe.\n\nDouble update (with inconsistency in DB between) could happen only when:\n1) ironic is used\n2) one of nova-computes died\n3) ironic did rebalance\n4) there are some migrations or shutdowned instances in that time (I don\u0027t know ironic, I don\u0027t know if its even possible)\n\nTaking probability of this use-case - we should not deal with it ;]","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"22ebac268758a7a073e2c9a870e9d9689f7d529f","unresolved":false,"context_lines":[{"line_number":526,"context_line":"            self.compute_nodes[nodename] \u003d cn"},{"line_number":527,"context_line":"            self._copy_resources(cn, resources)"},{"line_number":528,"context_line":"            self._setup_pci_tracker(context, cn, resources)"},{"line_number":529,"context_line":"            self._update(context, cn)"},{"line_number":530,"context_line":"            return True"},{"line_number":531,"context_line":"        elif len(cn_candidates) \u003e 1:"},{"line_number":532,"context_line":"            LOG.error("}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_3cdf3f3b","line":529,"range":{"start_line":529,"start_character":12,"end_line":529,"end_character":37},"in_reply_to":"df87a7cf_c11bccc7","updated":"2017-12-15 16:13:50.000000000","message":"Good catch. This way we can still update the DB twice. But I don\u0027t know if this will cause any incomplete data to be persisted.","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"27aff682c8102fe00dc7843ad811db836335c8f4","unresolved":false,"context_lines":[{"line_number":702,"context_line":""},{"line_number":703,"context_line":"        nodename \u003d resources[\u0027hypervisor_hostname\u0027]"},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"        # if we could not init the compute node the tracker will be"},{"line_number":706,"context_line":"        # disabled and we should quit now"},{"line_number":707,"context_line":"        if self.disabled(nodename):"},{"line_number":708,"context_line":"            return"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        # Grab all instances assigned to this node:"},{"line_number":711,"context_line":"        instances \u003d objects.InstanceList.get_by_host_and_node("}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_e1d930f4","line":708,"range":{"start_line":705,"start_character":8,"end_line":708,"end_character":18},"updated":"2017-12-15 15:47:19.000000000","message":"Hmm, what if we get here? We would have never updated the compute node in _init_compute_node above.","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"78c13f8dd608e827ec5ff006580933ba000891b2","unresolved":false,"context_lines":[{"line_number":702,"context_line":""},{"line_number":703,"context_line":"        nodename \u003d resources[\u0027hypervisor_hostname\u0027]"},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"        # if we could not init the compute node the tracker will be"},{"line_number":706,"context_line":"        # disabled and we should quit now"},{"line_number":707,"context_line":"        if self.disabled(nodename):"},{"line_number":708,"context_line":"            return"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        # Grab all instances assigned to this node:"},{"line_number":711,"context_line":"        instances \u003d objects.InstanceList.get_by_host_and_node("}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_7d603202","line":708,"range":{"start_line":705,"start_character":8,"end_line":708,"end_character":18},"in_reply_to":"df87a7cf_3cf5ffed","updated":"2017-12-18 14:36:56.000000000","message":"For this state I think we need to update it anyway.\n\nI could imagine use-case when operator enables the compute (what was previously disabled) and just after that scheduler spawns there a VM (based on different consumption as its in real).\n\nAnd as per its said in:\nhttps://github.com/openstack/nova/blob/62158f4a1220f51617501e869d41c5e77b76e693/nova/db/sqlalchemy/api.py#L733\nWe should update it anyway here.\n\n@Jay what do you think?","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"7b66654761546beccf13fb537c9159a7fe8695d4","unresolved":false,"context_lines":[{"line_number":702,"context_line":""},{"line_number":703,"context_line":"        nodename \u003d resources[\u0027hypervisor_hostname\u0027]"},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"        # if we could not init the compute node the tracker will be"},{"line_number":706,"context_line":"        # disabled and we should quit now"},{"line_number":707,"context_line":"        if self.disabled(nodename):"},{"line_number":708,"context_line":"            return"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        # Grab all instances assigned to this node:"},{"line_number":711,"context_line":"        instances \u003d objects.InstanceList.get_by_host_and_node("}],"source_content_type":"text/x-python","patch_set":6,"id":"bf8cb3f7_ae6a5d7d","line":708,"range":{"start_line":705,"start_character":8,"end_line":708,"end_character":18},"in_reply_to":"df87a7cf_7d603202","updated":"2017-12-22 09:29:24.000000000","message":"But from the other hand:\nhttps://github.com/openstack/nova/blob/master/nova/compute/resource_tracker.py#L480\nIts not being updated while disabled here.\n\nAnd previous implementation (mitaka):\nhttps://github.com/openstack/nova/blob/mitaka-eol/nova/compute/resource_tracker.py#L553\nWe doesn\u0027t do update in this case.\n\nSo after a while I don\u0027t thing we should change anything here. Its better not to update then update with \"half-baked\" data.","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"22ebac268758a7a073e2c9a870e9d9689f7d529f","unresolved":false,"context_lines":[{"line_number":702,"context_line":""},{"line_number":703,"context_line":"        nodename \u003d resources[\u0027hypervisor_hostname\u0027]"},{"line_number":704,"context_line":""},{"line_number":705,"context_line":"        # if we could not init the compute node the tracker will be"},{"line_number":706,"context_line":"        # disabled and we should quit now"},{"line_number":707,"context_line":"        if self.disabled(nodename):"},{"line_number":708,"context_line":"            return"},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"        # Grab all instances assigned to this node:"},{"line_number":711,"context_line":"        instances \u003d objects.InstanceList.get_by_host_and_node("}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_3cf5ffed","line":708,"range":{"start_line":705,"start_character":8,"end_line":708,"end_character":18},"in_reply_to":"df87a7cf_e1d930f4","updated":"2017-12-15 16:13:50.000000000","message":"The comment says that in this case we could not init the compute node so I guess it is OK not to update in the db whatever half baked state we was able to gather. But I agree that we need Jay to look at this.","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"27aff682c8102fe00dc7843ad811db836335c8f4","unresolved":false,"context_lines":[{"line_number":749,"context_line":"        # but it is. This should be changed in ComputeNode"},{"line_number":750,"context_line":"        cn.metrics \u003d jsonutils.dumps(metrics)"},{"line_number":751,"context_line":""},{"line_number":752,"context_line":"        # update the compute_node"},{"line_number":753,"context_line":"        self._update(context, cn)"},{"line_number":754,"context_line":"        LOG.debug(\u0027Compute_service record updated for %(host)s:%(node)s\u0027,"},{"line_number":755,"context_line":"                  {\u0027host\u0027: self.host, \u0027node\u0027: nodename})"},{"line_number":756,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_8164e44a","line":753,"range":{"start_line":752,"start_character":8,"end_line":753,"end_character":33},"updated":"2017-12-15 15:47:19.000000000","message":"So this is where you really want the update to happen, yes? The problem with doing the update once the compute node is created is we don\u0027t have enough information yet, so the scheduler could start picking it based on incomplete information before we gather more information and do our final update - I believe that\u0027s the crux of your issue correct?\n\nAlso, I\u0027m not sure if this makes any difference, but I remember that we *always* update the compute node record even if nothing has changed:\n\nhttps://github.com/openstack/nova/blob/62158f4a1220f51617501e869d41c5e77b76e693/nova/db/sqlalchemy/api.py#L733","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"78c13f8dd608e827ec5ff006580933ba000891b2","unresolved":false,"context_lines":[{"line_number":749,"context_line":"        # but it is. This should be changed in ComputeNode"},{"line_number":750,"context_line":"        cn.metrics \u003d jsonutils.dumps(metrics)"},{"line_number":751,"context_line":""},{"line_number":752,"context_line":"        # update the compute_node"},{"line_number":753,"context_line":"        self._update(context, cn)"},{"line_number":754,"context_line":"        LOG.debug(\u0027Compute_service record updated for %(host)s:%(node)s\u0027,"},{"line_number":755,"context_line":"                  {\u0027host\u0027: self.host, \u0027node\u0027: nodename})"},{"line_number":756,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_b0058112","line":753,"range":{"start_line":752,"start_character":8,"end_line":753,"end_character":33},"in_reply_to":"df87a7cf_3c43bf15","updated":"2017-12-18 14:36:56.000000000","message":"Yes, that\u0027s the exact place where we want to update the compute resources once. For now the refresh of resources is not I could say \"atomic\" (made only once with proper data).\n\nIf there is no change about resource consumption - ComputeNode object would be updated anyway, but once and with proper consumption.","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"22ebac268758a7a073e2c9a870e9d9689f7d529f","unresolved":false,"context_lines":[{"line_number":749,"context_line":"        # but it is. This should be changed in ComputeNode"},{"line_number":750,"context_line":"        cn.metrics \u003d jsonutils.dumps(metrics)"},{"line_number":751,"context_line":""},{"line_number":752,"context_line":"        # update the compute_node"},{"line_number":753,"context_line":"        self._update(context, cn)"},{"line_number":754,"context_line":"        LOG.debug(\u0027Compute_service record updated for %(host)s:%(node)s\u0027,"},{"line_number":755,"context_line":"                  {\u0027host\u0027: self.host, \u0027node\u0027: nodename})"},{"line_number":756,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_3c43bf15","line":753,"range":{"start_line":752,"start_character":8,"end_line":753,"end_character":33},"in_reply_to":"df87a7cf_8164e44a","updated":"2017-12-15 16:13:50.000000000","message":"Yes, this is the expected place to update the DB. Yes, the problem based on the bugreport is that we persist incomplete information (vcpu_used value in the example in the bugreport).","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"2d3412bfcdc01e57458125d36d6bbc42a831ea2f","unresolved":false,"context_lines":[{"line_number":848,"context_line":""},{"line_number":849,"context_line":"    def _update(self, context, compute_node):"},{"line_number":850,"context_line":"        \"\"\"Update partial stats locally and populate them to Scheduler.\"\"\""},{"line_number":851,"context_line":"        if self._resource_change(compute_node):"},{"line_number":852,"context_line":"            # If the compute_node\u0027s resource changed, update to DB."},{"line_number":853,"context_line":"            # NOTE(jianghuaw): Once we completely move to use get_inventory()"},{"line_number":854,"context_line":"            # for all resource provider\u0027s inv data. We can remove this check."}],"source_content_type":"text/x-python","patch_set":6,"id":"df87a7cf_c77ceeb7","line":851,"updated":"2017-12-19 14:08:46.000000000","message":"Note: check if _resource_change() returns True/False in terms of this PR change.","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"7b66654761546beccf13fb537c9159a7fe8695d4","unresolved":false,"context_lines":[{"line_number":848,"context_line":""},{"line_number":849,"context_line":"    def _update(self, context, compute_node):"},{"line_number":850,"context_line":"        \"\"\"Update partial stats locally and populate them to Scheduler.\"\"\""},{"line_number":851,"context_line":"        if self._resource_change(compute_node):"},{"line_number":852,"context_line":"            # If the compute_node\u0027s resource changed, update to DB."},{"line_number":853,"context_line":"            # NOTE(jianghuaw): Once we completely move to use get_inventory()"},{"line_number":854,"context_line":"            # for all resource provider\u0027s inv data. We can remove this check."}],"source_content_type":"text/x-python","patch_set":6,"id":"bf8cb3f7_d16980be","line":851,"in_reply_to":"df87a7cf_c77ceeb7","updated":"2017-12-22 09:29:24.000000000","message":"Checked: While there is no resource change compute_node.save() is not called (on double-update it was).\n\nUpdate of ComputeNode is made by scheduler client in L870:  self.scheduler_client.set_inventory_for_provider()","commit_id":"867b76e27c787948b413812a51b9017fbbc18185"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"4d72b4b4736d1a87843353b11cc97950b6a5c209","unresolved":false,"context_lines":[{"line_number":848,"context_line":""},{"line_number":849,"context_line":"    def _update(self, context, compute_node):"},{"line_number":850,"context_line":"        \"\"\"Update partial stats locally and populate them to Scheduler.\"\"\""},{"line_number":851,"context_line":"        if self._resource_change(compute_node):"},{"line_number":852,"context_line":"            # If the compute_node\u0027s resource changed, update to DB."},{"line_number":853,"context_line":"            # NOTE(jianghuaw): Once we completely move to use get_inventory()"},{"line_number":854,"context_line":"            # for all resource provider\u0027s inv data. We can remove this check."}],"source_content_type":"text/x-python","patch_set":8,"id":"bf8cb3f7_b745ccb5","line":851,"updated":"2017-12-22 13:28:42.000000000","message":"Without any change in resources it says always False, so DB is not updated, and because of that somehow Placement has a problem... I\u0027ll check it later.","commit_id":"5d4038d40ea631c64e5d8edee27a125a08b81176"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d4aa5330eb740907aed1491a04b7c769d6d50a66","unresolved":false,"context_lines":[{"line_number":529,"context_line":"            self.compute_nodes[nodename] \u003d cn"},{"line_number":530,"context_line":"            self._copy_resources(cn, resources)"},{"line_number":531,"context_line":"            self._setup_pci_tracker(context, cn, resources)"},{"line_number":532,"context_line":"            self._update(context, cn)"},{"line_number":533,"context_line":"            return True"},{"line_number":534,"context_line":"        elif len(cn_candidates) \u003e 1:"},{"line_number":535,"context_line":"            LOG.error("}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_9efa2f40","line":532,"range":{"start_line":532,"start_character":12,"end_line":532,"end_character":37},"updated":"2018-08-07 14:24:02.000000000","message":"what about this?","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5d54b6e0251a2c72243f2dd3cbcec89845f0bbd6","unresolved":false,"context_lines":[{"line_number":529,"context_line":"            self.compute_nodes[nodename] \u003d cn"},{"line_number":530,"context_line":"            self._copy_resources(cn, resources)"},{"line_number":531,"context_line":"            self._setup_pci_tracker(context, cn, resources)"},{"line_number":532,"context_line":"            self._update(context, cn)"},{"line_number":533,"context_line":"            return True"},{"line_number":534,"context_line":"        elif len(cn_candidates) \u003e 1:"},{"line_number":535,"context_line":"            LOG.error("}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_1b286684","line":532,"range":{"start_line":532,"start_character":12,"end_line":532,"end_character":37},"in_reply_to":"3f79a3b5_007235e6","updated":"2018-08-07 20:42:40.000000000","message":"OK if we get here we return True and then (follow me below)...","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"803b64e67cf7a2683bcc9ff2d1ef73e8ebb58364","unresolved":false,"context_lines":[{"line_number":529,"context_line":"            self.compute_nodes[nodename] \u003d cn"},{"line_number":530,"context_line":"            self._copy_resources(cn, resources)"},{"line_number":531,"context_line":"            self._setup_pci_tracker(context, cn, resources)"},{"line_number":532,"context_line":"            self._update(context, cn)"},{"line_number":533,"context_line":"            return True"},{"line_number":534,"context_line":"        elif len(cn_candidates) \u003e 1:"},{"line_number":535,"context_line":"            LOG.error("}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_007235e6","line":532,"range":{"start_line":532,"start_character":12,"end_line":532,"end_character":37},"in_reply_to":"3f79a3b5_9efa2f40","updated":"2018-08-07 20:30:55.000000000","message":"Hmm, no idea.\nWithout Ironic this method - _check_for_nodes_rebalance() - is not even called. And for now I\u0027m not able to validate that.\n\nThe main issue is related to flapping resource view during those ComputeNodes updates. I can\u0027t imagine how it could impact Ironic world.","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5d54b6e0251a2c72243f2dd3cbcec89845f0bbd6","unresolved":false,"context_lines":[{"line_number":572,"context_line":"            self._setup_pci_tracker(context, cn, resources)"},{"line_number":573,"context_line":"            return"},{"line_number":574,"context_line":""},{"line_number":575,"context_line":"        if self._check_for_nodes_rebalance(context, resources, nodename):"},{"line_number":576,"context_line":"            return"},{"line_number":577,"context_line":""},{"line_number":578,"context_line":"        # there was no local copy and none in the database"},{"line_number":579,"context_line":"        # so we need to create a new compute node. This needs"}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_db218ea1","line":576,"range":{"start_line":575,"start_character":8,"end_line":576,"end_character":18},"updated":"2018-08-07 20:42:40.000000000","message":"If True, we\u0027ll return from here and (follow below)...","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5d54b6e0251a2c72243f2dd3cbcec89845f0bbd6","unresolved":false,"context_lines":[{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        # initialize the compute node object, creating it"},{"line_number":722,"context_line":"        # if it does not already exist."},{"line_number":723,"context_line":"        self._init_compute_node(context, resources)"},{"line_number":724,"context_line":""},{"line_number":725,"context_line":"        nodename \u003d resources[\u0027hypervisor_hostname\u0027]"},{"line_number":726,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_1b4dc671","line":723,"updated":"2018-08-07 20:42:40.000000000","message":"...if _check_for_nodes_rebalance returned True and we exited early from _init_compute_node, now we\u0027re here and we\u0027ll call _update at the end, so I don\u0027t see a reason to leave the _update call in _check_for_nodes_rebalance.","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":10343,"name":"Jim Rollenhagen","email":"jim@jimrollenhagen.com","username":"jimrollenhagen"},"change_message_id":"a88096392f25fc8e7682c750f34149c704999cb0","unresolved":false,"context_lines":[{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        # initialize the compute node object, creating it"},{"line_number":722,"context_line":"        # if it does not already exist."},{"line_number":723,"context_line":"        self._init_compute_node(context, resources)"},{"line_number":724,"context_line":""},{"line_number":725,"context_line":"        nodename \u003d resources[\u0027hypervisor_hostname\u0027]"},{"line_number":726,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_bb85b2af","line":723,"in_reply_to":"3f79a3b5_1b4dc671","updated":"2018-08-07 21:11:11.000000000","message":"I\u0027m thinking it might fine to remove that call, but... I don\u0027t know everything that _update does and I\u0027m not sure things like _update_usages_from_instances() and such will do the right thing, if we haven\u0027t updated which compute hosts we moved active ironic instances to. \n\nWhich makes me feel like I\u0027m nervous about removing it. :)","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c8dd92e01231543a491d8658b36bf5e809e3a94b","unresolved":false,"context_lines":[{"line_number":720,"context_line":""},{"line_number":721,"context_line":"        # initialize the compute node object, creating it"},{"line_number":722,"context_line":"        # if it does not already exist."},{"line_number":723,"context_line":"        self._init_compute_node(context, resources)"},{"line_number":724,"context_line":""},{"line_number":725,"context_line":"        nodename \u003d resources[\u0027hypervisor_hostname\u0027]"},{"line_number":726,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_1caffde3","line":723,"in_reply_to":"3f79a3b5_bb85b2af","updated":"2018-08-07 22:39:51.000000000","message":"OK, how about we leave it in place for ironic rebalance for now, then we can backport this change (if we want) and keep the ironic rebalance _update removal on master only (and do that in stein).","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d4aa5330eb740907aed1491a04b7c769d6d50a66","unresolved":false,"context_lines":[{"line_number":773,"context_line":"        # but it is. This should be changed in ComputeNode"},{"line_number":774,"context_line":"        cn.metrics \u003d jsonutils.dumps(metrics)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"        # update the compute_node"},{"line_number":777,"context_line":"        self._update(context, cn)"},{"line_number":778,"context_line":"        LOG.debug(\u0027Compute_service record updated for %(host)s:%(node)s\u0027,"},{"line_number":779,"context_line":"                  {\u0027host\u0027: self.host, \u0027node\u0027: nodename})"},{"line_number":780,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_7efdd338","line":777,"range":{"start_line":776,"start_character":8,"end_line":777,"end_character":33},"updated":"2018-08-07 14:24:02.000000000","message":"So this is our only _update call for the normal update_available_resource periodic right? I say \"normal\" since I\u0027m not accounting for ironic node rebalancing.","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"803b64e67cf7a2683bcc9ff2d1ef73e8ebb58364","unresolved":false,"context_lines":[{"line_number":773,"context_line":"        # but it is. This should be changed in ComputeNode"},{"line_number":774,"context_line":"        cn.metrics \u003d jsonutils.dumps(metrics)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"        # update the compute_node"},{"line_number":777,"context_line":"        self._update(context, cn)"},{"line_number":778,"context_line":"        LOG.debug(\u0027Compute_service record updated for %(host)s:%(node)s\u0027,"},{"line_number":779,"context_line":"                  {\u0027host\u0027: self.host, \u0027node\u0027: nodename})"},{"line_number":780,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_00e23504","line":777,"range":{"start_line":776,"start_character":8,"end_line":777,"end_character":33},"in_reply_to":"3f79a3b5_7efdd338","updated":"2018-08-07 20:30:55.000000000","message":"Yep, that\u0027s right. It should be the only place of using this update method, except Ironic and its \u0027_check_for_nodes_rebalance()\u0027 - I have no idea what to do with that.","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d4aa5330eb740907aed1491a04b7c769d6d50a66","unresolved":false,"context_lines":[{"line_number":925,"context_line":"                        e, exception.ResourceProviderUpdateConflict))"},{"line_number":926,"context_line":"    def _update(self, context, compute_node):"},{"line_number":927,"context_line":"        \"\"\"Update partial stats locally and populate them to Scheduler.\"\"\""},{"line_number":928,"context_line":"        if self._resource_change(compute_node):"},{"line_number":929,"context_line":"            # If the compute_node\u0027s resource changed, update to DB."},{"line_number":930,"context_line":"            # NOTE(jianghuaw): Once we completely move to use get_inventory()"},{"line_number":931,"context_line":"            # for all resource provider\u0027s inv data. We can remove this check."}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_b96945bf","line":928,"range":{"start_line":928,"start_character":16,"end_line":928,"end_character":32},"updated":"2018-08-07 14:24:02.000000000","message":"Maciej was saying he thinks we can/should remove this but I\u0027m not entirely sure why - if nothing changed why do we need to update the DB?\n\nThe scheduler HostManager uses the updated_at value here:\n\nhttps://github.com/openstack/nova/blob/536acbfe0572f10ea84f330f2f29b07ca9279114/nova/scheduler/host_manager.py#L194\n\nBut I\u0027m not sure that is really necessary since I40c17ed88f50ecbdedc4daf368fff10e90e7be11 when we stopped caching the host states globally in the scheduler. Meaning, I think we load up the HostState from the compute node data per request (unless you\u0027re using the CachingScheduler).\n\nAnyway, that all seems like dead code at this point.","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5d54b6e0251a2c72243f2dd3cbcec89845f0bbd6","unresolved":false,"context_lines":[{"line_number":925,"context_line":"                        e, exception.ResourceProviderUpdateConflict))"},{"line_number":926,"context_line":"    def _update(self, context, compute_node):"},{"line_number":927,"context_line":"        \"\"\"Update partial stats locally and populate them to Scheduler.\"\"\""},{"line_number":928,"context_line":"        if self._resource_change(compute_node):"},{"line_number":929,"context_line":"            # If the compute_node\u0027s resource changed, update to DB."},{"line_number":930,"context_line":"            # NOTE(jianghuaw): Once we completely move to use get_inventory()"},{"line_number":931,"context_line":"            # for all resource provider\u0027s inv data. We can remove this check."}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_5be6de46","line":928,"range":{"start_line":928,"start_character":16,"end_line":928,"end_character":32},"in_reply_to":"3f79a3b5_609e8964","updated":"2018-08-07 20:42:40.000000000","message":"Wouldn\u0027t that have been the case before though? If there were no changes on this node, the first _update and last _update should both return False for _resource_change, right? Or was there something in between that actually always updated the compute node and resulted in this always returning True even though none of the resource inventory/usage changed? I\u0027d say just leave it because I have to think it was working the same way before unless you know of something different.","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"803b64e67cf7a2683bcc9ff2d1ef73e8ebb58364","unresolved":false,"context_lines":[{"line_number":925,"context_line":"                        e, exception.ResourceProviderUpdateConflict))"},{"line_number":926,"context_line":"    def _update(self, context, compute_node):"},{"line_number":927,"context_line":"        \"\"\"Update partial stats locally and populate them to Scheduler.\"\"\""},{"line_number":928,"context_line":"        if self._resource_change(compute_node):"},{"line_number":929,"context_line":"            # If the compute_node\u0027s resource changed, update to DB."},{"line_number":930,"context_line":"            # NOTE(jianghuaw): Once we completely move to use get_inventory()"},{"line_number":931,"context_line":"            # for all resource provider\u0027s inv data. We can remove this check."}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_609e8964","line":928,"range":{"start_line":928,"start_character":16,"end_line":928,"end_character":32},"in_reply_to":"3f79a3b5_7992cdf8","updated":"2018-08-07 20:30:55.000000000","message":"Hey, so I can confirm that if there is no change in resources (for example after dropping this double-updates with different consumptions) this method always return False.\n\nAs per IRC - if we don\u0027t care about \u0027update\u0027 timestamps in ComputeNode objects - for me its ok to leave it as it is here.","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1ae99b5c62aa7c5e084ec7b10e6082241256e819","unresolved":false,"context_lines":[{"line_number":925,"context_line":"                        e, exception.ResourceProviderUpdateConflict))"},{"line_number":926,"context_line":"    def _update(self, context, compute_node):"},{"line_number":927,"context_line":"        \"\"\"Update partial stats locally and populate them to Scheduler.\"\"\""},{"line_number":928,"context_line":"        if self._resource_change(compute_node):"},{"line_number":929,"context_line":"            # If the compute_node\u0027s resource changed, update to DB."},{"line_number":930,"context_line":"            # NOTE(jianghuaw): Once we completely move to use get_inventory()"},{"line_number":931,"context_line":"            # for all resource provider\u0027s inv data. We can remove this check."}],"source_content_type":"text/x-python","patch_set":9,"id":"3f79a3b5_7992cdf8","line":928,"range":{"start_line":928,"start_character":16,"end_line":928,"end_character":32},"in_reply_to":"3f79a3b5_b96945bf","updated":"2018-08-07 14:45:05.000000000","message":"Hmm, this logic changed in queens:\n\ne2a18a37190e4c7b7697a8811553d331e208182c\n\nSpecifically:\n\nhttps://review.openstack.org/#/c/518294/2/nova/compute/resource_tracker.py@807","commit_id":"c9b74bcfa09d11c2046ce1bfb6dd8463b3a2f3b0"}],"nova/tests/unit/compute/test_resource_tracker.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"973cedab92578226fddc4d24700803dbe945ea17","unresolved":false,"context_lines":[{"line_number":1192,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_by_host_and_nodename\u0027)"},{"line_number":1193,"context_line":"    @mock.patch(\u0027nova.compute.resource_tracker.ResourceTracker.\u0027"},{"line_number":1194,"context_line":"                \u0027_update\u0027)"},{"line_number":1195,"context_line":"    def test_compute_not_populated(self, update_mock, get_mock, create_mock,"},{"line_number":1196,"context_line":"                                   pci_mock):"},{"line_number":1197,"context_line":"        self._setup_rt()"},{"line_number":1198,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_5b2a4de7","line":1195,"updated":"2017-12-15 14:35:33.000000000","message":"As far as I see this is the same test as test_compute_node_loaded","commit_id":"e1d3f9af88824a64fc3165d1aa172c1bf8f3dbbc"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"7590db930d3e57ccd6b38ea147f1d19d41f76890","unresolved":false,"context_lines":[{"line_number":1192,"context_line":"    @mock.patch(\u0027nova.objects.ComputeNode.get_by_host_and_nodename\u0027)"},{"line_number":1193,"context_line":"    @mock.patch(\u0027nova.compute.resource_tracker.ResourceTracker.\u0027"},{"line_number":1194,"context_line":"                \u0027_update\u0027)"},{"line_number":1195,"context_line":"    def test_compute_not_populated(self, update_mock, get_mock, create_mock,"},{"line_number":1196,"context_line":"                                   pci_mock):"},{"line_number":1197,"context_line":"        self._setup_rt()"},{"line_number":1198,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df87a7cf_769de8b9","line":1195,"in_reply_to":"df87a7cf_5b2a4de7","updated":"2017-12-15 14:46:56.000000000","message":"Yes, you\u0027re right. Removing it.","commit_id":"e1d3f9af88824a64fc3165d1aa172c1bf8f3dbbc"}]}
