)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc87845e3c1dc9894bc13431cbe65fcff6193eae","unresolved":false,"context_lines":[{"line_number":24,"context_line":"uuids. This patch relies on the results of those being realistic and"},{"line_number":25,"context_line":"thus requires those changes."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Co-Authored-By: Dan Smith \u003cdms@danplanet.com\u003e"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: If59453f1899e99040c554bcb9ad54c8a506adc56"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"3f1d235d_ded8b21f","line":27,"updated":"2017-07-07 16:55:29.000000000","message":"This may also fix bug 1702959. I\u0027m going to test it out in https://review.openstack.org/#/c/477556/.","commit_id":"5941e5840416cf1b5c72bf95e254b20f1ae002bd"},{"author":{"_account_id":24777,"name":"Steven Webster","email":"steven.webster@windriver.com","username":"swebster"},"change_message_id":"ab463a8cecbb0a7753785a2cc44a5ee9bfafa2b8","unresolved":false,"context_lines":[{"line_number":24,"context_line":"uuids. This patch relies on the results of those being realistic and"},{"line_number":25,"context_line":"thus requires those changes."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Co-Authored-By: Dan Smith \u003cdms@danplanet.com\u003e"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: If59453f1899e99040c554bcb9ad54c8a506adc56"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1f1a1f67_70454970","line":27,"in_reply_to":"3f1d235d_ded8b21f","updated":"2017-07-12 13:38:12.000000000","message":"So for what it\u0027s worth, I was also running into bug 1702959 while doing some evacuation tests.  This change set seems to fix the issue for me.","commit_id":"5941e5840416cf1b5c72bf95e254b20f1ae002bd"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4bb4c6d479de1bb7ff53c27ea886ea71ecf6e070","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Fix and optimize external_events for multiple cells"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"server_external_events was previously making an api db query and a"},{"line_number":10,"context_line":"cell db query for every instance references. We update improve this by"},{"line_number":11,"context_line":"making exactly 1 api db query to fetch all instance mappings, and then"},{"line_number":12,"context_line":"1 cell db query per cell to fetch all relevant instances from that"},{"line_number":13,"context_line":"cell. Further, it wasn\u0027t properly handling the case where events"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"1f1a1f67_1fd8ab78","line":10,"range":{"start_line":10,"start_character":48,"end_line":10,"end_character":62},"updated":"2017-07-18 16:18:49.000000000","message":"ooh, nice. update improve. :)","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf8dd1741bf1aafcab3c442297731623fe266fd0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Fix and optimize external_events for multiple cells"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"server_external_events was previously making an api db query and a"},{"line_number":10,"context_line":"cell db query for every instance references. We update improve this by"},{"line_number":11,"context_line":"making exactly 1 api db query to fetch all instance mappings, and then"},{"line_number":12,"context_line":"1 cell db query per cell to fetch all relevant instances from that"},{"line_number":13,"context_line":"cell. Further, it wasn\u0027t properly handling the case where events"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"1f1a1f67_b641b0a8","line":10,"range":{"start_line":10,"start_character":33,"end_line":10,"end_character":43},"updated":"2017-07-19 21:48:18.000000000","message":"reference","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf8dd1741bf1aafcab3c442297731623fe266fd0","unresolved":false,"context_lines":[{"line_number":23,"context_line":"InstanceMapping mock, which was returning mappings with bogus instance"},{"line_number":24,"context_line":"uuids. This patch relies on the results of those being realistic and"},{"line_number":25,"context_line":"thus requires those changes."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Co-Authored-By: Dan Smith \u003cdms@danplanet.com\u003e"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Change-Id: If59453f1899e99040c554bcb9ad54c8a506adc56"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"1f1a1f67_767e78e4","line":26,"updated":"2017-07-19 21:48:18.000000000","message":"Closes-Bug: #1702959","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"}],"nova/api/openstack/compute/server_external_events.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"91b66cdf48862da185bf5500b0db7a3257908bc2","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                context, list(instance_uuids))"},{"line_number":59,"context_line":"        instances \u003d objects.InstanceList.get_by_instance_mapping_list("},{"line_number":60,"context_line":"                context, instance_mappings,"},{"line_number":61,"context_line":"                expected_attrs\u003d[\u0027migration_context\u0027, \u0027info_cache\u0027])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        # Convert list into a map of instance uuids to instance"},{"line_number":64,"context_line":"        instances \u003d {instance.uuid: instance for instance in instances}"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a1ced50_dd7b2b7a","line":61,"range":{"start_line":61,"start_character":16,"end_line":61,"end_character":66},"updated":"2017-03-16 18:20:40.000000000","message":"http://logs.openstack.org/42/445142/3/check/gate-tempest-dsvm-neutron-full-ubuntu-xenial/07e282a/logs/screen-n-api.txt.gz?level\u003dERROR#_2017-03-15_10_18_48_102","commit_id":"8564fe3ea475b800e8dc3bb9aa8fa2ebab7dc960"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"febf6474c6aa9642d4d8381d2e801141ab825b3d","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                context, list(instance_uuids))"},{"line_number":59,"context_line":"        instances \u003d objects.InstanceList.get_by_instance_mapping_list("},{"line_number":60,"context_line":"                context, instance_mappings,"},{"line_number":61,"context_line":"                expected_attrs\u003d[\u0027migration_context\u0027, \u0027info_cache\u0027])"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        # Convert list into a map of instance uuids to instance"},{"line_number":64,"context_line":"        instances \u003d {instance.uuid: instance for instance in instances}"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a1ced50_686d0032","line":61,"range":{"start_line":61,"start_character":16,"end_line":61,"end_character":66},"in_reply_to":"1a1ced50_dd7b2b7a","updated":"2017-03-17 10:35:32.000000000","message":"That\u0027s from patchset 3 :P","commit_id":"8564fe3ea475b800e8dc3bb9aa8fa2ebab7dc960"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4bb4c6d479de1bb7ff53c27ea886ea71ecf6e070","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    def _get_instances_all_cells(self, context, instance_uuids,"},{"line_number":45,"context_line":"                                 instance_mappings):"},{"line_number":46,"context_line":"        cells \u003d {}"},{"line_number":47,"context_line":"        instance_uuids_by_cell \u003d {}"},{"line_number":48,"context_line":"        for im in instance_mappings:"},{"line_number":49,"context_line":"            if im.cell_mapping.uuid not in cells:"},{"line_number":50,"context_line":"                cells[im.cell_mapping.uuid] \u003d im.cell_mapping"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_ff260f68","line":47,"updated":"2017-07-18 16:18:49.000000000","message":"Instead of the if condition and setdefault() below, you could just use a collections.defaultdict(list).","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf8dd1741bf1aafcab3c442297731623fe266fd0","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        response_events \u003d []"},{"line_number":76,"context_line":"        accepted_events \u003d []"},{"line_number":77,"context_line":"        accepted_instances \u003d set()"},{"line_number":78,"context_line":"        instances \u003d {}"},{"line_number":79,"context_line":"        result \u003d 200"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_2a7f7466","line":77,"range":{"start_line":77,"start_character":29,"end_line":77,"end_character":34},"updated":"2017-07-19 21:48:18.000000000","message":"Unrelated, but it seems odd this is a set when we don\u0027t have a comparison function for Instance objects.","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62a0b1bc37b97f55c15aba30c4168ce2515c63e9","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        response_events \u003d []"},{"line_number":76,"context_line":"        accepted_events \u003d []"},{"line_number":77,"context_line":"        accepted_instances \u003d set()"},{"line_number":78,"context_line":"        instances \u003d {}"},{"line_number":79,"context_line":"        result \u003d 200"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        body_events \u003d body[\u0027events\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_4d12ca63","line":78,"range":{"start_line":78,"start_character":8,"end_line":78,"end_character":22},"updated":"2017-07-19 21:55:50.000000000","message":"We can remove this as it\u0027s set below.","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"}],"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf8dd1741bf1aafcab3c442297731623fe266fd0","unresolved":false,"context_lines":[{"line_number":4263,"context_line":""},{"line_number":4264,"context_line":"        do_volume_snapshot_delete(self, context, bdm.instance)"},{"line_number":4265,"context_line":""},{"line_number":4266,"context_line":"    def external_instance_event(self, api_context, instances, events):"},{"line_number":4267,"context_line":"        # NOTE(danms): The external API consumer just provides events,"},{"line_number":4268,"context_line":"        # but doesn\u0027t know where they go. We need to collate lists"},{"line_number":4269,"context_line":"        # by the host the affected instance is on and dispatch them"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_ea473c1c","line":4266,"range":{"start_line":4266,"start_character":38,"end_line":4266,"end_character":49},"updated":"2017-07-19 21:48:18.000000000","message":"I guess this was renamed to avoid collisions/confusion with a generic context used below.","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf8dd1741bf1aafcab3c442297731623fe266fd0","unresolved":false,"context_lines":[{"line_number":4273,"context_line":"        hosts_by_instance \u003d collections.defaultdict(list)"},{"line_number":4274,"context_line":"        cell_contexts_by_host \u003d {}"},{"line_number":4275,"context_line":"        for instance in instances:"},{"line_number":4276,"context_line":"            for host in self._get_relevant_hosts(instance._context, instance):"},{"line_number":4277,"context_line":"                # NOTE(danms): All instances on a host must have the same"},{"line_number":4278,"context_line":"                # mapping, so just use that"},{"line_number":4279,"context_line":"                # NOTE(mdbooth): We don\u0027t currently support migrations between"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_8a6208ad","line":4276,"range":{"start_line":4276,"start_character":49,"end_line":4276,"end_character":66},"updated":"2017-07-19 21:48:18.000000000","message":"Would be nice to have a comment explaining that we do this because the _context is targeted to the same cell database that we need to get the migrations records for the instance.","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf8dd1741bf1aafcab3c442297731623fe266fd0","unresolved":false,"context_lines":[{"line_number":4294,"context_line":"                # Block Storage service API. We record an instance action so"},{"line_number":4295,"context_line":"                # the user can monitor the operation to completion."},{"line_number":4296,"context_line":"                host \u003d hosts_by_instance[event.instance_uuid][0]"},{"line_number":4297,"context_line":"                cctxt \u003d cell_contexts_by_host[host]"},{"line_number":4298,"context_line":"                objects.InstanceAction.action_start("},{"line_number":4299,"context_line":"                    cctxt, event.instance_uuid,"},{"line_number":4300,"context_line":"                    instance_actions.EXTEND_VOLUME, want_result\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_0dddf2de","line":4297,"range":{"start_line":4297,"start_character":16,"end_line":4297,"end_character":21},"updated":"2017-07-19 21:48:18.000000000","message":"nit: could name this cell_context to match below.","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf8dd1741bf1aafcab3c442297731623fe266fd0","unresolved":false,"context_lines":[{"line_number":4319,"context_line":"            migration \u003d objects.Migration.get_by_id(context, migration_id)"},{"line_number":4320,"context_line":"            hosts.add(migration.dest_compute)"},{"line_number":4321,"context_line":"            hosts.add(migration.source_compute)"},{"line_number":4322,"context_line":"            LOG.debug(\u0027Instance %(instance)s is migrating, \u0027"},{"line_number":4323,"context_line":"                      \u0027copying events to all relevant hosts: \u0027"},{"line_number":4324,"context_line":"                      \u0027%(hosts)s\u0027, {\u0027instance\u0027: instance.uuid,"},{"line_number":4325,"context_line":"                                    \u0027hosts\u0027: hosts})"},{"line_number":4326,"context_line":"        return hosts"},{"line_number":4327,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_aab82410","line":4324,"range":{"start_line":4322,"start_character":22,"end_line":4324,"end_character":62},"updated":"2017-07-19 21:48:18.000000000","message":"We should be using the instance\u003dinstance kwarg for this, but it\u0027s unrelated.","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"}],"nova/tests/fixtures.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"4bb4c6d479de1bb7ff53c27ea886ea71ecf6e070","unresolved":false,"context_lines":[{"line_number":313,"context_line":"            \u0027id\u0027: 1,"},{"line_number":314,"context_line":"            \u0027updated_at\u0027: None,"},{"line_number":315,"context_line":"            \u0027created_at\u0027: None,"},{"line_number":316,"context_line":"            \u0027instance_uuid\u0027: args[-1],"},{"line_number":317,"context_line":"            \u0027cell_id\u0027: (self.instances_created and 1 or None),"},{"line_number":318,"context_line":"            \u0027project_id\u0027: \u0027project\u0027,"},{"line_number":319,"context_line":"            \u0027cell_mapping\u0027: ("}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_bf589787","line":316,"updated":"2017-07-18 16:18:49.000000000","message":"Hmm, this looks a little fragile... are we always guaranteeing that the instance UUID is going to be the last argument passed?","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf8dd1741bf1aafcab3c442297731623fe266fd0","unresolved":false,"context_lines":[{"line_number":313,"context_line":"            \u0027id\u0027: 1,"},{"line_number":314,"context_line":"            \u0027updated_at\u0027: None,"},{"line_number":315,"context_line":"            \u0027created_at\u0027: None,"},{"line_number":316,"context_line":"            \u0027instance_uuid\u0027: args[-1],"},{"line_number":317,"context_line":"            \u0027cell_id\u0027: (self.instances_created and 1 or None),"},{"line_number":318,"context_line":"            \u0027project_id\u0027: \u0027project\u0027,"},{"line_number":319,"context_line":"            \u0027cell_mapping\u0027: ("}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_addddedd","line":316,"in_reply_to":"1f1a1f67_bf589787","updated":"2017-07-19 21:48:18.000000000","message":"Seems fine, as in I don\u0027t see that changing anytime soon. If it does, this has to change but tests would fail I think and then just adjust this. args[2] is maybe better, but meh.","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"}],"nova/tests/unit/api/openstack/compute/test_server_external_events.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf8dd1741bf1aafcab3c442297731623fe266fd0","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"@classmethod"},{"line_number":41,"context_line":"def fake_get_by_uuid(cls, context, uuid, **kwargs):"},{"line_number":42,"context_line":"    if \u0027expected_attrs\u0027 in kwargs:"},{"line_number":43,"context_line":"        expected_attrs_set \u003d set(kwargs[\u0027expected_attrs\u0027])"},{"line_number":44,"context_line":"        full_expected_attrs_set \u003d set(instance_obj.INSTANCE_OPTIONAL_ATTRS)"},{"line_number":45,"context_line":"        assert expected_attrs_set.issubset(full_expected_attrs_set), \\"},{"line_number":46,"context_line":"            (\u0027%s is not a subset of %s\u0027 % (expected_attrs_set,"},{"line_number":47,"context_line":"                                           full_expected_attrs_set))"},{"line_number":48,"context_line":"    try:"},{"line_number":49,"context_line":"        return fake_instances[uuid]"},{"line_number":50,"context_line":"    except KeyError:"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_4db64a8c","side":"PARENT","line":47,"range":{"start_line":42,"start_character":4,"end_line":47,"end_character":68},"updated":"2017-07-19 21:48:18.000000000","message":"This was here for a reason because of a regression bug:\n\nI3ad85f9062b5cb19962d9e6a7af52440166def45","commit_id":"6205a3f8c4775f1e76277e152a379f237fd0ab7b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bf8dd1741bf1aafcab3c442297731623fe266fd0","unresolved":false,"context_lines":[{"line_number":39,"context_line":"fake_cells \u003d [objects.CellMapping(uuid\u003duuids.cell1, database_connection\u003d\"db1\"),"},{"line_number":40,"context_line":"              objects.CellMapping(uuid\u003duuids.cell2, database_connection\u003d\"db2\")]"},{"line_number":41,"context_line":"fake_instance_mappings \u003d ["},{"line_number":42,"context_line":"        objects.InstanceMapping(cell_mapping\u003dfake_cells[instance.id % 2],"},{"line_number":43,"context_line":"                                instance_uuid\u003dinstance.uuid)"},{"line_number":44,"context_line":"        for instance in fake_instances.values()]"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"@classmethod"}],"source_content_type":"text/x-python","patch_set":11,"id":"1f1a1f67_6d9a2614","line":44,"range":{"start_line":42,"start_character":8,"end_line":44,"end_character":48},"updated":"2017-07-19 21:48:18.000000000","message":"nit: alignment is a bit goofy here, one too many tabs","commit_id":"74398cdee7403ecf94fb2f20dfe757f734e183d8"}]}
