)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d0dc3d407547457db2ae9ba0da2b8f95ddfea32e","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"compute: Avoid duplicate BDMs during reserve_block_device_name"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When attaching a volume to a running instance the nova-api validates that"},{"line_number":10,"context_line":"the volume is not already attached to the instance. However nova-compute"},{"line_number":11,"context_line":"is responsible for actually creating the BDM entry in the database."},{"line_number":12,"context_line":"If sending attach requests fast enough it can be possible that the same"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"8d212a08_62429b11","line":9,"updated":"2021-07-23 14:02:55.000000000","message":"nit: wrap at \u003c\u003d 72 characters","commit_id":"1c66063d7ed5b1c46632f008a3a65c7685d0b983"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"ceaaeca1f25f8f89bfa0403217f5458a0473d336","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"compute: Avoid duplicate BDMs during reserve_block_device_name"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"When attaching a volume to a running instance the nova-api validates that"},{"line_number":10,"context_line":"the volume is not already attached to the instance. However nova-compute"},{"line_number":11,"context_line":"is responsible for actually creating the BDM entry in the database."},{"line_number":12,"context_line":"If sending attach requests fast enough it can be possible that the same"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"341a2db8_06bafad5","line":9,"in_reply_to":"8d212a08_62429b11","updated":"2021-07-26 06:44:58.000000000","message":"Done","commit_id":"1c66063d7ed5b1c46632f008a3a65c7685d0b983"}],"nova/compute/manager.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ece272d9f10f04f0980879050923c93d19ea72c5","unresolved":true,"context_lines":[{"line_number":6982,"context_line":"                objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":6983,"context_line":"                    context, instance.uuid))"},{"line_number":6984,"context_line":""},{"line_number":6985,"context_line":"            # Now that we have the lock check that we haven\u0027t raced another"},{"line_number":6986,"context_line":"            # request and ensure there is no existing attachment"},{"line_number":6987,"context_line":"            if any(b for b in bdms if b.volume_id \u003d\u003d volume_id):"},{"line_number":6988,"context_line":"                msg \u003d _(\"volume %s already attached\") % volume_id"}],"source_content_type":"text/x-python","patch_set":6,"id":"628cb94f_48bc1b1c","line":6985,"updated":"2021-08-04 12:00:40.000000000","message":"hm, this lock only saves us if the two racing attach requests are targeting the same instance. \n\nSo this is a good fix, but it does not fully close the race window. For that we would need to lock both of the instance.uuid and the volume_id at the same time and also query the existing bdms without filtering for the instance uuid.","commit_id":"2209b0007fe85d7c5439e0bfdfe2120c63898fa2"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"e1b052237ff0525722fe6c299bd086d74571dfab","unresolved":true,"context_lines":[{"line_number":6982,"context_line":"                objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":6983,"context_line":"                    context, instance.uuid))"},{"line_number":6984,"context_line":""},{"line_number":6985,"context_line":"            # Now that we have the lock check that we haven\u0027t raced another"},{"line_number":6986,"context_line":"            # request and ensure there is no existing attachment"},{"line_number":6987,"context_line":"            if any(b for b in bdms if b.volume_id \u003d\u003d volume_id):"},{"line_number":6988,"context_line":"                msg \u003d _(\"volume %s already attached\") % volume_id"}],"source_content_type":"text/x-python","patch_set":6,"id":"eae82549_7a12f039","line":6985,"in_reply_to":"628cb94f_48bc1b1c","updated":"2021-08-04 13:19:40.000000000","message":"I think when targeting two instances we would not run into this problem.\n\nThe do_reserve here will create two BDMs correctly and pass them back to the nova api.\nThe api will then fail for one of the two attachments when it calls `self.volume_api.attachment_create` in `nova.compute.api.API._check_attach_and_reserve_volume` since cinder does not allow two \"reserved\" volume attachments for different instances at the same time.\nAfterwards nova will clean up the failed BDM in the except clause in `_attach_volume`.","commit_id":"2209b0007fe85d7c5439e0bfdfe2120c63898fa2"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"33278564748f840007b9e333ee52d0f97a438ffa","unresolved":true,"context_lines":[{"line_number":6982,"context_line":"                objects.BlockDeviceMappingList.get_by_instance_uuid("},{"line_number":6983,"context_line":"                    context, instance.uuid))"},{"line_number":6984,"context_line":""},{"line_number":6985,"context_line":"            # Now that we have the lock check that we haven\u0027t raced another"},{"line_number":6986,"context_line":"            # request and ensure there is no existing attachment"},{"line_number":6987,"context_line":"            if any(b for b in bdms if b.volume_id \u003d\u003d volume_id):"},{"line_number":6988,"context_line":"                msg \u003d _(\"volume %s already attached\") % volume_id"}],"source_content_type":"text/x-python","patch_set":6,"id":"83ccf279_b6ec3982","line":6985,"in_reply_to":"eae82549_7a12f039","updated":"2021-08-05 07:44:34.000000000","message":"Ohh cool. Thanks for the explanation.","commit_id":"2209b0007fe85d7c5439e0bfdfe2120c63898fa2"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ece272d9f10f04f0980879050923c93d19ea72c5","unresolved":true,"context_lines":[{"line_number":6986,"context_line":"            # request and ensure there is no existing attachment"},{"line_number":6987,"context_line":"            if any(b for b in bdms if b.volume_id \u003d\u003d volume_id):"},{"line_number":6988,"context_line":"                msg \u003d _(\"volume %s already attached\") % volume_id"},{"line_number":6989,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":6990,"context_line":""},{"line_number":6991,"context_line":"            # NOTE(ndipanov): We need to explicitly set all the fields on the"},{"line_number":6992,"context_line":"            #                 object so that obj_load_attr does not fail"}],"source_content_type":"text/x-python","patch_set":6,"id":"80e0790d_eb840542","line":6989,"range":{"start_line":6989,"start_character":32,"end_line":6989,"end_character":45},"updated":"2021-08-04 12:00:40.000000000","message":"OK this is already handled in the API and translated to HTTP 400","commit_id":"2209b0007fe85d7c5439e0bfdfe2120c63898fa2"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d0dc3d407547457db2ae9ba0da2b8f95ddfea32e","unresolved":true,"context_lines":[{"line_number":613,"context_line":"                              \u0027fake_device\u0027, \u0027fake_volume_id\u0027, \u0027fake_disk_bus\u0027,"},{"line_number":614,"context_line":"                              \u0027fake_device_type\u0027, tag\u003dNone, multiattach\u003dTrue)"},{"line_number":615,"context_line":""},{"line_number":616,"context_line":"    @mock.patch.object(compute_utils, \u0027add_instance_fault_from_exc\u0027)"},{"line_number":617,"context_line":"    @mock.patch.object(objects.BlockDeviceMapping, \u0027create\u0027)"},{"line_number":618,"context_line":"    @mock.patch.object(objects.BlockDeviceMappingList, \u0027get_by_instance_uuid\u0027)"},{"line_number":619,"context_line":"    def test_reserve_block_device_name_raises_on_duplicate(self, mock_get,"}],"source_content_type":"text/x-python","patch_set":3,"id":"c4c3ac2a_4708d54f","line":616,"updated":"2021-07-23 14:02:55.000000000","message":"nit:\n\n  new\u003dmock.Mock()\n\nto avoid the unnecessary \u0027_\u0027 variable below.\n\nProbably for the \u0027create\u0027 mock too, since you don\u0027t seem to refer to that","commit_id":"1c66063d7ed5b1c46632f008a3a65c7685d0b983"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"ceaaeca1f25f8f89bfa0403217f5458a0473d336","unresolved":false,"context_lines":[{"line_number":613,"context_line":"                              \u0027fake_device\u0027, \u0027fake_volume_id\u0027, \u0027fake_disk_bus\u0027,"},{"line_number":614,"context_line":"                              \u0027fake_device_type\u0027, tag\u003dNone, multiattach\u003dTrue)"},{"line_number":615,"context_line":""},{"line_number":616,"context_line":"    @mock.patch.object(compute_utils, \u0027add_instance_fault_from_exc\u0027)"},{"line_number":617,"context_line":"    @mock.patch.object(objects.BlockDeviceMapping, \u0027create\u0027)"},{"line_number":618,"context_line":"    @mock.patch.object(objects.BlockDeviceMappingList, \u0027get_by_instance_uuid\u0027)"},{"line_number":619,"context_line":"    def test_reserve_block_device_name_raises_on_duplicate(self, mock_get,"}],"source_content_type":"text/x-python","patch_set":3,"id":"e3588bb9_ba8ace68","line":616,"in_reply_to":"c4c3ac2a_4708d54f","updated":"2021-07-26 06:44:58.000000000","message":"Done","commit_id":"1c66063d7ed5b1c46632f008a3a65c7685d0b983"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d0dc3d407547457db2ae9ba0da2b8f95ddfea32e","unresolved":true,"context_lines":[{"line_number":617,"context_line":"    @mock.patch.object(objects.BlockDeviceMapping, \u0027create\u0027)"},{"line_number":618,"context_line":"    @mock.patch.object(objects.BlockDeviceMappingList, \u0027get_by_instance_uuid\u0027)"},{"line_number":619,"context_line":"    def test_reserve_block_device_name_raises_on_duplicate(self, mock_get,"},{"line_number":620,"context_line":"                                                           mock_create, _):"},{"line_number":621,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":622,"context_line":"        vol_bdm \u003d objects.BlockDeviceMapping("},{"line_number":623,"context_line":"            self.context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"28a8ebfa_da403db5","line":620,"updated":"2021-07-23 14:02:55.000000000","message":"nit:\n\n    def test_reserve_block_device_name_raises_on_duplicate(\n        self, mock_get, mock_create,\n    ):","commit_id":"1c66063d7ed5b1c46632f008a3a65c7685d0b983"},{"author":{"_account_id":29074,"name":"Felix Huettner","email":"felix.huettner@digits.schwarz","username":"felix.huettner"},"change_message_id":"ceaaeca1f25f8f89bfa0403217f5458a0473d336","unresolved":false,"context_lines":[{"line_number":617,"context_line":"    @mock.patch.object(objects.BlockDeviceMapping, \u0027create\u0027)"},{"line_number":618,"context_line":"    @mock.patch.object(objects.BlockDeviceMappingList, \u0027get_by_instance_uuid\u0027)"},{"line_number":619,"context_line":"    def test_reserve_block_device_name_raises_on_duplicate(self, mock_get,"},{"line_number":620,"context_line":"                                                           mock_create, _):"},{"line_number":621,"context_line":"        instance \u003d fake_instance.fake_instance_obj(self.context)"},{"line_number":622,"context_line":"        vol_bdm \u003d objects.BlockDeviceMapping("},{"line_number":623,"context_line":"            self.context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"ac0a3d23_cca28dcf","line":620,"in_reply_to":"28a8ebfa_da403db5","updated":"2021-07-26 06:44:58.000000000","message":"Done","commit_id":"1c66063d7ed5b1c46632f008a3a65c7685d0b983"}]}
