错误处理与诊断 - 第427页
我们继续深入讲解 NVMe Express Base Specification 2.0b 第 8.19 节 Reservation(预留)机制中的核心命令操作,这节内容聚焦在:
🎯 Reservation 的获取(Acquire)、释放(Release)、抢占(Preempt)
🛡️ 1. Acquiring a Reservation(获取预留)
✅ 操作步骤:
主机执行 Reservation Acquire 命令,字段设置如下:
| 字段 | 值 | 说明 |
|---|---|---|
| RACQA | 000b |
表示 Acquire 行为 |
| CRKEY | 当前注册的 Reservation Key | 必须与主机注册时一致 |
| RTYPE | 所请求的 Reservation 类型 | Write Exclusive 等六种类型之一 |
⚠️ 异常与限制:
- 如果
CRKEY与当前注册 Key 不匹配 →Reservation Conflict - 如果主机未注册该命名空间 →
Reservation Conflict - 若命名空间已被其他主机持有 Reservation →
Reservation Conflict - 同一个主机 再次 Acquire 同类型 Reservation → ✅ 合法(不会报错)
- 若同一主机尝试 Acquire 不同类型 Reservation → ❌ 也会
Reservation Conflict
🧯 2. Releasing a Reservation(释放预留)
只有 Reservation 的 持有者(Holder) 才能释放它。
✅ 操作步骤:
执行 Reservation Release 命令,字段设置如下:
| 字段 | 值 | 说明 |
|---|---|---|
| RRELA | 000b |
表示 Release 行为 |
| CRKEY | 当前注册的 Reservation Key | |
| RTYPE | 当前所持有 Reservation 类型 |
⚠️ 特殊处理:
- 如果
CRKEY与当前 Key 不一致 →Reservation Conflict - 如果
RTYPE与当前 Reservation 类型不一致 → ❌Invalid Field in Command - 如果主机 不是持有者,则命令仍然 正常完成(不报错)但 无效操作
🔔 Reservation Released Notification
若释放的是以下类型的 Reservation:
- Write Exclusive - Registrants Only
- Exclusive Access - Registrants Only
那么除了发起释放的主机外,其他所有已注册的主机的 controller 都会接收到 Notification 通知。
⚔️ 3. Preempting(抢占 Reservation 或 Registration)
这是 Reservation 中最具对抗性的重要机制:
✅ 操作步骤:
主机执行 Reservation Acquire 命令,字段设置如下:
| 字段 | 值 | 说明 |
|---|---|---|
| RACQA | 001b |
表示 Preempt 操作 |
| CRKEY | 当前注册的 Reservation Key | |
| PRKEY | 被抢占的 Key 值 | 必须与目标 registrant 使用的 Key 一致 |
⚠️ 前提要求:
- 发起抢占的主机必须是 registrant(已注册)
- CRKEY 与主机自己的 Key 不匹配 →
Reservation Conflict - PRKEY 是欲抢占对象使用的 Key
抢占逻辑说明(部分节选):
- 如果 Reservation 类型为:
- Write Exclusive – All Registrants
-
Exclusive Access – All Registrants
→ 抢占逻辑特殊(下一页说明) -
如果不是以上两种类型,则判断:
- 若 PRKEY 匹配现有 Reservation Holder → 抢占并获得 Reservation,原持有者会被剥夺(即 Preempt) → 发通知给其余 registrants
- 若 PRKEY 不匹配 → ❌ 无效果,不触发抢占
📌 小结对照表
| 动作 | 命令类型 | 关键字段 | 成功条件 | 失败状态码 |
|---|---|---|---|---|
| 获取 Reservation | Reservation Acquire | RACQA = 000b, CRKEY |
未被持有,Key 匹配 | Reservation Conflict |
| 释放 Reservation | Reservation Release | RRELA = 000b, CRKEY, RTYPE |
Key 和类型匹配 | Reservation Conflict / Invalid Field |
| 抢占 Reservation | Reservation Acquire | RACQA = 001b, CRKEY, PRKEY |
PRKEY 匹配目标 | Reservation Conflict |
如果你想继续,我们下一步可以继续详细解析:
🔁 抢占 All Registrants 类型 Reservation 的行为流程(即 RACQA =
001b情况下的特殊子逻辑)
或者我也可以为整个 Reservation 状态行为绘制一张状态图表,加深理解。你觉得怎么样?