为聚合关联表示添加世代¶
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 中的存储,被多个集群使用),我希望能够确保在设置关联时,我不会破坏其他线程可能设置的聚合关联。
提议的变更¶
在一个新的微版本中,GET 和 PUT /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 更新就足够了。
参考资料¶
之前的 get 格式(微版本 1.1)
之前的 put 格式(微版本 1.1)
历史¶
发布名称 |
描述 |
|---|---|
Rocky |
引入 |