清理所有 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 也会被清理。此方法硬编码了 InstanceImageCacheTFTPImageCache,以便在任何缓存清理时进行清理。

问题可以如下解决

  • 希望在其他缓存清理中使用(当前为 InstanceImageCacheTFTPImageCache)的每个 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() 方法的单元测试

依赖项

无。

测试

现有的单元测试将根据提议的行为进行修改。

文档影响

无。

参考资料

无。