)]}'
{"nova/db/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"459287392e0a6fa68885cc679d627ac055c4e5cd","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"                                                         use_slave)"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":""},{"line_number":1228,"context_line":"def block_device_mapping_get_all_by_volume_id(context, volume_id,"},{"line_number":1229,"context_line":"        columns_to_join\u003dNone):"},{"line_number":1230,"context_line":"    \"\"\"Get block device mapping for a given volume.\"\"\""},{"line_number":1231,"context_line":"    return IMPL.block_device_mapping_get_by_volume_id(context, volume_id,"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_c926d2cd","line":1228,"range":{"start_line":1228,"start_character":4,"end_line":1228,"end_character":45},"updated":"2016-01-13 21:01:09.000000000","message":"Don\u0027t BDM object versions before this change need to be able to hit the original method?","commit_id":"837b24014e3b74d924cf8bcd6b6eb588ce58c108"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"622be710de1a41fdf4d921b53de8b1f4765216d2","unresolved":false,"context_lines":[{"line_number":1225,"context_line":"                                                         use_slave)"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":""},{"line_number":1228,"context_line":"def block_device_mapping_get_all_by_volume_id(context, volume_id,"},{"line_number":1229,"context_line":"        columns_to_join\u003dNone):"},{"line_number":1230,"context_line":"    \"\"\"Get block device mapping for a given volume.\"\"\""},{"line_number":1231,"context_line":"    return IMPL.block_device_mapping_get_by_volume_id(context, volume_id,"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_bc539d38","line":1228,"range":{"start_line":1228,"start_character":4,"end_line":1228,"end_character":45},"in_reply_to":"da6ed579_c926d2cd","updated":"2016-01-13 21:36:46.000000000","message":"This isn\u0027t a remotable method so we can change it at will, as long as the remotable methods call this by its new name.","commit_id":"837b24014e3b74d924cf8bcd6b6eb588ce58c108"}],"nova/exception.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f840b3c7da674cecbf734cf607ddf6ebe6944a5f","unresolved":false,"context_lines":[{"line_number":636,"context_line":""},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"class VolumeBDMIsMultiAttach(Invalid):"},{"line_number":639,"context_line":"    msg_fmt \u003d _(\"BDM returned is for multiattach volume %(volume_id)s.\")"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"class VolumeBDMPathNotFound(VolumeBDMNotFound):"}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_99534be2","line":639,"range":{"start_line":639,"start_character":17,"end_line":639,"end_character":55},"updated":"2016-01-13 21:06:07.000000000","message":"This probably needs some work, maybe saying something like \u0027Block Device Mapping %(volume_id)s if a multi-attach volume and is not valid for this operation.\u0027\n\nOr something.","commit_id":"837b24014e3b74d924cf8bcd6b6eb588ce58c108"}],"nova/objects/block_device.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f840b3c7da674cecbf734cf607ddf6ebe6944a5f","unresolved":false,"context_lines":[{"line_number":232,"context_line":"                                   expected_attrs\u003dexpected_attrs)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    @base.remotable_classmethod"},{"line_number":235,"context_line":"    def get_by_volume_only(cls, context, volume_id, expected_attrs\u003dNone):"},{"line_number":236,"context_line":"        if expected_attrs is None:"},{"line_number":237,"context_line":"            expected_attrs \u003d []"},{"line_number":238,"context_line":"        db_bdms \u003d db.block_device_mapping_get_all_by_volume_id("}],"source_content_type":"text/x-python","patch_set":1,"id":"da6ed579_b9464f4d","line":235,"range":{"start_line":235,"start_character":8,"end_line":235,"end_character":26},"updated":"2016-01-13 21:06:07.000000000","message":"This will sound/look weird after we drop get_by_volume_id, maybe just call it get_by_volume?\n\nIf this were Java, we could just overload the same method and this wouldn\u0027t be a problem!","commit_id":"837b24014e3b74d924cf8bcd6b6eb588ce58c108"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"769beeb06a2fb49e49cfa6ef424551ce35d9a3f1","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":241,"context_line":"        if not db_bdms:"},{"line_number":242,"context_line":"            raise exception.VolumeBDMNotFound(volume_id\u003dvolume_id)"},{"line_number":243,"context_line":"        if len(db_bdms) \u003e 1:"},{"line_number":244,"context_line":"            raise exception.VolumeBDMIsMultiAttach(volume_id\u003dvolume_id)"},{"line_number":245,"context_line":"        return cls._from_db_object(context, cls(), db_bdms[0],"},{"line_number":246,"context_line":"                                   expected_attrs\u003dexpected_attrs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_ff3907d8","line":243,"range":{"start_line":243,"start_character":11,"end_line":243,"end_character":27},"updated":"2016-01-13 21:44:48.000000000","message":"Can this be more than one in case of a race condition as we don\u0027t have BDM uniqueness?","commit_id":"52b85f44f16fa4fb774e2ece2525e8379138d1b8"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"6da9f562f9527db338456cec1980436b0f745431","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":241,"context_line":"        if not db_bdms:"},{"line_number":242,"context_line":"            raise exception.VolumeBDMNotFound(volume_id\u003dvolume_id)"},{"line_number":243,"context_line":"        if len(db_bdms) \u003e 1:"},{"line_number":244,"context_line":"            raise exception.VolumeBDMIsMultiAttach(volume_id\u003dvolume_id)"},{"line_number":245,"context_line":"        return cls._from_db_object(context, cls(), db_bdms[0],"},{"line_number":246,"context_line":"                                   expected_attrs\u003dexpected_attrs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_df28c3e4","line":243,"range":{"start_line":243,"start_character":11,"end_line":243,"end_character":27},"in_reply_to":"da6ed579_5fd5b319","updated":"2016-01-13 21:57:18.000000000","message":"Thanks for the clarification.\n\nI asked because of the error message basically as if it can be a race for non-multiattach case then I think it\u0027s misleading.","commit_id":"52b85f44f16fa4fb774e2ece2525e8379138d1b8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7fd77616613c46f7babea53a661b014ea19cc525","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":241,"context_line":"        if not db_bdms:"},{"line_number":242,"context_line":"            raise exception.VolumeBDMNotFound(volume_id\u003dvolume_id)"},{"line_number":243,"context_line":"        if len(db_bdms) \u003e 1:"},{"line_number":244,"context_line":"            raise exception.VolumeBDMIsMultiAttach(volume_id\u003dvolume_id)"},{"line_number":245,"context_line":"        return cls._from_db_object(context, cls(), db_bdms[0],"},{"line_number":246,"context_line":"                                   expected_attrs\u003dexpected_attrs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_a2ab7474","line":243,"range":{"start_line":243,"start_character":11,"end_line":243,"end_character":27},"in_reply_to":"da6ed579_df28c3e4","updated":"2016-01-13 22:15:55.000000000","message":"Yeah, I\u0027m being presumptive here and calling out the non-race case as the likely culprit. Seems the most useful because this is likely to be seen by people that use this method when they should use the above.\n\nBut, we should try to eliminate the race in create() anyway, which will make this entirely correct.\n\nWe could log a warning here about the race potential, but that seems more confusing to me.","commit_id":"52b85f44f16fa4fb774e2ece2525e8379138d1b8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4a0516d43bca30126900ac666e859c3248c9d47a","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":241,"context_line":"        if not db_bdms:"},{"line_number":242,"context_line":"            raise exception.VolumeBDMNotFound(volume_id\u003dvolume_id)"},{"line_number":243,"context_line":"        if len(db_bdms) \u003e 1:"},{"line_number":244,"context_line":"            raise exception.VolumeBDMIsMultiAttach(volume_id\u003dvolume_id)"},{"line_number":245,"context_line":"        return cls._from_db_object(context, cls(), db_bdms[0],"},{"line_number":246,"context_line":"                                   expected_attrs\u003dexpected_attrs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da6ed579_5fd5b319","line":243,"range":{"start_line":243,"start_character":11,"end_line":243,"end_character":27},"in_reply_to":"da6ed579_ff3907d8","updated":"2016-01-13 21:48:34.000000000","message":"It can, which is the point of the check :)\n\nThis lets us detect the race where before we\u0027d just silently ignore the case. This gives us a chance to notice.\n\nThere is more work to do in create() that does a similar check and tries to avoid getting into this situation in an irreversible way. However, at least this makes the situation known, and avoids returning the wrong BDM when we don\u0027t know which one to choose.","commit_id":"52b85f44f16fa4fb774e2ece2525e8379138d1b8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4c95946a5f6b139e28ee95c4f4d53a7160c8c5a8","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":209,"context_line":"        if not db_bdms:"},{"line_number":210,"context_line":"            raise exception.VolumeBDMNotFound(volume_id\u003dvolume_id)"},{"line_number":211,"context_line":"        # FIXME(danms): Warn here if more than one?"},{"line_number":212,"context_line":"        db_bdm \u003d db_bdms[0]"},{"line_number":213,"context_line":"        # NOTE (ndipanov): Move this to the db layer into a"},{"line_number":214,"context_line":"        # get_by_instance_and_volume_id method"}],"source_content_type":"text/x-python","patch_set":3,"id":"da6ed579_7f1997d6","line":211,"range":{"start_line":211,"start_character":8,"end_line":211,"end_character":51},"updated":"2016-01-13 21:57:33.000000000","message":"Seems like a decent idea. Note there is one known explicit case where we create a BDM with a static volume_id:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/manager.py#L4638\n\nI\u0027m not completely sure when that happens, if it happens, maybe in the case of booting from image/blank/snapshot rather than a volume. I don\u0027t think it can actually happen though because I only see reserve_block_device_name called from the compute API and manager when doing a volume attach, which requires a volume_id.\n\nAnyway, that \u0027reserved\u0027 condition is confusing, and possibly dangerous, and it seems like at some point we should nix that.\n\nSo I agree with a warning here if there is more than 1 bdm. However, if we have the instance_uuid, we could potentially filter out multiple BDMs....which is like what ildikov had in her change (except it called db.block_device_mapping_get_by_instance_and_volume_id directly).","commit_id":"46993eade95ad29770615a7a016edd8d69353843"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6fbefee768bcc3862c6cc923b303f9fb2cdef633","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":209,"context_line":"        if not db_bdms:"},{"line_number":210,"context_line":"            raise exception.VolumeBDMNotFound(volume_id\u003dvolume_id)"},{"line_number":211,"context_line":"        if len(db_bdms) \u003e 1:"},{"line_number":212,"context_line":"            LOG.warning(_LW(\u0027Legacy get_by_volume_id() call found multiple \u0027"},{"line_number":213,"context_line":"                            \u0027BDMs for volume %(volume)s\u0027),"},{"line_number":214,"context_line":"                        {\u0027volume\u0027: volume_id})"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_9b89f677","line":211,"range":{"start_line":211,"start_character":8,"end_line":211,"end_character":27},"updated":"2016-01-14 01:47:17.000000000","message":"I don\u0027t see a test for this case.","commit_id":"fabb5130692c8a16ce047c6822b856801b7273d3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f1002e199459cc938cb2a243816d668bcd7451bc","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":209,"context_line":"        if not db_bdms:"},{"line_number":210,"context_line":"            raise exception.VolumeBDMNotFound(volume_id\u003dvolume_id)"},{"line_number":211,"context_line":"        if len(db_bdms) \u003e 1:"},{"line_number":212,"context_line":"            LOG.warning(_LW(\u0027Legacy get_by_volume_id() call found multiple \u0027"},{"line_number":213,"context_line":"                            \u0027BDMs for volume %(volume)s\u0027),"},{"line_number":214,"context_line":"                        {\u0027volume\u0027: volume_id})"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_5b74ac34","line":211,"range":{"start_line":211,"start_character":8,"end_line":211,"end_character":27},"in_reply_to":"da6ed579_6fabee75","updated":"2016-01-14 18:29:31.000000000","message":"Sorry, less for the log statement, but more for the multiple bdm wrinkle, to make sure we get back one, and don\u0027t explode for some dumb reason b/c we aren\u0027t handling the multiple bdm case, which is a new wrinkle here.","commit_id":"fabb5130692c8a16ce047c6822b856801b7273d3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"983c6a9186373de8e6dca1b9e53bacf4e026a8b8","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":209,"context_line":"        if not db_bdms:"},{"line_number":210,"context_line":"            raise exception.VolumeBDMNotFound(volume_id\u003dvolume_id)"},{"line_number":211,"context_line":"        if len(db_bdms) \u003e 1:"},{"line_number":212,"context_line":"            LOG.warning(_LW(\u0027Legacy get_by_volume_id() call found multiple \u0027"},{"line_number":213,"context_line":"                            \u0027BDMs for volume %(volume)s\u0027),"},{"line_number":214,"context_line":"                        {\u0027volume\u0027: volume_id})"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_6fabee75","line":211,"range":{"start_line":211,"start_character":8,"end_line":211,"end_character":27},"in_reply_to":"da6ed579_9b89f677","updated":"2016-01-14 18:26:04.000000000","message":"I don\u0027t normally add tests that log messages actually get run. Is that really what you\u0027re suggesting?","commit_id":"fabb5130692c8a16ce047c6822b856801b7273d3"},{"author":{"_account_id":9562,"name":"Ildiko Vancsa","email":"ildiko.vancsa@gmail.com","username":"ildikov"},"change_message_id":"bc8293dcf46203feba27805f12830f6c48f62812","unresolved":false,"context_lines":[{"line_number":243,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":244,"context_line":"        if not db_bdms:"},{"line_number":245,"context_line":"            raise exception.VolumeBDMNotFound(volume_id\u003dvolume_id)"},{"line_number":246,"context_line":"        if len(db_bdms) \u003e 1:"},{"line_number":247,"context_line":"            raise exception.VolumeBDMIsMultiAttach(volume_id\u003dvolume_id)"},{"line_number":248,"context_line":"        return cls._from_db_object(context, cls(), db_bdms[0],"},{"line_number":249,"context_line":"                                   expected_attrs\u003dexpected_attrs)"},{"line_number":250,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_429cf85c","line":247,"range":{"start_line":246,"start_character":11,"end_line":247,"end_character":71},"updated":"2016-01-13 22:16:05.000000000","message":"If we can have multiple BDMs because of a race here than the error message is misleading. I assume it\u0027s a rare enough case to ignore. I wonder though whether it will encourage people to check whether a volume is multiattached by the number of existing BDMs only later which might be an issue?","commit_id":"fabb5130692c8a16ce047c6822b856801b7273d3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f18388591de20e2c4b4b34aac3d2379a538c19ab","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                context, volume_id, _expected_cols(expected_attrs))"},{"line_number":209,"context_line":"        if not db_bdms:"},{"line_number":210,"context_line":"            raise exception.VolumeBDMNotFound(volume_id\u003dvolume_id)"},{"line_number":211,"context_line":"        if len(db_bdms) \u003e 1:"},{"line_number":212,"context_line":"            LOG.warning(_LW(\u0027Legacy get_by_volume_id() call found multiple \u0027"},{"line_number":213,"context_line":"                            \u0027BDMs for volume %(volume)s\u0027),"},{"line_number":214,"context_line":"                        {\u0027volume\u0027: volume_id})"}],"source_content_type":"text/x-python","patch_set":5,"id":"da6ed579_e0e4cde0","line":211,"updated":"2016-01-14 18:12:09.000000000","message":"I commented on this in the last change, but we don\u0027t care to have a unit test for this case? It seems we should. I can add it if you\u0027re busy.","commit_id":"3396d4c2aa7bb7aa304d159cdfef3e32d7aac0ad"}],"nova/tests/unit/db/test_db_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6fbefee768bcc3862c6cc923b303f9fb2cdef633","unresolved":false,"context_lines":[{"line_number":6153,"context_line":"        self.assertEqual(len(bdms), 1)"},{"line_number":6154,"context_line":"        self.assertEqual(bdms[0][\u0027device_name\u0027], \u0027/dev/vda\u0027)"},{"line_number":6155,"context_line":""},{"line_number":6156,"context_line":"    def test_block_device_mapping_get_by_volume_id(self):"},{"line_number":6157,"context_line":"        self._create_bdm({\u0027volume_id\u0027: \u0027fake_id\u0027})"},{"line_number":6158,"context_line":"        self._create_bdm({\u0027volume_id\u0027: \u0027fake_id\u0027})"},{"line_number":6159,"context_line":"        bdms \u003d db.block_device_mapping_get_all_by_volume_id(self.ctxt,"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_58470477","line":6156,"range":{"start_line":6156,"start_character":8,"end_line":6156,"end_character":50},"updated":"2016-01-14 01:47:17.000000000","message":"Rename to test_block_device_mapping_get_all_by_volume_id.","commit_id":"fabb5130692c8a16ce047c6822b856801b7273d3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6fbefee768bcc3862c6cc923b303f9fb2cdef633","unresolved":false,"context_lines":[{"line_number":6162,"context_line":"        self.assertEqual(bdms[1][\u0027volume_id\u0027], \u0027fake_id\u0027)"},{"line_number":6163,"context_line":"        self.assertEqual(2, len(bdms))"},{"line_number":6164,"context_line":""},{"line_number":6165,"context_line":"    def test_block_device_mapping_get_by_volume_id_join_instance(self):"},{"line_number":6166,"context_line":"        self._create_bdm({\u0027volume_id\u0027: \u0027fake_id\u0027})"},{"line_number":6167,"context_line":"        bdms \u003d db.block_device_mapping_get_all_by_volume_id(self.ctxt,"},{"line_number":6168,"context_line":"                                                            \u0027fake_id\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_3839f0f2","line":6165,"range":{"start_line":6165,"start_character":34,"end_line":6165,"end_character":37},"updated":"2016-01-14 01:47:17.000000000","message":"get_all","commit_id":"fabb5130692c8a16ce047c6822b856801b7273d3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6fbefee768bcc3862c6cc923b303f9fb2cdef633","unresolved":false,"context_lines":[{"line_number":6177,"context_line":"        self.assertEqual(bdm[\u0027volume_id\u0027], \u0027fake_id\u0027)"},{"line_number":6178,"context_line":"        self.assertEqual(bdm[\u0027instance_uuid\u0027], self.instance[\u0027uuid\u0027])"},{"line_number":6179,"context_line":""},{"line_number":6180,"context_line":"    def test_block_device_mapping_get_by_instance_and_volume_id_multiplebdms("},{"line_number":6181,"context_line":"            self):"},{"line_number":6182,"context_line":"        self._create_bdm({\u0027volume_id\u0027: \u0027fake_id\u0027,"},{"line_number":6183,"context_line":"                          \u0027instance_uuid\u0027: self.instance[\u0027uuid\u0027]})"}],"source_content_type":"text/x-python","patch_set":4,"id":"da6ed579_180c2c40","line":6180,"updated":"2016-01-14 01:47:17.000000000","message":"I guess we don\u0027t actually want this case, but this at least tests that the .first() on the query returns only one.","commit_id":"fabb5130692c8a16ce047c6822b856801b7273d3"}]}
