清理所有 ImageCache 的机制¶
https://blueprints.launchpad.net/ironic/+spec/cleanup-all-imagecaches
本文档讨论创建一个清理所有镜像缓存的机制(利用 pxe 驱动程序中已有的大部分代码)
问题描述¶
用于清理 ImageCache(或其子类)的方法 _cleanup_caches_if_required 位于 pxe 驱动程序中。因此,位于任何其他文件中的任何其他 ImageCache 子类都无法使用此清理方法。
此代码是在此提交中引入的:https://review.openstack.org/#/c/92625
提议的变更¶
将清理方法放置在 pxe 驱动程序中的原因是,它需要了解其他 ImageCache 子类,以便进行高效的清理,以弥补缓存中所需的空间。如果清理当前缓存后,缓存中没有足够的可用空间,则位于相同文件系统中的其他 ImageCache 也会被清理。此方法硬编码了 InstanceImageCache 和 TFTPImageCache,以便在任何缓存清理时进行清理。
问题可以如下解决
希望在其他缓存清理中使用(当前为
InstanceImageCache和TFTPImageCache)的每个 ImageCache 子类都添加一个装饰器@image_cache.cleanup(priority=N)。N 应该是一个正整数,表示在清理提供的缓存后,需要额外的可用空间时,缓存应该被清理的优先级。N 的值越高,优先级越高。如果两个缓存具有相同的值 N(可能在代码的不同位置),则这两个缓存的清理顺序是不可预测的(它将取决于哪个模块首先加载)。目前
InstanceImageCache较大,应该在TFTPImageCache之前清理。因此,它们将如下所示@image_cache.cleanup(priority=50) class InstanceImageCache(...) ... @image_cache.cleanup(priority=25) class TFTPImageCache(...) ...
image_cache.py 中将存在一个列表
cache_cleanup_list,其中包含一个排序后的ImageCache实例列表,这些实例将被视为用于清理。装饰器函数cleanup将子类的实例ImageCache添加到列表中。在添加条目后,此列表将按priority的非递增顺序排序。方法
_cleanup_caches_if_required将移动到 ironic.common.image_cache 并重命名为clean_up_caches。方法_cleanup_caches_if_required当前使用硬编码的缓存列表来清理额外的空间。相反,新提出的方法将仅使用列表cache_cleanup_list。PXEImageCache不会拥有装饰器@image_cache.cleanup。
备选方案¶
清理代码可以继续存在于 pxe 驱动程序中,并且 pxe 驱动程序可以导入并维护源代码树中所有缓存的硬编码列表。这很难维护且不合逻辑。
另一种选择是将该方法移动到公共位置,但清理可能会在模块了解的缓存上启动。这不如提议的解决方案有效,因为提议的解决方案可以考虑更多缓存进行清理并弥补所需的空间。
数据模型影响¶
无。
REST API 影响¶
无。
驱动程序 API 影响¶
无。
Nova 驱动程序影响¶
无。
安全影响¶
无。
其他最终用户影响¶
无。
可扩展性影响¶
无。
性能影响¶
无。
其他部署者影响¶
无。
开发人员影响¶
希望引入新的
ImageCache子类的开发人员可以添加装饰器@image_cache.cleanup并为整体 ironic 利益分配一个priority。希望被清理的 ImageCache 子类不应在构造函数中接受任何参数。
实现¶
负责人¶
rameshg87
工作项¶
将
_cleanup_caches_if_required从 ironic.drivers.modules.pxe 重新组织到 ironic.common.image_cache。修改 ironic.tests.drivers.test_pxe 中 fetch_images() 方法的单元测试
依赖项¶
无。
测试¶
现有的单元测试将根据提议的行为进行修改。
文档影响¶
无。
参考资料¶
无。