)]}'
{"nova/compute/api.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"739819ca1da02a35f78d4ce9944481c230d3fd28","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"                    members \u003d objects.InstanceGroup.add_members("},{"line_number":1070,"context_line":"                        context, instance_group.uuid, [instance.uuid])"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"                    # NOTE(melwitt): We recheck the quota after creating the"},{"line_number":1073,"context_line":"                    # object to prevent users from allocating more resources"},{"line_number":1074,"context_line":"                    # than their allowed quota in the event of a race. This is"},{"line_number":1075,"context_line":"                    # configurable because it can be expensive if strict quota"},{"line_number":1076,"context_line":"                    # limits are not required in a deployment."},{"line_number":1077,"context_line":"                    if CONF.quota.recheck_quota and check_server_group_quota:"},{"line_number":1078,"context_line":"                        try:"},{"line_number":1079,"context_line":"                            objects.Quotas.check_deltas("}],"source_content_type":"text/x-python","patch_set":17,"id":"bf091321_6859cf58","line":1076,"range":{"start_line":1072,"start_character":20,"end_line":1076,"end_character":62},"updated":"2017-06-08 17:11:32.000000000","message":"I wonder if we should shorten this?\n\nI just worry about when this changes slightly and things get out of sync across all the places this appears.","commit_id":"a10876711fcfe86ac3029ac2d7315538de980435"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"126ec1c2086444e31ae592ffb5b1e8d04e42692c","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"                    members \u003d objects.InstanceGroup.add_members("},{"line_number":1070,"context_line":"                        context, instance_group.uuid, [instance.uuid])"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"                    # NOTE(melwitt): We recheck the quota after creating the"},{"line_number":1073,"context_line":"                    # object to prevent users from allocating more resources"},{"line_number":1074,"context_line":"                    # than their allowed quota in the event of a race. This is"},{"line_number":1075,"context_line":"                    # configurable because it can be expensive if strict quota"},{"line_number":1076,"context_line":"                    # limits are not required in a deployment."},{"line_number":1077,"context_line":"                    if CONF.quota.recheck_quota and check_server_group_quota:"},{"line_number":1078,"context_line":"                        try:"},{"line_number":1079,"context_line":"                            objects.Quotas.check_deltas("}],"source_content_type":"text/x-python","patch_set":17,"id":"bf091321_b5e3ac05","line":1076,"range":{"start_line":1072,"start_character":20,"end_line":1076,"end_character":62},"in_reply_to":"bf091321_3b1b1c1c","updated":"2017-06-09 02:36:42.000000000","message":"If only you would anticipate my concerns beforehand we wouldn\u0027t have these problems.","commit_id":"a10876711fcfe86ac3029ac2d7315538de980435"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"bddc270346282788575762525dafc16bedf9b057","unresolved":false,"context_lines":[{"line_number":1069,"context_line":"                    members \u003d objects.InstanceGroup.add_members("},{"line_number":1070,"context_line":"                        context, instance_group.uuid, [instance.uuid])"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"                    # NOTE(melwitt): We recheck the quota after creating the"},{"line_number":1073,"context_line":"                    # object to prevent users from allocating more resources"},{"line_number":1074,"context_line":"                    # than their allowed quota in the event of a race. This is"},{"line_number":1075,"context_line":"                    # configurable because it can be expensive if strict quota"},{"line_number":1076,"context_line":"                    # limits are not required in a deployment."},{"line_number":1077,"context_line":"                    if CONF.quota.recheck_quota and check_server_group_quota:"},{"line_number":1078,"context_line":"                        try:"},{"line_number":1079,"context_line":"                            objects.Quotas.check_deltas("}],"source_content_type":"text/x-python","patch_set":17,"id":"bf091321_3b1b1c1c","line":1076,"range":{"start_line":1072,"start_character":20,"end_line":1076,"end_character":62},"in_reply_to":"bf091321_6859cf58","updated":"2017-06-08 17:42:55.000000000","message":"Heh, it started out with one sentence followed by \"Please see the config option help for details\" but that did not appease mriedem :)\n\nAnd yes, it has been laborious to change it a few times consistently already during a rebase of 16 patches.","commit_id":"a10876711fcfe86ac3029ac2d7315538de980435"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7d9859a6def64413e1a331af1a294c1c9701a213","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"                    if check_server_group_quota:"},{"line_number":1060,"context_line":"                        try:"},{"line_number":1061,"context_line":"                            objects.Quotas.check_deltas("},{"line_number":1062,"context_line":"                                context, {\u0027server_group_members\u0027: 1},"},{"line_number":1063,"context_line":"                                instance_group, context.user_id)"},{"line_number":1064,"context_line":"                        except exception.OverQuota:"},{"line_number":1065,"context_line":"                            msg \u003d _(\"Quota exceeded, too many servers in \""}],"source_content_type":"text/x-python","patch_set":18,"id":"bf091321_60f0b468","line":1062,"range":{"start_line":1062,"start_character":66,"end_line":1062,"end_character":67},"updated":"2017-06-09 04:08:52.000000000","message":"This is one because it\u0027s 1 per instance (member) while we\u0027re in the for loop, right?\n\nSeems at some point we should be smarter and just check this against num_instances before the loop so it can fast right away if we can\u0027t add all of the members, but that\u0027d be a different effort.","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d6c00cf599433e2432e15ef6dba031013c6a237f","unresolved":false,"context_lines":[{"line_number":1059,"context_line":"                    if check_server_group_quota:"},{"line_number":1060,"context_line":"                        try:"},{"line_number":1061,"context_line":"                            objects.Quotas.check_deltas("},{"line_number":1062,"context_line":"                                context, {\u0027server_group_members\u0027: 1},"},{"line_number":1063,"context_line":"                                instance_group, context.user_id)"},{"line_number":1064,"context_line":"                        except exception.OverQuota:"},{"line_number":1065,"context_line":"                            msg \u003d _(\"Quota exceeded, too many servers in \""}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_abec99f3","line":1062,"range":{"start_line":1062,"start_character":66,"end_line":1062,"end_character":67},"in_reply_to":"bf091321_60f0b468","updated":"2017-06-09 21:04:48.000000000","message":"Yeah, we\u0027re in a loop here building the list \u0027instances_to_build\u0027 and setting up some things per instance, and that includes adding the instance to a group if one was specified.","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7d9859a6def64413e1a331af1a294c1c9701a213","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"                    # than their allowed quota in the event of a race. This is"},{"line_number":1075,"context_line":"                    # configurable because it can be expensive if strict quota"},{"line_number":1076,"context_line":"                    # limits are not required in a deployment."},{"line_number":1077,"context_line":"                    if CONF.quota.recheck_quota and check_server_group_quota:"},{"line_number":1078,"context_line":"                        try:"},{"line_number":1079,"context_line":"                            objects.Quotas.check_deltas("},{"line_number":1080,"context_line":"                                context, {\u0027server_group_members\u0027: 0},"},{"line_number":1081,"context_line":"                                instance_group, context.user_id)"},{"line_number":1082,"context_line":"                        except exception.OverQuota:"},{"line_number":1083,"context_line":"                            objects.Quotas._remove_members_in_db(context,"},{"line_number":1084,"context_line":"                                instance_group.id, [instance.uuid])"},{"line_number":1085,"context_line":"                            msg \u003d _(\"Quota exceeded, too many servers in \""},{"line_number":1086,"context_line":"                                    \"group\")"},{"line_number":1087,"context_line":"                            raise exception.QuotaError(msg)"},{"line_number":1088,"context_line":"                    # list of members added to servers group in this iteration"},{"line_number":1089,"context_line":"                    # is needed to check quota of server group during add next"},{"line_number":1090,"context_line":"                    # instance"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf091321_4036d005","line":1087,"range":{"start_line":1077,"start_character":20,"end_line":1087,"end_character":59},"updated":"2017-06-09 04:08:52.000000000","message":"Why don\u0027t we have unit tests for any of this? I can think of at least two:\n\n1. recheck_quota is True (default) and check_server_group_quota is True, and check_deltas fails so we rollback and raise OverQuota.\n\n2. recheck_quota is False so we don\u0027t check.","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"1fd48cf58487a8bd5117b69f3487365e22302360","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"                    # than their allowed quota in the event of a race. This is"},{"line_number":1075,"context_line":"                    # configurable because it can be expensive if strict quota"},{"line_number":1076,"context_line":"                    # limits are not required in a deployment."},{"line_number":1077,"context_line":"                    if CONF.quota.recheck_quota and check_server_group_quota:"},{"line_number":1078,"context_line":"                        try:"},{"line_number":1079,"context_line":"                            objects.Quotas.check_deltas("},{"line_number":1080,"context_line":"                                context, {\u0027server_group_members\u0027: 0},"},{"line_number":1081,"context_line":"                                instance_group, context.user_id)"},{"line_number":1082,"context_line":"                        except exception.OverQuota:"},{"line_number":1083,"context_line":"                            objects.Quotas._remove_members_in_db(context,"},{"line_number":1084,"context_line":"                                instance_group.id, [instance.uuid])"},{"line_number":1085,"context_line":"                            msg \u003d _(\"Quota exceeded, too many servers in \""},{"line_number":1086,"context_line":"                                    \"group\")"},{"line_number":1087,"context_line":"                            raise exception.QuotaError(msg)"},{"line_number":1088,"context_line":"                    # list of members added to servers group in this iteration"},{"line_number":1089,"context_line":"                    # is needed to check quota of server group during add next"},{"line_number":1090,"context_line":"                    # instance"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_c0b44f38","line":1087,"range":{"start_line":1077,"start_character":20,"end_line":1087,"end_character":59},"in_reply_to":"7f231b9d_2bee4988","updated":"2017-06-09 22:04:39.000000000","message":"And of course, adding the test coverage uncovered a bug, dangit.","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a7c7ddc5d45564374950034c2887ac34cdb0fdd5","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"                    # than their allowed quota in the event of a race. This is"},{"line_number":1075,"context_line":"                    # configurable because it can be expensive if strict quota"},{"line_number":1076,"context_line":"                    # limits are not required in a deployment."},{"line_number":1077,"context_line":"                    if CONF.quota.recheck_quota and check_server_group_quota:"},{"line_number":1078,"context_line":"                        try:"},{"line_number":1079,"context_line":"                            objects.Quotas.check_deltas("},{"line_number":1080,"context_line":"                                context, {\u0027server_group_members\u0027: 0},"},{"line_number":1081,"context_line":"                                instance_group, context.user_id)"},{"line_number":1082,"context_line":"                        except exception.OverQuota:"},{"line_number":1083,"context_line":"                            objects.Quotas._remove_members_in_db(context,"},{"line_number":1084,"context_line":"                                instance_group.id, [instance.uuid])"},{"line_number":1085,"context_line":"                            msg \u003d _(\"Quota exceeded, too many servers in \""},{"line_number":1086,"context_line":"                                    \"group\")"},{"line_number":1087,"context_line":"                            raise exception.QuotaError(msg)"},{"line_number":1088,"context_line":"                    # list of members added to servers group in this iteration"},{"line_number":1089,"context_line":"                    # is needed to check quota of server group during add next"},{"line_number":1090,"context_line":"                    # instance"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_c4133cb8","line":1087,"range":{"start_line":1077,"start_character":20,"end_line":1087,"end_character":59},"in_reply_to":"7f231b9d_c0b44f38","updated":"2017-06-10 15:08:05.000000000","message":"Sweet sweet vindication.","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d6c00cf599433e2432e15ef6dba031013c6a237f","unresolved":false,"context_lines":[{"line_number":1074,"context_line":"                    # than their allowed quota in the event of a race. This is"},{"line_number":1075,"context_line":"                    # configurable because it can be expensive if strict quota"},{"line_number":1076,"context_line":"                    # limits are not required in a deployment."},{"line_number":1077,"context_line":"                    if CONF.quota.recheck_quota and check_server_group_quota:"},{"line_number":1078,"context_line":"                        try:"},{"line_number":1079,"context_line":"                            objects.Quotas.check_deltas("},{"line_number":1080,"context_line":"                                context, {\u0027server_group_members\u0027: 0},"},{"line_number":1081,"context_line":"                                instance_group, context.user_id)"},{"line_number":1082,"context_line":"                        except exception.OverQuota:"},{"line_number":1083,"context_line":"                            objects.Quotas._remove_members_in_db(context,"},{"line_number":1084,"context_line":"                                instance_group.id, [instance.uuid])"},{"line_number":1085,"context_line":"                            msg \u003d _(\"Quota exceeded, too many servers in \""},{"line_number":1086,"context_line":"                                    \"group\")"},{"line_number":1087,"context_line":"                            raise exception.QuotaError(msg)"},{"line_number":1088,"context_line":"                    # list of members added to servers group in this iteration"},{"line_number":1089,"context_line":"                    # is needed to check quota of server group during add next"},{"line_number":1090,"context_line":"                    # instance"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_2bee4988","line":1087,"range":{"start_line":1077,"start_character":20,"end_line":1087,"end_character":59},"in_reply_to":"bf091321_4036d005","updated":"2017-06-09 21:04:48.000000000","message":"Mostly fatigue on my part, sorry about that. Also, I had hoped the generic unit test \u0027test_check_deltas_zero\u0027 [1] would cover the testing of how it raises OverQuota. But true that doesn\u0027t test deleting the object.\n\nAnyway, I\u0027ll add test coverage for the gaps.\n\n[1] https://github.com/openstack/nova/blob/832cc47/nova/tests/unit/objects/test_quotas.py#L208","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"c870663395c6c17d5fdc34c249504a1ebaea5059","unresolved":false,"context_lines":[{"line_number":1081,"context_line":"                                context, instance_group.id, [instance.uuid])"},{"line_number":1082,"context_line":"                            msg \u003d _(\"Quota exceeded, too many servers in \""},{"line_number":1083,"context_line":"                                    \"group\")"},{"line_number":1084,"context_line":"                            raise exception.QuotaError(msg)"},{"line_number":1085,"context_line":"                    # list of members added to servers group in this iteration"},{"line_number":1086,"context_line":"                    # is needed to check quota of server group during add next"},{"line_number":1087,"context_line":"                    # instance"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f231b9d_edbb54c1","line":1084,"updated":"2017-06-14 10:23:18.000000000","message":"If you were feeling fancy, you could extract this block of code, which is essentially a duplicate of the above (except for the number of members) to a function and reuse it?","commit_id":"a48e3d02ca8a0c25c3aba562ecdcac992fb7eec7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"321a7f5167273ab6038b48d342d9d1df3639a6c1","unresolved":false,"context_lines":[{"line_number":1081,"context_line":"                                context, instance_group.id, [instance.uuid])"},{"line_number":1082,"context_line":"                            msg \u003d _(\"Quota exceeded, too many servers in \""},{"line_number":1083,"context_line":"                                    \"group\")"},{"line_number":1084,"context_line":"                            raise exception.QuotaError(msg)"},{"line_number":1085,"context_line":"                    # list of members added to servers group in this iteration"},{"line_number":1086,"context_line":"                    # is needed to check quota of server group during add next"},{"line_number":1087,"context_line":"                    # instance"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f231b9d_6d23b6be","line":1084,"in_reply_to":"7f231b9d_edbb54c1","updated":"2017-06-14 17:37:55.000000000","message":"I\u0027d be OK with a refactor cleanup in a separate change once we\u0027re good with this one and it\u0027s tests are written. Then the refactor is validated with the tests.","commit_id":"a48e3d02ca8a0c25c3aba562ecdcac992fb7eec7"}],"nova/quota.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7d9859a6def64413e1a331af1a294c1c9701a213","unresolved":false,"context_lines":[{"line_number":1856,"context_line":""},{"line_number":1857,"context_line":"def _server_group_count_members_by_user(context, group, user_id):"},{"line_number":1858,"context_line":"    # NOTE(melwitt): This is mostly duplicated from"},{"line_number":1859,"context_line":"    # InstanceGroup.count_members_by_user() to query across multiple cells."},{"line_number":1860,"context_line":"    # We need to be able to pass the correct cell context to"},{"line_number":1861,"context_line":"    # InstanceList.get_by_filters()."},{"line_number":1862,"context_line":"    # TODO(melwitt): Counting across cells for instances means we will miss"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf091321_604c349e","line":1859,"range":{"start_line":1859,"start_character":52,"end_line":1859,"end_character":74},"updated":"2017-06-09 04:08:52.000000000","message":"We can have server group members in different cells? That seems odd. I would have thought the scheduler would restrict those to a single cell. For affinity groups they\u0027d surely be in the same cell I\u0027d think, but maybe not for anti-affinity groups.\n\nWe could also try and optimize this by only iterating across cells for anti-affinity groups, but maybe that\u0027s premature. It\u0027s just that this is going to add some time to the server create request if you\u0027re adding to a server group, but I\u0027m assuming that\u0027s not a standard path anyway so maybe it\u0027s OK.","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d6c00cf599433e2432e15ef6dba031013c6a237f","unresolved":false,"context_lines":[{"line_number":1856,"context_line":""},{"line_number":1857,"context_line":"def _server_group_count_members_by_user(context, group, user_id):"},{"line_number":1858,"context_line":"    # NOTE(melwitt): This is mostly duplicated from"},{"line_number":1859,"context_line":"    # InstanceGroup.count_members_by_user() to query across multiple cells."},{"line_number":1860,"context_line":"    # We need to be able to pass the correct cell context to"},{"line_number":1861,"context_line":"    # InstanceList.get_by_filters()."},{"line_number":1862,"context_line":"    # TODO(melwitt): Counting across cells for instances means we will miss"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_0b882dc4","line":1859,"range":{"start_line":1859,"start_character":52,"end_line":1859,"end_character":74},"in_reply_to":"bf091321_604c349e","updated":"2017-06-09 21:04:48.000000000","message":"I don\u0027t see why not. I\u0027m not aware of anything that would prevent scheduling a second instance of the same server group in a separate cell.","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7d9859a6def64413e1a331af1a294c1c9701a213","unresolved":false,"context_lines":[{"line_number":1861,"context_line":"    # InstanceList.get_by_filters()."},{"line_number":1862,"context_line":"    # TODO(melwitt): Counting across cells for instances means we will miss"},{"line_number":1863,"context_line":"    # counting resources if a cell is down. In the future, we should query"},{"line_number":1864,"context_line":"    # placement for cores/ram and InstanceMappings for instances (once we are"},{"line_number":1865,"context_line":"    # deleting InstanceMappings when we delete instances)."},{"line_number":1866,"context_line":"    cell_mappings \u003d objects.CellMappingList.get_all(context)"},{"line_number":1867,"context_line":"    greenthreads \u003d []"},{"line_number":1868,"context_line":"    filters \u003d {\u0027deleted\u0027: False, \u0027user_id\u0027: user_id, \u0027uuid\u0027: group.members}"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf091321_209f5c04","line":1865,"range":{"start_line":1864,"start_character":66,"end_line":1865,"end_character":56},"updated":"2017-06-09 04:08:52.000000000","message":"Because of soft delete I don\u0027t see when we\u0027re ever going to be deleting instance mappings when we delete an instance, unless we add a periodic task somewhere that reaps orphaned mappings - similar to request specs.","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a7c7ddc5d45564374950034c2887ac34cdb0fdd5","unresolved":false,"context_lines":[{"line_number":1861,"context_line":"    # InstanceList.get_by_filters()."},{"line_number":1862,"context_line":"    # TODO(melwitt): Counting across cells for instances means we will miss"},{"line_number":1863,"context_line":"    # counting resources if a cell is down. In the future, we should query"},{"line_number":1864,"context_line":"    # placement for cores/ram and InstanceMappings for instances (once we are"},{"line_number":1865,"context_line":"    # deleting InstanceMappings when we delete instances)."},{"line_number":1866,"context_line":"    cell_mappings \u003d objects.CellMappingList.get_all(context)"},{"line_number":1867,"context_line":"    greenthreads \u003d []"},{"line_number":1868,"context_line":"    filters \u003d {\u0027deleted\u0027: False, \u0027user_id\u0027: user_id, \u0027uuid\u0027: group.members}"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_042134fc","line":1865,"range":{"start_line":1864,"start_character":66,"end_line":1865,"end_character":56},"in_reply_to":"7f231b9d_2bbc0968","updated":"2017-06-10 15:08:05.000000000","message":"If the placement consumer resource had a type then we could get instances as consumers from placement, but...","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d6c00cf599433e2432e15ef6dba031013c6a237f","unresolved":false,"context_lines":[{"line_number":1861,"context_line":"    # InstanceList.get_by_filters()."},{"line_number":1862,"context_line":"    # TODO(melwitt): Counting across cells for instances means we will miss"},{"line_number":1863,"context_line":"    # counting resources if a cell is down. In the future, we should query"},{"line_number":1864,"context_line":"    # placement for cores/ram and InstanceMappings for instances (once we are"},{"line_number":1865,"context_line":"    # deleting InstanceMappings when we delete instances)."},{"line_number":1866,"context_line":"    cell_mappings \u003d objects.CellMappingList.get_all(context)"},{"line_number":1867,"context_line":"    greenthreads \u003d []"},{"line_number":1868,"context_line":"    filters \u003d {\u0027deleted\u0027: False, \u0027user_id\u0027: user_id, \u0027uuid\u0027: group.members}"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_2bbc0968","line":1865,"range":{"start_line":1864,"start_character":66,"end_line":1865,"end_character":56},"in_reply_to":"bf091321_209f5c04","updated":"2017-06-09 21:04:48.000000000","message":"Okay, well that causes a problem I think, for this to be resilient to cell down conditions. We want to be able to count instances without going into cells. We\u0027ll be able to count cores/ram from placement, but we still need a way to count instances. Maybe that means we need a column on the instance_mappings table for \u0027deleted\u0027? I dunno.","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7d9859a6def64413e1a331af1a294c1c9701a213","unresolved":false,"context_lines":[{"line_number":1870,"context_line":"        with nova_context.target_cell(context, cell_mapping) as cctxt:"},{"line_number":1871,"context_line":"            greenthreads.append(utils.spawn("},{"line_number":1872,"context_line":"                objects.InstanceList.get_by_filters, cctxt, filters))"},{"line_number":1873,"context_line":"    instances \u003d objects.InstanceList(objects\u003d[])"},{"line_number":1874,"context_line":"    for greenthread in greenthreads:"},{"line_number":1875,"context_line":"        found \u003d greenthread.wait()"},{"line_number":1876,"context_line":"        instances \u003d instances + found"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf091321_40c370ee","line":1873,"range":{"start_line":1873,"start_character":37,"end_line":1873,"end_character":47},"updated":"2017-06-09 04:08:52.000000000","message":"This is redundant.","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"d6c00cf599433e2432e15ef6dba031013c6a237f","unresolved":false,"context_lines":[{"line_number":1870,"context_line":"        with nova_context.target_cell(context, cell_mapping) as cctxt:"},{"line_number":1871,"context_line":"            greenthreads.append(utils.spawn("},{"line_number":1872,"context_line":"                objects.InstanceList.get_by_filters, cctxt, filters))"},{"line_number":1873,"context_line":"    instances \u003d objects.InstanceList(objects\u003d[])"},{"line_number":1874,"context_line":"    for greenthread in greenthreads:"},{"line_number":1875,"context_line":"        found \u003d greenthread.wait()"},{"line_number":1876,"context_line":"        instances \u003d instances + found"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f231b9d_0bb14d90","line":1873,"range":{"start_line":1873,"start_character":37,"end_line":1873,"end_character":47},"in_reply_to":"bf091321_40c370ee","updated":"2017-06-09 21:04:48.000000000","message":"Yeah but it\u0027s the pattern I\u0027ve seen most often in the code, I thought.","commit_id":"e8d82e3b44103918b0ab08d49e9d48642b51fced"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"962d06e68640f318f92ee59afafe5c549653173e","unresolved":false,"context_lines":[{"line_number":1865,"context_line":"    # deleting InstanceMappings when we delete instances)."},{"line_number":1866,"context_line":"    cell_mappings \u003d objects.CellMappingList.get_all(context)"},{"line_number":1867,"context_line":"    greenthreads \u003d []"},{"line_number":1868,"context_line":"    filters \u003d {\u0027deleted\u0027: False, \u0027user_id\u0027: user_id, \u0027uuid\u0027: group.members}"},{"line_number":1869,"context_line":"    for cell_mapping in cell_mappings:"},{"line_number":1870,"context_line":"        with nova_context.target_cell(context, cell_mapping) as cctxt:"},{"line_number":1871,"context_line":"            greenthreads.append(utils.spawn("}],"source_content_type":"text/x-python","patch_set":19,"id":"7f231b9d_70ca6d4e","line":1868,"range":{"start_line":1868,"start_character":4,"end_line":1868,"end_character":75},"updated":"2017-06-14 17:43:43.000000000","message":"Matches what\u0027s done before this change:\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/instance_group.py#L470\n\nJust a note to myself.","commit_id":"a48e3d02ca8a0c25c3aba562ecdcac992fb7eec7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"962d06e68640f318f92ee59afafe5c549653173e","unresolved":false,"context_lines":[{"line_number":1866,"context_line":"    cell_mappings \u003d objects.CellMappingList.get_all(context)"},{"line_number":1867,"context_line":"    greenthreads \u003d []"},{"line_number":1868,"context_line":"    filters \u003d {\u0027deleted\u0027: False, \u0027user_id\u0027: user_id, \u0027uuid\u0027: group.members}"},{"line_number":1869,"context_line":"    for cell_mapping in cell_mappings:"},{"line_number":1870,"context_line":"        with nova_context.target_cell(context, cell_mapping) as cctxt:"},{"line_number":1871,"context_line":"            greenthreads.append(utils.spawn("},{"line_number":1872,"context_line":"                objects.InstanceList.get_by_filters, cctxt, filters))"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f231b9d_108c5934","line":1869,"range":{"start_line":1869,"start_character":4,"end_line":1869,"end_character":38},"updated":"2017-06-14 17:43:43.000000000","message":"Should we skip cell0 in here? We wouldn\u0027t have instance group members in cell0 would we? Unless they went into error state I guess.","commit_id":"a48e3d02ca8a0c25c3aba562ecdcac992fb7eec7"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"7f67556c69272b312e516b806550eae1f474405d","unresolved":false,"context_lines":[{"line_number":1866,"context_line":"    cell_mappings \u003d objects.CellMappingList.get_all(context)"},{"line_number":1867,"context_line":"    greenthreads \u003d []"},{"line_number":1868,"context_line":"    filters \u003d {\u0027deleted\u0027: False, \u0027user_id\u0027: user_id, \u0027uuid\u0027: group.members}"},{"line_number":1869,"context_line":"    for cell_mapping in cell_mappings:"},{"line_number":1870,"context_line":"        with nova_context.target_cell(context, cell_mapping) as cctxt:"},{"line_number":1871,"context_line":"            greenthreads.append(utils.spawn("},{"line_number":1872,"context_line":"                objects.InstanceList.get_by_filters, cctxt, filters))"}],"source_content_type":"text/x-python","patch_set":19,"id":"7f231b9d_304ab5ab","line":1869,"range":{"start_line":1869,"start_character":4,"end_line":1869,"end_character":38},"in_reply_to":"7f231b9d_108c5934","updated":"2017-06-14 17:51:47.000000000","message":"Yeah, I think we could have group members (instances) in ERROR state in cell0 and it would be consistent with everything else that they count against quota (as ERROR instances count against quota).","commit_id":"a48e3d02ca8a0c25c3aba562ecdcac992fb7eec7"}]}
