Merge "Send 'create volume from snapshot' to the proper host"
This commit is contained in:
@@ -26,6 +26,7 @@ from eventlet import greenthread
|
|||||||
|
|
||||||
from cinder import exception
|
from cinder import exception
|
||||||
from cinder import flags
|
from cinder import flags
|
||||||
|
from cinder.openstack.common import cfg
|
||||||
from cinder.openstack.common import log as logging
|
from cinder.openstack.common import log as logging
|
||||||
from cinder.openstack.common import rpc
|
from cinder.openstack.common import rpc
|
||||||
import cinder.policy
|
import cinder.policy
|
||||||
@@ -34,7 +35,12 @@ from cinder import quota
|
|||||||
from cinder import utils
|
from cinder import utils
|
||||||
from cinder.db import base
|
from cinder.db import base
|
||||||
|
|
||||||
|
volume_host_opt = cfg.BoolOpt('snapshot_same_host',
|
||||||
|
default=True,
|
||||||
|
help='Create volume from snapshot at the host where snapshot resides')
|
||||||
|
|
||||||
FLAGS = flags.FLAGS
|
FLAGS = flags.FLAGS
|
||||||
|
FLAGS.register_opt(volume_host_opt)
|
||||||
flags.DECLARE('storage_availability_zone', 'cinder.volume.manager')
|
flags.DECLARE('storage_availability_zone', 'cinder.volume.manager')
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
@@ -113,14 +119,36 @@ class API(base.Base):
|
|||||||
}
|
}
|
||||||
|
|
||||||
volume = self.db.volume_create(context, options)
|
volume = self.db.volume_create(context, options)
|
||||||
rpc.cast(context,
|
self._cast_create_volume(context, volume['id'], snapshot_id)
|
||||||
FLAGS.scheduler_topic,
|
|
||||||
{"method": "create_volume",
|
|
||||||
"args": {"topic": FLAGS.volume_topic,
|
|
||||||
"volume_id": volume['id'],
|
|
||||||
"snapshot_id": snapshot_id}})
|
|
||||||
return volume
|
return volume
|
||||||
|
|
||||||
|
def _cast_create_volume(self, context, volume_id, snapshot_id):
|
||||||
|
|
||||||
|
# NOTE(Rongze Zhu): It is a simple solution for bug 1008866
|
||||||
|
# If snapshot_id is set, make the call create volume directly to
|
||||||
|
# the volume host where the snapshot resides instead of passing it
|
||||||
|
# through the scheduer. So snapshot can be copy to new volume.
|
||||||
|
|
||||||
|
if snapshot_id and FLAGS.snapshot_same_host:
|
||||||
|
snapshot_ref = self.db.snapshot_get(context, snapshot_id)
|
||||||
|
src_volume_ref = self.db.volume_get(context,
|
||||||
|
snapshot_ref['volume_id'])
|
||||||
|
topic = rpc.queue_get_for(context,
|
||||||
|
FLAGS.volume_topic,
|
||||||
|
src_volume_ref['host'])
|
||||||
|
rpc.cast(context,
|
||||||
|
topic,
|
||||||
|
{"method": "create_volume",
|
||||||
|
"args": {"volume_id": volume_id,
|
||||||
|
"snapshot_id": snapshot_id}})
|
||||||
|
else:
|
||||||
|
rpc.cast(context,
|
||||||
|
FLAGS.scheduler_topic,
|
||||||
|
{"method": "create_volume",
|
||||||
|
"args": {"topic": FLAGS.volume_topic,
|
||||||
|
"volume_id": volume_id,
|
||||||
|
"snapshot_id": snapshot_id}})
|
||||||
|
|
||||||
# TODO(yamahata): eliminate dumb polling
|
# TODO(yamahata): eliminate dumb polling
|
||||||
def wait_creation(self, context, volume):
|
def wait_creation(self, context, volume):
|
||||||
volume_id = volume['id']
|
volume_id = volume['id']
|
||||||
|
|||||||
@@ -564,6 +564,11 @@
|
|||||||
###### (IntOpt) maximum number of volume gigabytes to allow per host
|
###### (IntOpt) maximum number of volume gigabytes to allow per host
|
||||||
# max_gigabytes=10000
|
# max_gigabytes=10000
|
||||||
|
|
||||||
|
######## defined in cinder.volume.api ########
|
||||||
|
|
||||||
|
# snapshot_same_host=true
|
||||||
|
#### (BoolOpt) Create volume form snapshot at the host where snapshot resides.
|
||||||
|
|
||||||
######### defined in cinder.volume.driver #########
|
######### defined in cinder.volume.driver #########
|
||||||
|
|
||||||
###### (StrOpt) iscsi target user-land tool to use
|
###### (StrOpt) iscsi target user-land tool to use
|
||||||
|
|||||||
Reference in New Issue
Block a user