On 02/09/2016 02:04 PM, Ildikó Váncsa wrote:
Hi Walt,
Thanks for starting this thread. It is a good summary of the issue and the
proposal also looks feasible to me.
I have a quick, hopefully not too wild idea based on the earlier discussions we
had. We were considering earlier to store the target identifier together with
the other items of the attachment info. The problem with this idea is that when
we call initialize_connection from Nova, Cinder does not get the relevant
information, like instance_id, to be able to do this. This means we cannot do
that using the functionality we have today.
My idea here is to extend the Cinder API so that Nova can send the missing
information after a successful attach. Nova should have all the information
including the 'target', which means that it could update the attachment
information through the new Cinder API.
I think we need to do is to allow the connector to be passed at
os-attach time. Then cinder can save it in the attachment's table entry.
We will also need a new cinder API to allow that attachment to be
updated during live migration, or the connector for the attachment will
get stale and incorrect.
Walt
It would mean that when we request for the volume info from Cinder at detach
time the 'attachments' list would contain all the required information for each
attachments the volume has. If we don't have the 'target' information because
of any reason we can still use the approach described below as fallback. This
approach could even be used in case of live migration I think.
The Cinder API extension would need to be added with a new microversion to
avoid problems with older Cinder versions talking to new Nova.
The advantage of this direction is that we can reduce the round trips to Cinder
at detach time. The round trip after a successful attach should not have an
impact on the normal operation as if that fails the only issue we have is we
need to use the fall back method to be able to detach properly. This would
still affect only multiattached volumes, where we have more than one
attachments on the same host. By having the information stored in Cinder as
well we can also avoid removing a target when there are still active
attachments connected to it.
What do you think?
Thanks,
Ildikó
-----Original Message-----
From: Walter A. Boring IV [mailto:walter.bor...@hpe.com]
Sent: February 09, 2016 20:50
To: OpenStack Development Mailing List (not for usage questions)
Subject: [openstack-dev] [Nova][Cinder] Multi-attach, determining when to call
os-brick's connector.disconnect_volume
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
__________________________________________________________________________
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
.
__________________________________________________________________________
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