为聚合关联表示添加世代

https://blueprints.launchpad.net/nova/+spec/placement-aggregate-generation

随着资源提供者处理的演进,显而易见的是,virt 驱动程序可能希望管理复杂的一组相互关联的资源提供者、资源类、特性和聚合。其中一些实体可能需要由多个处理线程管理,包括不同的 nova-compute 进程。

Placement 服务中的 generation(世代)概念提供了一种管理这些并发操作的工具:包含世代的写入 API 请求会将该世代与服务器上的值进行比较。如果匹配,则请求可以继续,否则将返回 409 Conflict(冲突)响应。

将资源提供者与一个或多个聚合 UUID 关联或取消关联时,目前没有这种功能。对于希望安全管理聚合关联的 virt 驱动程序来说,这是必要的。本规范描述了添加此功能所需的更改。

问题描述

如上所述,virt 驱动程序可能希望以线程安全的方式管理资源提供者聚合关联。由于聚合关联当前未使用 generation(世代)机制来管理并发,因此这是不可能的。主要问题在于,在线程 A 设置关联时,意外删除其他线程 B 设置的聚合,或者重新添加线程 B 删除的聚合。

用例

作为管理可能在计算节点之间共享的资源的 virt 驱动程序的开发人员(例如,PowerVM 或 vCenter 中的存储,被多个集群使用),我希望能够确保在设置关联时,我不会破坏其他线程可能设置的聚合关联。

提议的变更

在一个新的微版本中,GETPUT /resource_providers/{uuid}/aggregates 的表示形式将被更新为 a) 对两种方法都相同,并且 b) 包含一个 resource_provider_generation(资源提供者世代)属性,其值为由 {uuid} 标识的资源提供者的 generation(世代)。

处理 PUT 请求时,如果 generation(世代)与资源提供者的当前(服务器端)世代不匹配,则请求将被拒绝,并返回 409 Conflict(冲突)响应。

表示形式更改的详细信息如下所示。

当使用较旧的微版本发出请求时,请求不包含世代,则数据库中的资源提供者世代将不会更新。这是因为 Nova 中现有的代码当前依赖于世代不更新。如果 Nova 有它,那么其他地方很容易有代码。

备选方案

我们可以考虑什么都不做。最初,我们认为我们不需要此功能,因为期望是不会有多个线程尝试管理单个资源提供者的聚合关联。典型的例子是上面描述的共享存储资源。在这种情况下,多个计算节点将希望管理聚合关联。

我们希望支持它,所以什么都不做实际上不是一种选择。

数据模型影响

数据模型不会改变。聚合关联的持久性将保持不变。

REST API 影响

GET /resource_providers/{uuid}/aggregates 的格式将更改为添加一个 resource_provider_generation 字段

{
    "aggregates": [
        "42896e0d-205d-4fe3-bd1e-100924931787",
        "5e08ea53-c4c6-448e-9334-ac4953de3cfa"
    ],
    "resource_provider_generation": 5
}

有效的响应代码将保持不变。

在微版本 1.1 中引入的 之前的 get 格式不包含世代字段。

PUT /resource_providers/{uuid}/aggregates 的格式将与 GET 格式(上述)相同。这与 之前的 put 格式不同,现在,不再是裸 UUID 列表,而是一个包含两个字段的对象:aggregates(接受 UUID 列表),以及 resource_provider_generation(接受一个非负整数)。JSON Schema 将更新以反映这些要求。

除了调用 PUT /resource_providers/{uuid}/aggregates 时当前可能存在的 200、400 和 404 响应代码之外,当 resource_provider_generation 字段与服务器端值不匹配时,将返回 409 Conflict(冲突)响应代码。

为了保持向后兼容性,使用较旧的微版本将导致以前的行为:也就是说,提供者的聚合关联将被替换,而不会考虑提供者世代。

安全影响

N/A

通知影响

N/A

其他最终用户影响

可以更新 osc-placement 插件以反映此新功能。

性能影响

N/A

其他部署者影响

N/A

开发人员影响

有了此功能,virt 驱动程序开发人员将能够使用 ProviderTree 机制更有效地管理聚合关联。

升级影响

N/A

实现

负责人

主要负责人

cdent

其他贡献者

efried

工作项

  • PUT /resource_providers/{uuid}/aggregates 的新微版本创建 JSON Schema。

  • 添加新的微版本处理程序以支持 gabbi 驱动的测试中 GET 和 PUT 的新格式。

  • 调整 ResourceProvider.set_aggregates 方法以可选地使用 _increment_provider_generation,并在世代不匹配时引发 ConcurrentUpdateDetected,从而将 409 Conflict 作为响应发送。

  • 更新 placement-api-ref。

依赖项

N/A

测试

足以测试此功能的 gabbi 测试应该会导致预期的 409 响应。

文档影响

placement-api-ref 更新就足够了。

参考资料

历史

修订版

发布名称

描述

Rocky

引入