接口 PathCapabilities

PathCapabilities 接口提供了一种方式,可通过 FileSystemFileContext 或其他实现类的实例以编程方式查询给定路径下提供的操作。

public interface PathCapabilities {
  boolean hasPathCapability(Path path, String capability)
      throws IOException;
}

这里有许多目标

  1. 允许调用者探测可选文件系统操作,而无需实际调用它们。
  2. 允许具有自己可选的每个实例特性的文件系统声明它们是否对特定实例处于活动状态。
  3. 允许与对象存储配合使用的文件系统连接器公开这些存储的基本语义差异(例如:文件在关闭之前不可见、文件重命名为 O(data))、目录重命名为非原子操作等。

可用功能

功能定义为字符串,并分为“通用功能”和特定存储的非标准功能。

通用功能都在前缀 fs.capability. 下定义。

请参阅 org.apache.hadoop.fs.CommonPathCapabilities 的 javadoc 以了解这些功能。

单个文件系统可以提供可探测的一组功能。这些功能必须以 fs. + 文件系统方案 + .capability 开头。例如 fs.s3a.capability.select.sql

boolean hasPathCapability(path, capability)

探测在给定路径下提供特定功能的实例。

后置条件

if fs_supports_the_feature(path, capability):
  return True
else:
  return False

返回:如果特定功能可用,则返回 True

除非已知特定实例支持某个功能,否则文件系统实例不得为该功能返回 True。因此,如果调用方探测某个功能,则可以假设特定功能/语义可用。

如果探测返回 False,则可能表示以下情况之一

  1. 功能未知。
  2. 功能已知,并且已知在此实例上不可用。
  3. 功能已知,但此本地类不知道在提供的路径下是否支持该功能。

此谓词旨在低成本。如果它需要除路径/链接解析之外的远程调用,则它应该得出功能可用性未知的结论并返回 False

谓词还必须没有副作用。

路径的有效性 无需检查路径是否存在;该参数存在,以便任何将操作中继到其他文件系统的文件系统(例如 viewfs)都可以解析并将其中继到嵌套文件系统。请将调用视为相对轻量级的。

因此,尽管文件系统声明它在路径下支持某个功能,但出于其他原因,对该操作的实际调用可能会失败。

例如,尽管文件系统可能在路径下支持 append(),但如果在目录上调用,则调用可能会失败。

对于路径 root = new Path("/"):功能调用可能会成功

fs.hasCapabilities(root, "fs.capability.append") == true

但在该特定路径上对该操作的后续调用可能会失败,因为根路径是目录

fs.append(root)

同样,不会检查调用方是否有执行特定操作的权限:仅仅因为该路径上提供了某个功能并不意味着调用方可以执行该操作。

因此,hasCapabilities(path, capability) 探测声明该操作不会因不受支持而被拒绝,而不是声明调用方可以在该路径上执行特定调用。

可用性持续时间

随着远程存储的状态发生变化,路径功能也可能发生变化。这可能是由于文件系统的本地状态发生变化(例如符号链接或装入点发生变化)或其功能发生变化(例如由于操作更改、系统升级等导致某个功能变为可用/不可用)造成的。

必须调用的功能以确定可用性

客户端连接器可能知道某些操作,并认为它们可用,但由于远程存储的状态和权限,在调用时实际上可能会失败——除了尝试产生副作用的操作之外,无法确定该状态。

一个关键示例是符号链接和本地文件系统。文件系统声明它支持此功能,除非明确禁用符号链接——当调用时,它们实际上可能会失败。

实施者说明

实施者不得对任何无法保证支持的功能返回 true。返回 true 表示文件系统的实现/部署在文件系统客户端的了解范围内,提供了查询的所需操作和语义

出于性能原因,实施者不应检查路径是否存在,除非需要解析路径中部分的符号链接以确定是否存在某个功能。FileContextviewfs 需要这样做。

各个文件系统不得单方面定义新的以 fs.capability 为前缀的功能。相反,它们必须执行以下操作之一

  • 定义和稳定新的跨文件系统功能标志(首选),并正式添加一个新的 fs.capability 值。
  • 使用文件系统的方案作为其自身选项的前缀,例如 fs.hdfs.