批量创建50台主机,发现特别慢,查看cinder-volume日志,发现有大量的 下载镜像的过程。这就很奇怪了,为什么会下载镜像
于是查看代码,看代码一切正常,除非image_location为空,才有可能会下载镜像。
于是继续debug,发现果然没有image_location了, 为什么会出现这种情况? 使用glance 命令在次查看,是有 location的啊。
于是在继续debug,发现一个 def get_location的方法
def get_location(self, context, image_id):
"""Get backend storage location url.
Returns a tuple containing the direct url and locations representing
the backend storage location, or (None, None) if these attributes are
not shown by Glance.
"""
if CONF.glance_api_version == 1: 在glance_api_version == 1的时候才会直接返回 None
# image location not available in v1
return (None, None)
try:
# direct_url is returned by v2 api
client = GlanceClientWrapper(version=2)
image_meta = client.call(context, 'get', image_id)
except Exception:
_reraise_translated_image_exception(image_id)
if not self._is_image_available(context, image_meta):
raise exception.ImageNotFound(image_id=image_id)
# some glance stores like nfs only meta data
# is stored and returned as locations.
# so composite of two needs to be returned.
return (getattr(image_meta, 'direct_url', None),
getattr(image_meta, 'locations', None))
于是马上查看 /etc/cinder/cinder.conf 配置文件,搜索 glance_api_version 发现,是等于 2 的啊,于是查看代码,发现10.0.4版本的代码glance_api_version默认是1,这就坑了。
但是我配置文件里设置了等于2了啊,这就郁闷了,难道是/usr/share/cinder 起作用?
于是到处搜索 glance_api_version ,终于在代码里找到了,10.0.4 版本glance_api_version 是1,可是我配置文件里写了2啊,于是写在ceph的块里了,在[default]下面也要写。
于是在[default] 下加上 glance_api_version = 2, 完全解决。还顺便看了下整个cinder创建的流程, taskflow, ceph删除快照和查看快照等。 解决问题就是一个很好的学习过程吧。