将周期性任务切换到 Futurist 库

https://bugs.launchpad.net/ironic/+bug/1526277

Futurist 是一个新的 Oslo 库,提供了编写异步代码的工具。 本规范建议将我们的周期性任务实现切换到 Futurist 以解决一些长期存在的问题。

问题描述

我们当前实现的主要问题是,所有周期性任务都在一个线程中运行。 任何阻塞一段时间的任务都会阻止所有其他任务执行,并且在使用 IPMI 检查电源状态的任务中经常发生这种情况。

切换到 Futurist 将允许并行执行所有任务。

提议的变更

  • 修改 conductor 以使用 Futurist 库,而不是 oslo incubator 中的实现。

    现有的 worker pool 将被重用于周期性任务。 因此,现有的选项 workers_pool_size 将设置任何时刻可以并行运行的最大任务数。

  • ironic.openstack.common.periodic_task 的所有用法切换到 Futurist 装饰器,并删除此模块。

  • ironic.drivers.base.driver_periodic_task 切换为在内部使用 Futurist 装饰器并弃用它。

备选方案

  • 我们可以修复现有的实现。 但实际上这并不容易,因为它本质上需要重写它。

数据模型影响

状态机影响

REST API 影响

客户端 (CLI) 影响

RPC API 影响

驱动程序 API 影响

  • 创建驱动程序周期性任务的旧方法将被弃用,驱动程序最终应切换到使用 Futurist 装饰器。

Nova 驱动程序影响

Ramdisk 影响

N/A

安全影响

其他最终用户影响

可扩展性影响

  • 预计对可扩展性产生整体积极影响,因为每个 Ironic conductor 至少在理论上都能够管理更多的 IPMI 节点。

性能影响

  • 一个周期性任务的性能将不再影响其他周期性任务的计时。

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Dmitry Tantsur (irc: dtantsur, lp: divius)

工作项

  • 更改 conductor manager 以使用 Futurist

  • 修改 driver_periodic_task 在内部使用 Futurist

依赖项

唯一的重大依赖项是 Futurist 本身。 在撰写本文时,它尚未发布官方版本,但正在快速发展,所有必需的代码已经登陆到 git master 分支。

测试

单元测试应该已经涵盖此功能。 将添加确保并行化的特定测试。

升级和向后兼容性

文档影响

应更新驱动程序周期性任务的文档,以提及 Futurist,而不是临时实现。

参考资料