错误处理与诊断 - 第427页
NVME2.0协议解读 1 min read

错误处理与诊断 - 第427页

Blog Author

我们继续深入讲解 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 状态行为绘制一张状态图表,加深理解。你觉得怎么样?