介面 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 的 javadocs 以取得這些功能。

個別檔案系統可能會提供自己的功能集,可以探查這些功能。這些功能集必須以 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.