临时资源跟踪

https://blueprints.launchpad.net/cinder/+spec/temp-resources

改进 Cinder 的临时资源跟踪,以防止相关的配额问题。

问题描述

Cinder 目前没有一致的方式来跟踪临时资源,这导致了配额错误。

在某些情况下,临时卷使用 admin 元数据表中的 temporary 键来标记它们,而在其他情况下,我们根据卷的 migration_status 字段来确定卷是否为临时卷,甚至还有卷没有被标记为临时卷的情况。由于这种标记临时卷的迂回方式以及多种选项的存在,使得我们的 Cinder 代码容易出错,正如其中相关的错误数量所清楚地表明的那样。

对于临时快照,Cinder 目前没有任何可靠的方式来跟踪它们,因此创建临时资源的代码假定一切都会顺利进行,并且该方法中的删除代码将在成功完成操作后被调用。有时事实并非如此,因为操作可能会失败并留下临时资源,迫使用户手动删除它们,这会破坏配额,因为 REST API 删除调用不知道它不应该触碰配额。

当我们说我们没有可靠的方式来跟踪快照时,我们指的是即使快照具有帮助识别它们的名称,例如 [revert] volume %s backup snapshotbackup-snap-%s,这些也是用户可以分配的有效快照名称,因此我们不能依赖它们来区分临时快照。

用例

在以下几种情况下,此功能将非常有用

  • 还原到快照配置为使用临时快照,但还原失败或临时卷的删除失败,因此用户最终手动删除快照,并且配额与实际情况保持同步。

  • 在启用 backup_use_temp_snapshot 时创建正在使用的卷的备份失败,或者临时资源的删除失败,迫使用户手动删除快照,并且用户希望配额与实际情况保持同步。

  • 驱动程序可能有一些缓慢的代码,由于性能原因在克隆或创建快照时被触发,但不适合临时卷执行。

提议的变更

建议的解决方案是在数据库中添加一个显式的字段,指示资源是否应计入配额。

该字段将命名为 use_quota,它将被添加到 volumessnapshots 数据库表中。我们目前没有临时备份,因此不会向 backups 数据库表添加任何字段。

这将取代 temporary admin 元数据条目和 migration_status 条目,因为我们需要继续支持滚动升级,在滚动升级中,我们可能正在运行不知道新的 use_quota 字段的代码。

备选方案

另一种解决方案是在卷的 admin 元数据表中像我们现在做的那样使用 temporary 键,并为快照创建这样一个表。

使用该替代方案,数据库查询可能会变得更加复杂,而使用建议的解决方案,它们将变得更简单。

数据模型影响

volumessnapshots 表中添加一个类型为 Booleanuse_quota 数据库字段。

它将具有在线数据迁移,以设置现有卷的 use_quota 字段,以及更新的 VolumeSnapshot OVO 的 save 方法,该方法在保存这些对象时设置此字段。

REST API 影响

将不会添加新的 REST API 端点,因为 use_quota 字段是一个内部字段,我们不希望用户或管理员修改它。

但是,由于这是有用的信息,我们将以更用户友好的名称 consumes_quota 将此字段添加到返回它的所有端点的卷的 JSON 响应中

  • 创建卷

  • 显示卷

  • 更新卷

  • 列出详细卷

  • 创建快照

  • 显示快照

  • 更新快照

  • 列出详细快照

安全影响

无。

Active/Active HA 影响

无,因为此更改主要影响在接收 REST API 删除请求时是否调用配额代码。

通知影响

无。

其他最终用户影响

该更改需要对 python-cinderclient 进行补丁,以显示新的返回字段 consumes_quota

性能影响

此更改不应降低性能,因为该字段将在创建时添加,并且不需要额外的数据库查询。

此外,一旦我们删除了与当前临时卷检查的兼容性代码,就可以在未来提高性能,例如,不需要写入 admin 元数据表,直接在数据库上进行配额同步计算等。

其他部署者影响

无。

开发人员影响

默认情况下,卷和快照 OVO 在创建时将使用配额(将 use_quota 设置为 True),并且当开发人员想要创建不消耗创建或释放配额的临时资源时,需要在创建时传递 use_quota=False

此外,在进行配额(添加或删除)时,新代码将需要检查卷和快照中的此字段。

不再需要添加额外的 admin 元数据或检查 migration_status,这应该使编码更容易并减少相关错误的数量。

实现

负责人

主要负责人

Gorka Eguileor (geguileo)

工作项

  • 数据库模式更改。

  • 数据库在线迁移和 OVO 更改。

  • 更新将卷标记为临时资源的操作,以使用新的 use_quota 字段。

  • 更新当前未将资源标记为临时资源的操作,以使用新的 use_quota 字段执行此操作。

  • REST API 更改,以将 use_quota 字段作为 consumes_quota 返回。

  • Cinderclient 更改。

依赖项

无。

测试

将不会添加新的 tempest 测试,因为我们想要修复的情况主要围绕着我们无法在 tempest 中强制执行的错误情况。

将提供单元测试,就像任何其他补丁一样。

文档影响

将更新 API 参考文档。

参考资料

建议的 Cinder 代码实现

建议的 python-cinderclient 代码实现

建议的代码,以利用 RBD 驱动程序中的此新功能,从而不展平临时资源