7f3a77b66f
If multiple attachments are requested simultaneously, a volume can be attached to an instance more than once. This fixes this problem by detecting that a race has occurred in _attachment_reserve, and backing out one of the invalid attachment records. This means that if the attachment API is called repeatedly and quickly for the same volume, some requests may fail, but this is much better than incorrectly creating multiple attachments. Closes-Bug: #1833736 Change-Id: Ic2463338b698c5cf805c0ae06d0229f54f64b3fc
54 lines
1.4 KiB
Python
54 lines
1.4 KiB
Python
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""Cinder OS API WSGI application."""
|
|
|
|
|
|
import sys
|
|
import warnings
|
|
|
|
from cinder import objects
|
|
|
|
warnings.simplefilter('once', DeprecationWarning)
|
|
|
|
from oslo_config import cfg
|
|
from oslo_log import log as logging
|
|
from oslo_service import wsgi
|
|
|
|
from cinder import i18n
|
|
i18n.enable_lazy()
|
|
|
|
# Need to register global_opts
|
|
from cinder.common import config
|
|
from cinder.common import constants
|
|
from cinder import coordination
|
|
from cinder import rpc
|
|
from cinder import service
|
|
from cinder import version
|
|
|
|
CONF = cfg.CONF
|
|
|
|
|
|
def initialize_application():
|
|
objects.register_all()
|
|
CONF(sys.argv[1:], project='cinder',
|
|
version=version.version_string())
|
|
logging.setup(CONF, "cinder")
|
|
config.set_middleware_defaults()
|
|
|
|
coordination.COORDINATOR.start()
|
|
|
|
rpc.init(CONF)
|
|
service.setup_profiler(constants.API_BINARY, CONF.host)
|
|
|
|
return wsgi.Loader(CONF).load_app(name='osapi_volume')
|