Hey folks,
One of the challenges we have faced with the ability to attach a single volume to multiple instances, is how to correctly detach that volume. The issue is a bit complex, but I'll try and explain the problem, and then describe one approach to solving one part of the detach puzzle.

Problem:
When a volume is attached to multiple instances on the same host. There are 2 scenarios here.

1) Some Cinder drivers export a new target for every attachment on a compute host. This means that you will get a new unique volume path on a host, which is then handed off to the VM instance.

2) Other Cinder drivers export a single target for all instances on a compute host. This means that every instance on a single host, will reuse the same host volume path.


When a user issues a request to detach a volume, the workflow boils down to first calling os-brick's connector.disconnect_volume before calling Cinder's terminate_connection and detach. disconnect_volume's job is to remove the local volume from the host OS and close any sessions.

There is no problem under scenario 1. Each disconnect_volume only affects the attached volume in question and doesn't affect any other VM using that same volume, because they are using a different path that has shown up on the host. It's a different target exported from the Cinder backend/array.

The problem comes under scenario 2, where that single volume is shared for every instance on the same compute host. Nova needs to be careful and not call disconnect_volume if it's a shared volume, otherwise the first disconnect_volume call will nuke every instance's access to that volume.


Proposed solution:
Nova needs to determine if the volume that's being detached is a shared or non shared volume. Here is one way to determine that.

Every Cinder volume has a list of it's attachments. In those attachments it contains the instance_uuid that the volume is attached to. I presume Nova can find which of the volume attachments are on the same host. Then Nova can call Cinder's initialize_connection for each of those attachments to get the target's connection_info dictionary. This connection_info dictionary describes how to connect to the target on the cinder backend. If the target is shared, then each of the connection_info dicts for each attachment on that host will be identical. Then Nova would know that it's a shared target, and then only call os-brick's disconnect_volume, if it's the last attachment on that host. I think at most 2 calls to cinder's initialize_connection would suffice to determine if the volume is a shared target. This would only need to be done if the volume is multi-attach capable and if there are more than 1 attachments on the same host, where the detach is happening.

Walt

__________________________________________________________________________
OpenStack Development Mailing List (not for usage questions)
Unsubscribe: openstack-dev-requ...@lists.openstack.org?subject:unsubscribe
http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev

Reply via email to