持久文件句柄、弹性文件句柄和持久文件句柄之间的区别

持久文件句柄、弹性文件句柄和持久文件句柄之间的区别

在 CIFS/SMB 协议中,我看到有 3 种类型的文件句柄:持久型、弹性型和持久型。它们之间有什么区别?

答案1

  • 耐用手柄是 SMB 2.0 的一部分
  • 弹性句柄是 SMB 2.1 的一部分
  • 持久句柄是 SMB 2.2 的一部分,现在称为 SMB3

我的主要参考资料如下:

https://wiki.samba.org/index.php/SMB3_kernel_status

尽管这最初是针对 Samba3 的,但它还有更多详细信息:

https://wiki.samba.org/index.php/Samba3/SMB2

持久文件句柄允许与 SMB 服务器的连接在短暂的网络中断后继续存在 - 当打开进程终止时,持久句柄不一定会被清除。当客户端尝试重新连接时,如果 oplock(/lease)仍然存在,它会重新连接到该文件。

但是如果另一个客户端尝试打开该文件,则 oplock/lease 将被破坏,并且第一个客户端无法重新连接。

即使 oplock/lease 被破坏,弹性文件句柄也会保留,但坦率地说,我无法理解其工作原理的所有技术细节。下面的一个参考资料说,Durable 和 Resilient 之间的区别在于句柄的创建方式 -通过创建上下文调用实现持久性,并通过 IOCTL 实现弹性。 (我不明白的主要原因是锁排序和重放如何适应这一点,但这看起来并不是持久性和弹性之间的关键区别。)

对于持久句柄,我想不出更好的办法比这个 Samba 文档:

持久文件句柄类似于具有强保证的持久文件句柄。它们是使用持久 v2 创建请求 blob 请求的,并将持久标志设置为 true。服务器仅授予标记为 CA(持续可用)的共享上的持久句柄。

据我所知,这些功能尚未在 Samba 中实现,但目标是支持集群和持续可用性,因此正在进行中。

答案2

有关持久句柄的更多信息... 持久句柄可在同一集群的多个服务器上使用。当一台服务器因任何原因停机时,客户端计算机可以通过与另一台服务器的连接半透明地继续使用此句柄。这就是为什么持久句柄(与持久和弹性句柄相反)的实现超出了纯 SMB 范围的原因。例如,我们的 NQ Storage 期望在自定义 VFS 中实现持久句柄的完整语义,而 SMB 引擎负责相应的语法。

答案3

Samba 持久句柄维护文件句柄的状态,即使集群中的一台服务器发生故障,新的主服务器也可以获取当前文件句柄并继续 I/O 而不会出现任何 I/O 错误。

相关内容