2019独角兽企业重金招聘Python工程师标准>>>
Persistent Reservations(PRs)概述
- PRs包含“PERSISTENT RESERVE IN”和“PERSISTENT RESERVE OUT”两个命令;
- PRs操作的最基本单位是I_T连接,即一个启动器和目标器连接;
- PRs配置不会因为启动器失效、硬件复位、逻辑单元复位或者I_T连接丢失而重置(跟配置相关,详见5.14.5小结);
- 一个获取的PRs只会因“释放”、“抢占”或者“清除”命令而释放,即便是目标器设备电源被断开,PRs依旧会被保留(跟配置相关,5.14.5小结)。
(来源:SPC-5第136页)
“Persistent Reservation”范围(命令参数中的“SCOPE”域)
PRs必须针对整个LUN,使用“PERSISTENT RESERVE OUT”命令进行设置时需要设置为“LU_SCOPE”。
(来源:SPC-5第330页)
“Persistent Reservation”类型(命令参数中的“TYPE”域)
可用的“Persistent Reservation”类型:
- 独占写入(Write Exclusive) 只有PRs持有者才能进行写入相关操作,且只有一个PRs持有者;
- 独占存取(Exclusive Access) 只有PRs持有者才能进行存取相关操作,且只有一个PRs持有者;
- 独占写入-仅注册者(Write Exclusive-Registrants Only) 所有注册者均可进行写入操作,且只有一个PRs持有者;
- 独占存取-仅注册者(Exclusive Access-Registrants Only) 所有注册者均可进行存取操作,且只有一个PRs持有者;
- 独占写入-所有注册者(Write Exclusive-All Registrants) 所有注册者均可进行写入操作,同时所有的已注册I_T连接均是持有者;
- 独占存取-所有注册这(Exclusive Access-All Registrants) 所有注册者均可进行存取操作,同时所有的已注册I_T连接均是持有者。
(来源:SPC-5第330页)
SPC-4命令在不同类型的“Persistent Reservation”中的“允许”与“冲突”对照表:
(来源:SPC-5第138页)
(来源:SPC-5第139页)
“PERSISTENT RESERVE OUT”命令的“SERVICE ACTION”在不同类型的“Persistent Reservation”中的“允许”与“冲突”对照表:
(来源:SPC-5第141页)
“Reservation Key”
应用客户端需要在建立PRs之前为每个I_T连接注册一个“Reservation Key”,“Reservation Key”提供一种协议无关的识别I_T连接的方法,可以使用“Reservation Key”通过“PERSISTENT RESERVE IN”命令来查询关联的I_T状态。“Reservation Key”也可用于在“PERSISTENT RESERVE OUT”命令中注册和验证I_T连接。
一个“Reservation Key”可以对应多个I_T连接,一个I_T连接也可以注册多个“Reservation Key”(但是SG工具包中只支持一个),所以可以使用一个“Reservation Key”同时操作一组I_T连接!
“Persistent Reservation Holder”
“Persistent Reservation Holder”就是获取“Persistent Reservation”权限的持有者,成为持有者的情况如下:
-
对于“Write Exclusive – All Registrants” 或者 “Exclusive Access – All Registrants”类型的PRs来说,所有的已注册I_T连接均为“Persistent Reservation”持有者。
-
使用“RESERVE”、“PREEMPT”、 “PREEMPT AND ABORT”、“REPLACE LOST RESERVATION”、或者“REGISTER AND MOVE”这些“PERSISTENT RESERVE OUT”命令的“Server Action”的I_T连接就是“Persistent Reservation”持有者。
-
使用“REGISTER AND MOVE”的“Server Action”的目标I_T连接就是“Persistent Reservation”持有者。
“PERSISTENT RESERVE OUT”命令
基本格式
(来源:SPC-5第337页)
“SERVICE ACTION”域
“PERSISTENT RESERVE OUT”命令支持的服务动作:
- REGISTER - 注册活者反注册一个“Reservation Key”;
- RESERVE - 根据指定的“SCOPE”和“Type”创建一个“Persistent Reservation”;
- RELEASE - 释放选定的“Persistent Reservation”;
- CLEAR - 清除所有的“Reservation Key”和“Persistent Reservation”;
- PREEMPT - 抢占一个“Persistent Reservation”或移除注册;
- PREEMPT AND ABORT - 抢占一个“Persistent Reservation”或移除注册,同时忽略所有之前的抢占;
- REGISTER AND IGNORE EXISTING KEY - 注册活者反注册一个“Reservation Key”,同时忽略已经注册的“Reservation Key”;
- REGISTER AND MOVE - 为另外一个I_T连接注册一个“Reservation Key”,并移动一个已经存在的“Persistent Reservation”到这个I_T连接;
- REPLACE LOST RESERVATION - 恢复丢失的“Persistent Reservation”。
(来源:SPC-5第339页)
“PERSISTENT RESERVE OUT”命令服务动作的有效参数:
(来源:SPC-5第340页)
(来源:SPC-5第341页)
“PARAMETER LIST LENGTH”域
“PARAMETER LIST LENGTH”用于指定该命令所包含的参数列表长度。
-
当参数列表中的“SPEC_I_PT”位为0,且“Service Action”不是“REGISTER AND MOVE”时,这个值必须为24,否则会返回“PARAMETER LIST LENGTH ERROR”错误。
-
当这个值大于“Device Server”可以处理的参数列表的最大长度时,也会返回“PARAMETER LIST LENGTH ERROR”错误。
基本的“PARAMETER LIST”域
参数列表格式:
(来源:SPC-5第342页)
“RESERVATION KEY”参数
- 是一个8字节长的值,用于标示发送“PERSISTENT RESERVE OUT”命令的I_T连接。
- 如果“Service Action”是“REGISTER AND IGNORE EXISTING KEY”,则会忽略这个值。
- 如果“Service Action”是“REGISTER”或者“REPLACE LOST RESERVATION”,此处应该填0。
- 除此之外,“Device Server”会对把这个值与已经注册“RESERVATION KEY”的I_T连接进行比较,如果不一致,则会返回“RESERVATION CONFLICT”。
“SERVICE ACTION RESERVATION KEY”参数
如下“Service Action”需要提供“SERVICE ACTION RESERVATION KEY”:
a) REGISTER; b) REGISTER AND IGNORE EXISTING KEY; c) PREEMPT; d) PREEMPT AND ABORT; e) REPLACE LOST RESERVATION。
如下“Service Action”需要忽略“SERVICE ACTION RESERVATION KEY”:
a) RESERVE; b) RELEASE; c) CLEAR。
- 当“Service Action”是“REGISTER”或者“REGISTER AND IGNORE EXISTING KEY”时,“SERVICE ACTION RESERVATION KEY”用于指定新的“RESERVATION KEY”,或者是0用于取消“RESERVATION KEY”的注册;
- 当“Service Action”是“PREEMPT”或者“PREEMPT AND ABORT”时,“SERVICE ACTION RESERVATION KEY”指明将要被抢占的“RESERVATION KEY”;
- 当“Service Action”是“REPLACE LOST RESERVATION”时,“SERVICE ACTION RESERVATION KEY”包含一个新的要被注册的“RESERVATION KEY”。
“SPEC_I_PT”参数
“SPEC_I_PT”参数用于确定是否指定启动器端口(Specify Initiator Ports)。
- 当“SPEC_I_PT”被设置为0时,“Device Server”只处理已经注册的I_T连接发送的“PERSISTENT RESERVE OUT”命令;
- 当“SPEC_I_PT”被设置为1,且“Service Action”不是“REGISTER”时,“Device Server”将会返回“INVALID FIELD IN PARAMETER LIST”错误;
- 当“SPEC_I_PT”被设置为1,且“Service Action”是“REGISTER”时,“Additional Parameter Data”域必须包含“Transport IDs”列表,其格式如下:
(来源:SPC-5第344页)
其中“TRANSPORTID PARAMETER DATA LENGTH”指定下面的“TransportIDs”列表的字节数,如果“PARAMETER LIST LENGTH”未包含“TRANSPORTID PARAMETER DATA LENGTH”的长度,或者“TRANSPORTID PARAMETER DATA LENGTH”比实际的“TransportIDs”列表字节数不一致,“Device Server”会返回“PARAMETER LIST LENGTH ERROR”错误。
“TransportID”参数
每个“TransportID”参数长度至少24字节,且必须是4的倍数,格式如下:
(来源:SPC-5第619页)
- TPID FORMAT - “TransportID”的格式类型,可用的格式如下:
(来源:SPC-5第619页)
- PROTOCOL IDENTIFIER - 协议标识符,可用的标识符如下:
(来源:SPC-5第597页)
- SCSI Transport Protocol Specific Data - 传输协议特定数据,每种协议的描述方法都不一样,具体的请参考SPC-5的7.6.4中的内容,这里只粗略说明一下iSCSI的格式,其格式如下:
(来源:SPC-5第621页)
可见iSCSI中的“TransportID”有两种格式,在使用sg_persist命令时,通过“−−transport−id=file=transport_ids.txt”参数指定的“TransportID”参数描述文件中,只需加入类似“iqn.5886.com.acme.diskarrays-sn-a8675309”这样的参数指明启动器接口即可。
“ALL_TG_PT”参数
“ALL_TG_PT”参数只针对“REGISTER”和“ REGISTER AND IGNORE EXISTING KEY”这两个“Service Action”,其他的“Service Action”应该忽略该参数,用于指明是否注册所有目标端口(All Target Ports)。
- 如果“ALL_TG_PT”参数为0,则只注册发送“PERSISTENT RESERVE OUT”命令的I_T连接;
- 如果“ALL_TG_PT”参数为1,则注册全部的“Device Server”已知的目标端口(SG工具包没有实现该功能)。
“APTPL”参数
“APTPL”(Activate Persist Through Power Loss)参数用于指定注册时是否激活掉电前已获取的“Persist”。
- 只对“REGISTER”和“REGISTER AND IGNORE EXISTING KEY”有效,其他的“Service Action”应该忽略此参数;
- 同时如果“Device Server”不支持“APTPL”被置位1,则会返回“INVALID FIELD IN PARAMETER LIST”错误;
- 如果“APTPL”被置位0,“Device Server”将会释放掉电之前的“Persistent Reversvation”以及已注册的“Reservation Key”;
- 如果“APTPL”被置位1,“Device Server”将会保留掉电之前的“Persistent Reversvation”以及已注册的“Reservation Key”。
针对“REGISTER AND MOVE”的“PARAMETER LIST”域
当“Service Action”是“REGISTER AND MOVE”时的“PARAMETER LIST”域格式如下:
(来源:SPC-5第345页)
此处不再详述,具体的请参看SPC-5第6.17.4小节。
“PERSISTENT RESERVE IN”命令
基本格式
“PERSISTENT RESERVE IN”命令的格式定义如下:
(来源:SPC-5第326页)
“SERVICE ACTION”域
“PERSISTENT RESERVE IN”命令支持的“SERVICE ACTION”如下:
- READ KEYS - 获取所有已注册的“Reservation Keys”;
- READ RESERVATION - 获取当前存在的“Persistent Reservation”;
- REPORT CAPABILITIES - 获取功能描述信息;
- READ FULL STATUS - 获取完整的状态信息,包括“Reservation Keys”和“Persistent Reservation”。
(来源:SPC-5第326页)
“ALLOCATION LENGTH”域
指定客户端接收数据缓冲区(用于保存返回的参数列表)的最大大小(以字节为单位),详见SPC-5的第4.2.5.6小节。
READ KEYS
读取设备上已经注册的“Reservation Key”,如果有多个I_T连接注册了相同的Key,则会重复出现多次。返回的参数列表个输入下:
(来源:SPC-5第327页)
“PRGENERATION”参数
“PRGENERATION”是一个32位的会重绕的计数器,每次处理“PERSISTENT RESERVE OUT”命令后可能被更新(具体的说明请参考SPC-5的6.17.2小节),该数值不会被“PERSISTENT RESERVE IN”命令或者失败和被拒绝的“PERSISTENT RESERVE OUT”命令更新。无论是否设置“APTPL”位,每次上电后,“PRGENERATION”都会被重置为0。
“ADDITIONAL LENGTH”参数
指明“Reservation Key List”的字节数。
“Reservation Key List”参数
每个“Reservation Key”占用8字节。
READ RESERVATION
获取持有的“Reservation Key”状态,当没有持有者时的返回格式如下:
(来源:SPC-5第328页)
当含有持有者时的返回格式如下:
(来源:SPC-5第329页)
REPORT CAPABILITIES
查询当前设备的“Persistent Reservations”功能和特性信息,返回个数如下:
(来源:SPC-5第332页)
-
RLR_C(Replace Lost Reservation Capable) - 置一则表明可以使用“REPLACE LOST RESERVATION”这个“Server Action”。
-
CRH(Compatible Reservation Handling) - 置一则表明按照5.14.3小节所描述的方式处理,否则按照SPC-2标准处理。
-
SIP_C(Specify Initiator Ports Capable) - 置一则表明支持指定启动器端口功能(PRs OUT时可以设置SPEC_I_PT标志)。
-
ATP_C(All Target Ports Capable) - 置一则表明支持指定目标器端口功能(PRs OUT时可以设置ALL_TG_PT标志)。
-
PTPL_C(Persist Through Power Loss Capable) - 置一则表明支持掉电保持功能(PRs OUT时可以设置APTPL标志)。
-
TMV(Type Mask Valid) - 置一则表明“PERSISTENT RESERVATION TYPE MASK”参数有效,否则忽略掉即可。
-
ALLOW COMMANDS - 指明某一类“Persistent Reservation”是否支持某一个命令,详细描述见下表:
(来源:SPC-5第333页)
(来源:SPC-5第334页)
-
PTPL_A(Persist Through Power Loss Active) - 置一则表明掉电保持功能被激活,否则是未激活。
-
PERSISTENT RESERVATION TYPE MASK - 包含一个位图,指明“Device Server”支持哪些类型的“Persistent Reservations”,详见下表:
(来源:SPC-5第334页)
a) WR_EX_AR - 置一表明支持“Write Exclusive – All Registrants”类型; b) EX_AC_RO - 置一表明支持“Exclusive Access – Registrants Only”类型; c) WR_EX_RO - 置一表明支持“Write Exclusive – Registrants Only”类型; d) EX_AC - 置一表明支持“Exclusive Access”类型; e) WR_EX - 置一表明支持“Write Exclusive”类型; f) EX_AC_AR - 置一表明支持“ Exclusive Access – All Registrants”类型。
READ FULL STATUS
读取完整的设备状态信息,其返回数据格式如下:
(来源:SPC-5第335页)
“PRGENERATION”参数
与“PERSISTENT RESERVE IN”命令的“READ KEYS” “Server Action”描述相同,请参考6.16.2小结。
“ADDITIONAL LENGTH”参数
说明“Full Status Descriptors”部分所包含的字节数。
“Full Status Descriptors”参数
“Full Status Descriptors”的格式如下:
(来源:SPC-5第336页)
- RESERVATION KEY - 已注册的“Reservation Key”。
- R_HOLDER(Reservation Holde) - 置一说明此“Reservation Key”是“Persistent Reservation”持有者。
- ALL_TG_PT(All Target Ports) - 置零说明此“Reservation Key”只对应一个“Target Port”,否则对应所有“Target Port”。
后面的参数根据上述参数的取值不同而不同,详见6.16.5小结。