)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"496e38bb995a4925849eabb2883ff54f582ad803","unresolved":false,"context_lines":[{"line_number":10,"context_line":"Do, this patch makes the report client\u0027s"},{"line_number":11,"context_line":"get_allocations_for_resource_provider method stop acting like something"},{"line_number":12,"context_line":"didn\u0027t go wrong when its placement API request fails. It now raises a"},{"line_number":13,"context_line":"new ResourceProviderAllocationRetrievalFailed exception on non-200, or"},{"line_number":14,"context_line":"PlacementAPIConnectFailure if @safe_connect returns None."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"In the spirit of the aggregate and trait retrieval methods, it now"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5f7c97a3_55934cb1","line":13,"range":{"start_line":13,"start_character":4,"end_line":13,"end_character":45},"updated":"2018-08-02 13:53:30.000000000","message":"say that 10 times as fast. :P","commit_id":"ff62f7914d5c8dcb49b6c9a6703819e44490c8fc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"82e476bb9e94c632e0ec5c52e72d4dbd56e0addd","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Eric Fried \u003cefried@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-08-15 09:47:20 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Make get_allocations_for_resource_provider sane"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In preparation for reshaper work, and because it\u0027s The Right Thing To"},{"line_number":10,"context_line":"Do, this patch makes the report client\u0027s"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3f79a3b5_9f711bab","line":7,"updated":"2018-08-15 15:29:44.000000000","message":"if you respin, would be good to rework this commit summary since it doesn\u0027t describe what the patch does. Something like \"make get_allocations_for_resource_provider() raise exc\" or similar","commit_id":"e00332086be43702ba8e2cbe86188fa2a8a2a0cb"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e959b7d25528b8e2769a8ddbab182b7729ea7334","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Eric Fried \u003cefried@us.ibm.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-08-15 09:47:20 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Make get_allocations_for_resource_provider sane"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In preparation for reshaper work, and because it\u0027s The Right Thing To"},{"line_number":10,"context_line":"Do, this patch makes the report client\u0027s"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3f79a3b5_1a7ef96a","line":7,"in_reply_to":"3f79a3b5_9f711bab","updated":"2018-08-21 17:24:15.000000000","message":"Done","commit_id":"e00332086be43702ba8e2cbe86188fa2a8a2a0cb"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"82e476bb9e94c632e0ec5c52e72d4dbd56e0addd","unresolved":false,"context_lines":[{"line_number":16,"context_line":"ResourceProviderAllocationRetrievalFailed exception on non-200."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"In the spirit of the aggregate and trait retrieval methods, it now"},{"line_number":19,"context_line":"returns a namedtuple containing the provider generation as well as the"},{"line_number":20,"context_line":"allocation information."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Unit tests, which were entirely absent, are added for the method."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3f79a3b5_ff192f21","line":19,"range":{"start_line":19,"start_character":21,"end_line":19,"end_character":55},"updated":"2018-08-15 15:29:44.000000000","message":"this isn\u0027t true any more.","commit_id":"e00332086be43702ba8e2cbe86188fa2a8a2a0cb"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e959b7d25528b8e2769a8ddbab182b7729ea7334","unresolved":false,"context_lines":[{"line_number":16,"context_line":"ResourceProviderAllocationRetrievalFailed exception on non-200."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"In the spirit of the aggregate and trait retrieval methods, it now"},{"line_number":19,"context_line":"returns a namedtuple containing the provider generation as well as the"},{"line_number":20,"context_line":"allocation information."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Unit tests, which were entirely absent, are added for the method."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3f79a3b5_fa921d9f","line":19,"range":{"start_line":19,"start_character":21,"end_line":19,"end_character":55},"in_reply_to":"3f79a3b5_ff192f21","updated":"2018-08-21 17:24:15.000000000","message":"Done","commit_id":"e00332086be43702ba8e2cbe86188fa2a8a2a0cb"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"ec7bd58d858343f9c7bc88053d5dcf1777d2ba84","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"In the spirit of the aggregate and trait retrieval methods, it now"},{"line_number":19,"context_line":"returns a namedtuple containing the provider generation as well as the"},{"line_number":20,"context_line":"allocation information."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Unit tests, which were entirely absent, are added for the method."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3f79a3b5_1f442b46","line":20,"updated":"2018-08-15 15:25:38.000000000","message":"Does it? As far as I can see it only has the \u0027allocations\u0027 key?","commit_id":"e00332086be43702ba8e2cbe86188fa2a8a2a0cb"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e959b7d25528b8e2769a8ddbab182b7729ea7334","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"In the spirit of the aggregate and trait retrieval methods, it now"},{"line_number":19,"context_line":"returns a namedtuple containing the provider generation as well as the"},{"line_number":20,"context_line":"allocation information."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Unit tests, which were entirely absent, are added for the method."},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"3f79a3b5_9a91a99c","line":20,"in_reply_to":"3f79a3b5_1f442b46","updated":"2018-08-21 17:24:15.000000000","message":"Done","commit_id":"e00332086be43702ba8e2cbe86188fa2a8a2a0cb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b725cd9997e7ea48e1dd75c2ad92ce272c6780f7","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"The resource tracker\u0027s _remove_deleted_instances_allocations, which is"},{"line_number":24,"context_line":"get_allocations_for_resource_provider\u0027s only consumer (for now, until"},{"line_number":25,"context_line":"reshaper work starts using it) is refactored to behave the same way it"},{"line_number":26,"context_line":"used to, which is to no-op if the placement API request fails. However,"},{"line_number":27,"context_line":"a) we take an earlier short-circuit out of the method, which saves a"},{"line_number":28,"context_line":"little work copying context stuff; and b) we now emit a warning log"},{"line_number":29,"context_line":"message if the no-op is due to the newly-raised exceptions."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"3f79a3b5_32e2a0d6","line":26,"range":{"start_line":25,"start_character":31,"end_line":26,"end_character":63},"updated":"2018-08-24 15:14:44.000000000","message":"This isn\u0027t really true - it wouldn\u0027t no-op if safe_connect handles an error, because it would return None and then _remove_deleted_instances_allocations would explode with a NoneType error here:\n\nhttps://github.com/openstack/nova/blob/9c867aec01bb516a73463f8a428fed47b1de9918/nova/compute/resource_tracker.py#L1277","commit_id":"f534495a427d1683bc536cf003ec02edbf6d8a45"}],"nova/compute/resource_tracker.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1f53231dabf68478fafadf4d51797dc1524baf0a","unresolved":false,"context_lines":[{"line_number":1248,"context_line":"        # always creates allocations for an instance"},{"line_number":1249,"context_line":"        known_instances \u003d set(self.tracked_instances.keys())"},{"line_number":1250,"context_line":"        try:"},{"line_number":1251,"context_line":"            pai \u003d self.reportclient.get_allocations_for_resource_provider("},{"line_number":1252,"context_line":"                context, cn.uuid)"},{"line_number":1253,"context_line":"        except (exception.ResourceProviderAllocationRetrievalFailed,"},{"line_number":1254,"context_line":"                exception.PlacementAPIConnectFailure) as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_83451d75","line":1251,"updated":"2018-07-23 11:23:33.000000000","message":"I\u0027m unable to identify from context what a \"pai\" is?\n\n[later]\n\noh. ProviderAllocInfo. That\u0027s completely non-obvious _here_.","commit_id":"f7096c7230cee3ce56c9440f383ca3206abfe5a9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"08c7b3bfdbb19258b574fe5309661e6b582fe043","unresolved":false,"context_lines":[{"line_number":1248,"context_line":"        # always creates allocations for an instance"},{"line_number":1249,"context_line":"        known_instances \u003d set(self.tracked_instances.keys())"},{"line_number":1250,"context_line":"        try:"},{"line_number":1251,"context_line":"            pai \u003d self.reportclient.get_allocations_for_resource_provider("},{"line_number":1252,"context_line":"                context, cn.uuid)"},{"line_number":1253,"context_line":"        except (exception.ResourceProviderAllocationRetrievalFailed,"},{"line_number":1254,"context_line":"                exception.PlacementAPIConnectFailure) as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_b6e2cb35","line":1251,"in_reply_to":"5f7c97a3_83451d75","updated":"2018-07-23 19:47:36.000000000","message":"Added helpful comment.\n\nDidn\u0027t want to use something more descriptive because line length.","commit_id":"f7096c7230cee3ce56c9440f383ca3206abfe5a9"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1f53231dabf68478fafadf4d51797dc1524baf0a","unresolved":false,"context_lines":[{"line_number":1254,"context_line":"                exception.PlacementAPIConnectFailure) as e:"},{"line_number":1255,"context_line":"            LOG.warning(\"Skipping removal of allocations for deleted \""},{"line_number":1256,"context_line":"                        \"instances: %s\", e)"},{"line_number":1257,"context_line":"            return"},{"line_number":1258,"context_line":"        allocations \u003d pai.allocations"},{"line_number":1259,"context_line":"        if not allocations:"},{"line_number":1260,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_231be984","line":1257,"updated":"2018-07-23 11:23:33.000000000","message":"The hope here is that the next time round the periodic job whatever went wrong might be better?","commit_id":"f7096c7230cee3ce56c9440f383ca3206abfe5a9"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"08c7b3bfdbb19258b574fe5309661e6b582fe043","unresolved":false,"context_lines":[{"line_number":1254,"context_line":"                exception.PlacementAPIConnectFailure) as e:"},{"line_number":1255,"context_line":"            LOG.warning(\"Skipping removal of allocations for deleted \""},{"line_number":1256,"context_line":"                        \"instances: %s\", e)"},{"line_number":1257,"context_line":"            return"},{"line_number":1258,"context_line":"        allocations \u003d pai.allocations"},{"line_number":1259,"context_line":"        if not allocations:"},{"line_number":1260,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_b6cbaba5","line":1257,"in_reply_to":"5f7c97a3_231be984","updated":"2018-07-23 19:47:36.000000000","message":"I actually have no idea; I\u0027m just retrofitting the existing behavior. In general, there seem to be a lot of places in the report client where we silently ignore failures. In this case at least we\u0027re no longer silent, but I didn\u0027t presume to \"fix\" the part where we\u0027re ignoring the failure.","commit_id":"f7096c7230cee3ce56c9440f383ca3206abfe5a9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e3b12f089c0af32695f8758d3e836887e47feb75","unresolved":false,"context_lines":[{"line_number":1269,"context_line":"                        \"instances: %s\", e)"},{"line_number":1270,"context_line":"            return"},{"line_number":1271,"context_line":"        allocations \u003d pai.allocations"},{"line_number":1272,"context_line":"        if not allocations:"},{"line_number":1273,"context_line":"            return"},{"line_number":1274,"context_line":"        read_deleted_context \u003d context.elevated(read_deleted\u003d\u0027yes\u0027)"},{"line_number":1275,"context_line":"        for consumer_uuid, alloc in allocations.items():"},{"line_number":1276,"context_line":"            if consumer_uuid in known_instances:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_2b067675","line":1273,"range":{"start_line":1272,"start_character":0,"end_line":1273,"end_character":18},"updated":"2018-08-02 09:30:34.000000000","message":"This is an unnecessary extra exit point. The below loop will be noop anyhow if allocations is []","commit_id":"ff62f7914d5c8dcb49b6c9a6703819e44490c8fc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"496e38bb995a4925849eabb2883ff54f582ad803","unresolved":false,"context_lines":[{"line_number":1269,"context_line":"                        \"instances: %s\", e)"},{"line_number":1270,"context_line":"            return"},{"line_number":1271,"context_line":"        allocations \u003d pai.allocations"},{"line_number":1272,"context_line":"        if not allocations:"},{"line_number":1273,"context_line":"            return"},{"line_number":1274,"context_line":"        read_deleted_context \u003d context.elevated(read_deleted\u003d\u0027yes\u0027)"},{"line_number":1275,"context_line":"        for consumer_uuid, alloc in allocations.items():"},{"line_number":1276,"context_line":"            if consumer_uuid in known_instances:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_b5b4201f","line":1273,"range":{"start_line":1272,"start_character":0,"end_line":1273,"end_character":18},"in_reply_to":"5f7c97a3_2b067675","updated":"2018-08-02 13:53:30.000000000","message":"+1","commit_id":"ff62f7914d5c8dcb49b6c9a6703819e44490c8fc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e959b7d25528b8e2769a8ddbab182b7729ea7334","unresolved":false,"context_lines":[{"line_number":1269,"context_line":"                        \"instances: %s\", e)"},{"line_number":1270,"context_line":"            return"},{"line_number":1271,"context_line":"        allocations \u003d pai.allocations"},{"line_number":1272,"context_line":"        if not allocations:"},{"line_number":1273,"context_line":"            return"},{"line_number":1274,"context_line":"        read_deleted_context \u003d context.elevated(read_deleted\u003d\u0027yes\u0027)"},{"line_number":1275,"context_line":"        for consumer_uuid, alloc in allocations.items():"},{"line_number":1276,"context_line":"            if consumer_uuid in known_instances:"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_ba458545","line":1273,"range":{"start_line":1272,"start_character":0,"end_line":1273,"end_character":18},"in_reply_to":"5f7c97a3_88cbfa7d","updated":"2018-08-21 17:24:15.000000000","message":"Added code comment","commit_id":"ff62f7914d5c8dcb49b6c9a6703819e44490c8fc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c76c1d57933e3a056a25031282f3784706c6911b","unresolved":false,"context_lines":[{"line_number":1269,"context_line":"                        \"instances: %s\", e)"},{"line_number":1270,"context_line":"            return"},{"line_number":1271,"context_line":"        allocations \u003d pai.allocations"},{"line_number":1272,"context_line":"        if not allocations:"},{"line_number":1273,"context_line":"            return"},{"line_number":1274,"context_line":"        read_deleted_context \u003d context.elevated(read_deleted\u003d\u0027yes\u0027)"},{"line_number":1275,"context_line":"        for consumer_uuid, alloc in allocations.items():"},{"line_number":1276,"context_line":"            if consumer_uuid in known_instances:"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_88cbfa7d","line":1273,"range":{"start_line":1272,"start_character":0,"end_line":1273,"end_character":18},"in_reply_to":"5f7c97a3_b5b4201f","updated":"2018-08-02 22:19:40.000000000","message":"I wanted to skip context.elevated on the next line, since that does some nontrivial deepcopying (as noted in the commit message).","commit_id":"ff62f7914d5c8dcb49b6c9a6703819e44490c8fc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4978c11096f910f11b290ea0bd5a3f225aab72bf","unresolved":false,"context_lines":[{"line_number":1281,"context_line":"                context, cn.uuid)"},{"line_number":1282,"context_line":"        except (exception.ResourceProviderAllocationRetrievalFailed,"},{"line_number":1283,"context_line":"                ks_exc.ClientException) as e:"},{"line_number":1284,"context_line":"            LOG.warning(\"Skipping removal of allocations for deleted \""},{"line_number":1285,"context_line":"                        \"instances: %s\", e)"},{"line_number":1286,"context_line":"            return"},{"line_number":1287,"context_line":"        allocations \u003d pai.allocations"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_063591da","line":1284,"range":{"start_line":1284,"start_character":16,"end_line":1284,"end_character":23},"updated":"2018-08-06 12:41:49.000000000","message":"I\u0027d even go so far as to make this an error, not warning. I mean, we require nova-compute to be able to communicate with placement now (though @safe_connect has of course been hiding communication issues). Might as well log an error here instead of a warning.\n\nThat doesn\u0027t mean that we should fail here -- we still need to keep the nova-compute service up and running after all. I just think logging an error here is appropriate at this point in the dependency lifecycle between nova-compute and placement.","commit_id":"e0d4e68e99edee58d8dc8a17251f513a8cb65ad2"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a0e484d19437d0bed24e579ec2c3f121ae71a0fa","unresolved":false,"context_lines":[{"line_number":1281,"context_line":"                context, cn.uuid)"},{"line_number":1282,"context_line":"        except (exception.ResourceProviderAllocationRetrievalFailed,"},{"line_number":1283,"context_line":"                ks_exc.ClientException) as e:"},{"line_number":1284,"context_line":"            LOG.warning(\"Skipping removal of allocations for deleted \""},{"line_number":1285,"context_line":"                        \"instances: %s\", e)"},{"line_number":1286,"context_line":"            return"},{"line_number":1287,"context_line":"        allocations \u003d pai.allocations"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_d2998f1f","line":1284,"range":{"start_line":1284,"start_character":16,"end_line":1284,"end_character":23},"in_reply_to":"3f79a3b5_063591da","updated":"2018-08-06 16:52:25.000000000","message":"Done","commit_id":"e0d4e68e99edee58d8dc8a17251f513a8cb65ad2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4978c11096f910f11b290ea0bd5a3f225aab72bf","unresolved":false,"context_lines":[{"line_number":1332,"context_line":"                          \"instance against this compute host: %s.\","},{"line_number":1333,"context_line":"                          instance_uuid, alloc)"},{"line_number":1334,"context_line":"                self.reportclient.delete_allocation_for_instance(context,"},{"line_number":1335,"context_line":"                                                                 instance_uuid)"},{"line_number":1336,"context_line":"                continue"},{"line_number":1337,"context_line":"            if not instance.host:"},{"line_number":1338,"context_line":"                # Allocations related to instances being scheduled should not"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_23043f17","line":1335,"updated":"2018-08-06 12:41:49.000000000","message":"will you eventually pass the consumer generation to this method?","commit_id":"e0d4e68e99edee58d8dc8a17251f513a8cb65ad2"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a0e484d19437d0bed24e579ec2c3f121ae71a0fa","unresolved":false,"context_lines":[{"line_number":1332,"context_line":"                          \"instance against this compute host: %s.\","},{"line_number":1333,"context_line":"                          instance_uuid, alloc)"},{"line_number":1334,"context_line":"                self.reportclient.delete_allocation_for_instance(context,"},{"line_number":1335,"context_line":"                                                                 instance_uuid)"},{"line_number":1336,"context_line":"                continue"},{"line_number":1337,"context_line":"            if not instance.host:"},{"line_number":1338,"context_line":"                # Allocations related to instances being scheduled should not"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_77b74d88","line":1335,"in_reply_to":"3f79a3b5_23043f17","updated":"2018-08-06 16:52:25.000000000","message":"I wouldn\u0027t think so, since it uses the DELETE method, which doesn\u0027t take a generation. And this is one of those code paths where we\u0027re sure we want to delete the allocation, not worry about races, right?\n\nOr is it possible to get here with, say, a shelved instance that has since been unshelved, and we end up deleting its allocations erroneously?\n\nIn which case we shouldn\u0027t be calling DELETE at all; we should be calling PUT with empty allocations (and the appropriate generation).","commit_id":"e0d4e68e99edee58d8dc8a17251f513a8cb65ad2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ff88cb82d1951c50f18651fb28a2c99869da44f9","unresolved":false,"context_lines":[{"line_number":1272,"context_line":"        # always creates allocations for an instance"},{"line_number":1273,"context_line":"        known_instances \u003d set(self.tracked_instances.keys())"},{"line_number":1274,"context_line":"        allocations \u003d self.reportclient.get_allocations_for_resource_provider("},{"line_number":1275,"context_line":"                context, cn.uuid) or {}"},{"line_number":1276,"context_line":"        read_deleted_context \u003d context.elevated(read_deleted\u003d\u0027yes\u0027)"},{"line_number":1277,"context_line":"        for consumer_uuid, alloc in allocations.items():"},{"line_number":1278,"context_line":"            if consumer_uuid in known_instances:"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_329aa013","side":"PARENT","line":1275,"range":{"start_line":1275,"start_character":33,"end_line":1275,"end_character":39},"updated":"2018-08-24 15:19:14.000000000","message":"SOB","commit_id":"d13e5a5011af75cfb6141a6b5d6aaf0f1a042aeb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b725cd9997e7ea48e1dd75c2ad92ce272c6780f7","unresolved":false,"context_lines":[{"line_number":1278,"context_line":"                context, cn.uuid)"},{"line_number":1279,"context_line":"        except (exception.ResourceProviderAllocationRetrievalFailed,"},{"line_number":1280,"context_line":"                ks_exc.ClientException) as e:"},{"line_number":1281,"context_line":"            LOG.error(\"Skipping removal of allocations for deleted instances: \""},{"line_number":1282,"context_line":"                      \"%s\", e)"},{"line_number":1283,"context_line":"            return"},{"line_number":1284,"context_line":"        allocations \u003d pai.allocations"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_1208c48f","line":1281,"updated":"2018-08-24 15:14:44.000000000","message":"As noted in the commit message, if safe_connect handled an error and returned None before, we\u0027d shit the bed on allocations.items() with a NoneType error before this, so you\u0027ve changed the behavior. Having said that, I\u0027m not sure if hard failing or logging and continuing is the right thing to do here. This method is currently only called from the update_available_resource periodic task entry point, so intermittent failures to connect to placement would resolve themselves (hopefully) on the next run on the periodic task.","commit_id":"f534495a427d1683bc536cf003ec02edbf6d8a45"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d6accb62d92971ca236ab1b8b4f442bd4a75c8ef","unresolved":false,"context_lines":[{"line_number":1278,"context_line":"                context, cn.uuid)"},{"line_number":1279,"context_line":"        except (exception.ResourceProviderAllocationRetrievalFailed,"},{"line_number":1280,"context_line":"                ks_exc.ClientException) as e:"},{"line_number":1281,"context_line":"            LOG.error(\"Skipping removal of allocations for deleted instances: \""},{"line_number":1282,"context_line":"                      \"%s\", e)"},{"line_number":1283,"context_line":"            return"},{"line_number":1284,"context_line":"        allocations \u003d pai.allocations"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_2712a456","line":1281,"in_reply_to":"3f79a3b5_0afaab41","updated":"2018-10-10 21:41:15.000000000","message":"https://review.openstack.org/#/c/609552/","commit_id":"f534495a427d1683bc536cf003ec02edbf6d8a45"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"fc22522698aea32cec41f6df3dc1002b8c30ee71","unresolved":false,"context_lines":[{"line_number":1278,"context_line":"                context, cn.uuid)"},{"line_number":1279,"context_line":"        except (exception.ResourceProviderAllocationRetrievalFailed,"},{"line_number":1280,"context_line":"                ks_exc.ClientException) as e:"},{"line_number":1281,"context_line":"            LOG.error(\"Skipping removal of allocations for deleted instances: \""},{"line_number":1282,"context_line":"                      \"%s\", e)"},{"line_number":1283,"context_line":"            return"},{"line_number":1284,"context_line":"        allocations \u003d pai.allocations"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_d29c8c0f","line":1281,"in_reply_to":"3f79a3b5_1208c48f","updated":"2018-08-24 15:19:00.000000000","message":"The NoneType error was avoided by the `or {}` in the original.","commit_id":"f534495a427d1683bc536cf003ec02edbf6d8a45"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0e66e89f9eb548494eadbe8911c755e2c342024d","unresolved":false,"context_lines":[{"line_number":1278,"context_line":"                context, cn.uuid)"},{"line_number":1279,"context_line":"        except (exception.ResourceProviderAllocationRetrievalFailed,"},{"line_number":1280,"context_line":"                ks_exc.ClientException) as e:"},{"line_number":1281,"context_line":"            LOG.error(\"Skipping removal of allocations for deleted instances: \""},{"line_number":1282,"context_line":"                      \"%s\", e)"},{"line_number":1283,"context_line":"            return"},{"line_number":1284,"context_line":"        allocations \u003d pai.allocations"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_0afaab41","line":1281,"in_reply_to":"3f79a3b5_8bde613c","updated":"2018-09-07 20:06:29.000000000","message":"\"in that case\" being 404 specifically? Or attempt to detect startup somehow?","commit_id":"f534495a427d1683bc536cf003ec02edbf6d8a45"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6089528dcd2b3a87a1722ea16ba2622aa7502f2a","unresolved":false,"context_lines":[{"line_number":1278,"context_line":"                context, cn.uuid)"},{"line_number":1279,"context_line":"        except (exception.ResourceProviderAllocationRetrievalFailed,"},{"line_number":1280,"context_line":"                ks_exc.ClientException) as e:"},{"line_number":1281,"context_line":"            LOG.error(\"Skipping removal of allocations for deleted instances: \""},{"line_number":1282,"context_line":"                      \"%s\", e)"},{"line_number":1283,"context_line":"            return"},{"line_number":1284,"context_line":"        allocations \u003d pai.allocations"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_8bde613c","line":1281,"in_reply_to":"3f79a3b5_d29c8c0f","updated":"2018-08-30 20:29:51.000000000","message":"We\u0027re hitting this error on first startup now after the compute node is created but before the resource provider is created in placement, as seen here:\n\nhttp://dd6b71949550285df7dc-dda4e480e005aaa13ec303551d2d8155.r49.cf1.rackcdn.com/13/597613/2/check/dsvm-tempest-neutron-network/621833d/logs/screen-n-cpu.txt.gz\n\nAug 30 08:02:11.443289 dsvm-devstack-citrix-lon-nodepool-1379396 nova-compute[24292]: ERROR nova.compute.resource_tracker [None req-f4b08178-4b7a-4fba-b57a-91612721f970 None None] Skipping removal of allocations for deleted instances: Failed to retrieve allocations for resource provider 9c58942c-d183-455a-a760-991e4430e816: {\"errors\": [{\"status\": 404, \"request_id\": \"req-4320441c-fb31-4120-afb5-c862d3645371\", \"detail\": \"The resource could not be found.\\n\\n Resource provider \u00279c58942c-d183-455a-a760-991e4430e816\u0027 not found: No resource provider with uuid 9c58942c-d183-455a-a760-991e4430e816 found  \", \"title\": \"Not Found\"}]}: ResourceProviderAllocationRetrievalFailed: Failed to retrieve allocations for resource provider 9c58942c-d183-455a-a760-991e4430e816: {\"errors\": [{\"status\": 404, \"request_id\": \"req-4320441c-fb31-4120-afb5-c862d3645371\", \"detail\": \"The resource could not be found.\\n\\n Resource provider \u00279c58942c-d183-455a-a760-991e4430e816\u0027 not found: No resource provider with uuid 9c58942c-d183-455a-a760-991e4430e816 found  \", \"title\": \"Not Found\"}]}\n\nWe should probably not ERROR log in that case.","commit_id":"f534495a427d1683bc536cf003ec02edbf6d8a45"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"496e38bb995a4925849eabb2883ff54f582ad803","unresolved":false,"context_lines":[{"line_number":58,"context_line":"AggInfo \u003d collections.namedtuple(\u0027AggInfo\u0027, [\u0027aggregates\u0027, \u0027generation\u0027])"},{"line_number":59,"context_line":"TraitInfo \u003d collections.namedtuple(\u0027TraitInfo\u0027, [\u0027traits\u0027, \u0027generation\u0027])"},{"line_number":60,"context_line":"ProviderAllocInfo \u003d collections.namedtuple("},{"line_number":61,"context_line":"    \u0027ProviderAllocInfo\u0027, [\u0027allocations\u0027, \u0027resource_provider_generation\u0027])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def warn_limit(self, msg):"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_956564b3","line":61,"range":{"start_line":61,"start_character":42,"end_line":61,"end_character":71},"updated":"2018-08-02 13:53:30.000000000","message":"is there a reason to make this resource_provider_generation instead of just generation like AggInfo and TraitInfo have?","commit_id":"ff62f7914d5c8dcb49b6c9a6703819e44490c8fc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c76c1d57933e3a056a25031282f3784706c6911b","unresolved":false,"context_lines":[{"line_number":58,"context_line":"AggInfo \u003d collections.namedtuple(\u0027AggInfo\u0027, [\u0027aggregates\u0027, \u0027generation\u0027])"},{"line_number":59,"context_line":"TraitInfo \u003d collections.namedtuple(\u0027TraitInfo\u0027, [\u0027traits\u0027, \u0027generation\u0027])"},{"line_number":60,"context_line":"ProviderAllocInfo \u003d collections.namedtuple("},{"line_number":61,"context_line":"    \u0027ProviderAllocInfo\u0027, [\u0027allocations\u0027, \u0027resource_provider_generation\u0027])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def warn_limit(self, msg):"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_a8b916ec","line":61,"range":{"start_line":61,"start_character":42,"end_line":61,"end_character":71},"in_reply_to":"5f7c97a3_956564b3","updated":"2018-08-02 22:19:40.000000000","message":"To make sure it isn\u0027t confused with consumer generation, since we\u0027re talking about allocations. It\u0027s \"obvious\" that it couldn\u0027t be consumer generation, since there might be more than one consumer in the response; and we hint at the context by the name of the thing starting with \"Provider\", but I didn\u0027t want the reader to have to noodle that out every time they saw this.","commit_id":"ff62f7914d5c8dcb49b6c9a6703819e44490c8fc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"496e38bb995a4925849eabb2883ff54f582ad803","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                   if global_request_id else {})"},{"line_number":289,"context_line":"        return self._client.get(url, microversion\u003dversion, headers\u003dheaders)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def strict_get(self, *args, **kwargs):"},{"line_number":292,"context_line":"        @safe_connect"},{"line_number":293,"context_line":"        def safe_get(celf, *args, **kwargs):"},{"line_number":294,"context_line":"            return celf.get(*args, **kwargs)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        resp \u003d safe_get(self, *args, **kwargs)"},{"line_number":297,"context_line":"        if resp is None:"},{"line_number":298,"context_line":"            # safe_connect bogosity"},{"line_number":299,"context_line":"            raise exception.PlacementAPIConnectFailure()"},{"line_number":300,"context_line":"        return resp"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def post(self, url, data, version\u003dNone, global_request_id\u003dNone):"},{"line_number":303,"context_line":"        headers \u003d ({request_id.INBOUND_HEADER: global_request_id}"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_75d0c82b","line":300,"range":{"start_line":291,"start_character":0,"end_line":300,"end_character":19},"updated":"2018-08-02 13:53:30.000000000","message":"I suppose this is fine, but it seems it would be cleaner/easier to just remove the @safe_connect decorator on get_allocations_for_resource_provider() and catch the few exceptions that may be raised from connection failures at the calling site of get_allocations_for_resource_provider().","commit_id":"ff62f7914d5c8dcb49b6c9a6703819e44490c8fc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c76c1d57933e3a056a25031282f3784706c6911b","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                   if global_request_id else {})"},{"line_number":289,"context_line":"        return self._client.get(url, microversion\u003dversion, headers\u003dheaders)"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"    def strict_get(self, *args, **kwargs):"},{"line_number":292,"context_line":"        @safe_connect"},{"line_number":293,"context_line":"        def safe_get(celf, *args, **kwargs):"},{"line_number":294,"context_line":"            return celf.get(*args, **kwargs)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"        resp \u003d safe_get(self, *args, **kwargs)"},{"line_number":297,"context_line":"        if resp is None:"},{"line_number":298,"context_line":"            # safe_connect bogosity"},{"line_number":299,"context_line":"            raise exception.PlacementAPIConnectFailure()"},{"line_number":300,"context_line":"        return resp"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def post(self, url, data, version\u003dNone, global_request_id\u003dNone):"},{"line_number":303,"context_line":"        headers \u003d ({request_id.INBOUND_HEADER: global_request_id}"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_88b0dae1","line":300,"range":{"start_line":291,"start_character":0,"end_line":300,"end_character":19},"in_reply_to":"5f7c97a3_75d0c82b","updated":"2018-08-02 22:19:40.000000000","message":"Okay. This will mean callers will be trapping ks_exc.ClientException, which isn\u0027t as clear/understandable as PlacementAPIConnectFailure, but I can live with it.","commit_id":"ff62f7914d5c8dcb49b6c9a6703819e44490c8fc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e3b12f089c0af32695f8758d3e836887e47feb75","unresolved":false,"context_lines":[{"line_number":1955,"context_line":"        url \u003d \u0027/resource_providers/%s/allocations\u0027 % rp_uuid"},{"line_number":1956,"context_line":"        resp \u003d self.strict_get(url, global_request_id\u003dcontext.global_id)"},{"line_number":1957,"context_line":"        if not resp:"},{"line_number":1958,"context_line":"            raise exception.ResourceProviderAllocationRetrievalFailed("},{"line_number":1959,"context_line":"                rp_uuid\u003drp_uuid, error\u003dresp.text)"},{"line_number":1960,"context_line":""},{"line_number":1961,"context_line":"        data \u003d resp.json()"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_6b48ee88","line":1958,"range":{"start_line":1958,"start_character":28,"end_line":1958,"end_character":69},"updated":"2018-08-02 09:30:34.000000000","message":"does getting PlacementAPIConnectFailure from strict_get also means ResourceProviderAllocationRetrievalFailed for our caller?","commit_id":"ff62f7914d5c8dcb49b6c9a6703819e44490c8fc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c76c1d57933e3a056a25031282f3784706c6911b","unresolved":false,"context_lines":[{"line_number":1955,"context_line":"        url \u003d \u0027/resource_providers/%s/allocations\u0027 % rp_uuid"},{"line_number":1956,"context_line":"        resp \u003d self.strict_get(url, global_request_id\u003dcontext.global_id)"},{"line_number":1957,"context_line":"        if not resp:"},{"line_number":1958,"context_line":"            raise exception.ResourceProviderAllocationRetrievalFailed("},{"line_number":1959,"context_line":"                rp_uuid\u003drp_uuid, error\u003dresp.text)"},{"line_number":1960,"context_line":""},{"line_number":1961,"context_line":"        data \u003d resp.json()"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f7c97a3_08760a42","line":1958,"range":{"start_line":1958,"start_character":28,"end_line":1958,"end_character":69},"in_reply_to":"5f7c97a3_6b48ee88","updated":"2018-08-02 22:19:40.000000000","message":"I\u0027m deliberately leaving that up to the caller. That\u0027s pretty much the point of this patch.","commit_id":"ff62f7914d5c8dcb49b6c9a6703819e44490c8fc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4978c11096f910f11b290ea0bd5a3f225aab72bf","unresolved":false,"context_lines":[{"line_number":58,"context_line":"AggInfo \u003d collections.namedtuple(\u0027AggInfo\u0027, [\u0027aggregates\u0027, \u0027generation\u0027])"},{"line_number":59,"context_line":"TraitInfo \u003d collections.namedtuple(\u0027TraitInfo\u0027, [\u0027traits\u0027, \u0027generation\u0027])"},{"line_number":60,"context_line":"ProviderAllocInfo \u003d collections.namedtuple("},{"line_number":61,"context_line":"    \u0027ProviderAllocInfo\u0027, [\u0027allocations\u0027, \u0027resource_provider_generation\u0027])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def warn_limit(self, msg):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_a6a93de0","line":61,"range":{"start_line":61,"start_character":40,"end_line":61,"end_character":71},"updated":"2018-08-06 12:41:49.000000000","message":"this field is unused. I\u0027d prefer to add it only if/when we would use this information. cool to have a namedtuple return type. just would prefer leaving off this attribute until we use it.","commit_id":"e0d4e68e99edee58d8dc8a17251f513a8cb65ad2"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a0e484d19437d0bed24e579ec2c3f121ae71a0fa","unresolved":false,"context_lines":[{"line_number":58,"context_line":"AggInfo \u003d collections.namedtuple(\u0027AggInfo\u0027, [\u0027aggregates\u0027, \u0027generation\u0027])"},{"line_number":59,"context_line":"TraitInfo \u003d collections.namedtuple(\u0027TraitInfo\u0027, [\u0027traits\u0027, \u0027generation\u0027])"},{"line_number":60,"context_line":"ProviderAllocInfo \u003d collections.namedtuple("},{"line_number":61,"context_line":"    \u0027ProviderAllocInfo\u0027, [\u0027allocations\u0027, \u0027resource_provider_generation\u0027])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def warn_limit(self, msg):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_729e7b08","line":61,"range":{"start_line":61,"start_character":40,"end_line":61,"end_character":71},"in_reply_to":"3f79a3b5_a6a93de0","updated":"2018-08-06 16:52:25.000000000","message":"Okay.","commit_id":"e0d4e68e99edee58d8dc8a17251f513a8cb65ad2"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"ec7bd58d858343f9c7bc88053d5dcf1777d2ba84","unresolved":false,"context_lines":[{"line_number":58,"context_line":"AggInfo \u003d collections.namedtuple(\u0027AggInfo\u0027, [\u0027aggregates\u0027, \u0027generation\u0027])"},{"line_number":59,"context_line":"TraitInfo \u003d collections.namedtuple(\u0027TraitInfo\u0027, [\u0027traits\u0027, \u0027generation\u0027])"},{"line_number":60,"context_line":"ProviderAllocInfo \u003d collections.namedtuple("},{"line_number":61,"context_line":"    \u0027ProviderAllocInfo\u0027, [\u0027allocations\u0027])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def warn_limit(self, msg):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_ff1a8f6c","line":61,"updated":"2018-08-15 15:25:38.000000000","message":"where is generation? commit message indicates it is expected. On the query made, it is rp generation that would be available, not consumer","commit_id":"e00332086be43702ba8e2cbe86188fa2a8a2a0cb"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"82e476bb9e94c632e0ec5c52e72d4dbd56e0addd","unresolved":false,"context_lines":[{"line_number":58,"context_line":"AggInfo \u003d collections.namedtuple(\u0027AggInfo\u0027, [\u0027aggregates\u0027, \u0027generation\u0027])"},{"line_number":59,"context_line":"TraitInfo \u003d collections.namedtuple(\u0027TraitInfo\u0027, [\u0027traits\u0027, \u0027generation\u0027])"},{"line_number":60,"context_line":"ProviderAllocInfo \u003d collections.namedtuple("},{"line_number":61,"context_line":"    \u0027ProviderAllocInfo\u0027, [\u0027allocations\u0027])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def warn_limit(self, msg):"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f79a3b5_7f0d1fe6","line":61,"in_reply_to":"3f79a3b5_ff1a8f6c","updated":"2018-08-15 15:29:44.000000000","message":"I asked that generation be removed from the namedtuple since it was not being used anywhere.","commit_id":"e00332086be43702ba8e2cbe86188fa2a8a2a0cb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b725cd9997e7ea48e1dd75c2ad92ce272c6780f7","unresolved":false,"context_lines":[{"line_number":58,"context_line":"AggInfo \u003d collections.namedtuple(\u0027AggInfo\u0027, [\u0027aggregates\u0027, \u0027generation\u0027])"},{"line_number":59,"context_line":"TraitInfo \u003d collections.namedtuple(\u0027TraitInfo\u0027, [\u0027traits\u0027, \u0027generation\u0027])"},{"line_number":60,"context_line":"ProviderAllocInfo \u003d collections.namedtuple("},{"line_number":61,"context_line":"    \u0027ProviderAllocInfo\u0027, [\u0027allocations\u0027])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def warn_limit(self, msg):"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_7241f8a5","line":61,"updated":"2018-08-24 15:14:44.000000000","message":"So I guess this is groundwork for adding the generation in later?","commit_id":"f534495a427d1683bc536cf003ec02edbf6d8a45"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"50cf262208c3885eeaa7ed65a989bb1f0a21c932","unresolved":false,"context_lines":[{"line_number":58,"context_line":"AggInfo \u003d collections.namedtuple(\u0027AggInfo\u0027, [\u0027aggregates\u0027, \u0027generation\u0027])"},{"line_number":59,"context_line":"TraitInfo \u003d collections.namedtuple(\u0027TraitInfo\u0027, [\u0027traits\u0027, \u0027generation\u0027])"},{"line_number":60,"context_line":"ProviderAllocInfo \u003d collections.namedtuple("},{"line_number":61,"context_line":"    \u0027ProviderAllocInfo\u0027, [\u0027allocations\u0027])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def warn_limit(self, msg):"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f79a3b5_9db85c11","line":61,"in_reply_to":"3f79a3b5_7241f8a5","updated":"2018-08-24 22:28:08.000000000","message":"Yeah, it was in there in earlier patch sets, but I was asked to remove it because it wasn\u0027t being used.","commit_id":"f534495a427d1683bc536cf003ec02edbf6d8a45"}]}
