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

在CIFS / SMB协议中,我看到有三种types的文件句柄:持久的,弹性的和持久的。 他们有什么区别?

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

我主要参考如下:

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

尽pipe这本来是为了Samba3,但它有更多的细节:

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

持久的文件句柄允许连接到SMB服务器以保持短暂的networking中断 – 当打开过程终止时,持久句柄不一定被清除。 当客户端尝试重新连接时,如果oplock(/ lease)仍然存在,则重新连接到该文件。

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

弹性文件句柄即使在oplock / lease被破坏的情况下也被保留,但坦率地说,我不能遵循所有这些工作的技术细节。 下面的一个参考文献指出,Durable和Resilient之间的区别在于如何创build句柄 – 通过创build上下文调用来持久化,并通过IOCTL来恢复。 (我不能遵循的主要原因是locking顺序和重放是如何适应的,但是看起来这并不是持久性和弹性之间的关键区别)。

对于Persistent句柄,我不能拿出比这个Samba文档更好的东西:

持久的文件句柄就像具有强大保证的持久文件句柄一样。 他们被请求与持久性标志设置为true的持久性V2创build请求blob。 服务器仅授予标记为CA(持续可用)的共享上的持久句柄。

据我所知,这些在Samba中尚未实现,但目标是支持集群和持续可用性, 因此正在开展工作。

有关持久句柄的更多信息持续句柄可在同一群集的多个服务器上使用。 当一台服务器由于某种原因停机时,客户端机器可以通过连接到另一台服务器的方式半透明地继续使用该句柄。 这就是为什么执行持久性句柄(与持久性和弹性句柄相反)不在纯粹的SMB范围内。 例如,我们的NQ Storage期望永久句柄的完整语义在自定义的VFS中实现,而SMB引擎负责相应的语法。