SnapshotService 查詢備份倉庫下所有快照 querySnapshotByRepo分析

一曲微茫發表於2024-11-21

好的,根據您提供的 snapshot.docx 文件內容,我提取了 querySnapshotByRepo 方法,並對其進行詳細分析。以下是提取的方法及其相關部分:

提取的 querySnapshotByRepo 方法

@Override
public QuerySnapshotByRepoResponse querySnapshotByRepo(QuerySnapshotByRepoRequest request) {
    QuerySnapshotByRepoResponse repoResponse = new QuerySnapshotByRepoResponse();
    if (request == null || StringUtils.isBlank(request.getRepositoryName())) {
        throw new TitanException("引數不可為空");
    }
    try {
        repoResponse.setSnapshotNameList(querySnapshotByRepo(request.getRepositoryName()));
    } catch (IOException e) {
        log.error("查詢快照列表異常, [repository:{}]", request.getRepositoryName(), e);
        throw new TitanException("查詢快照列表異常");
    }
    return repoResponse;
}

方法分析

輸入引數

  • QuerySnapshotByRepoRequest request:包含請求引數,主要包括 repositoryName(倉庫名稱)。

輸出引數

  • QuerySnapshotByRepoResponse repoResponse:包含查詢結果的響應物件,主要欄位有 snapshotNameList(快照名稱列表)。

方法步驟

  1. 建立響應物件

    QuerySnapshotByRepoResponse repoResponse = new QuerySnapshotByRepoResponse();
    
  2. 引數校驗

    if (request == null || StringUtils.isBlank(request.getRepositoryName())) {
        throw new TitanException("引數不可為空");
    }
    
    • 檢查請求物件 request 是否為空。
    • 檢查 repositoryName 是否為空字串,如果為空則丟擲異常。
  3. 查詢快照列表

    try {
        repoResponse.setSnapshotNameList(querySnapshotByRepo(request.getRepositoryName()));
    } catch (IOException e) {
        log.error("查詢快照列表異常, [repository:{}]", request.getRepositoryName(), e);
        throw new TitanException("查詢快照列表異常");
    }
    
    • 呼叫 querySnapshotByRepo 方法查詢指定倉庫的快照列表。
    • 將查詢到的快照名稱列表設定到響應物件的 snapshotNameList 中。
    • 如果查詢過程中發生 IOException,記錄錯誤日誌並丟擲異常。
  4. 返回響應物件

    return repoResponse;
    

詳細分析

1. 引數校驗

  • 請求物件校驗:確保 request 不為空。
  • 倉庫名稱校驗:確保 repositoryName 不為空字串。

2. 查詢快照列表

  • 呼叫查詢方法:呼叫 querySnapshotByRepo 方法查詢指定倉庫的快照列表。
  • 設定響應物件:將查詢到的快照名稱列表設定到響應物件的 snapshotNameList 中。
  • 異常處理:如果查詢過程中發生 IOException,記錄錯誤日誌並丟擲異常。

3. 返回響應物件

  • 返回結果:返回包含查詢結果的響應物件。

querySnapshotByRepo 輔助方法

為了更完整地理解 querySnapshotByRepo 方法的工作原理,我們還需要檢視其輔助方法 querySnapshotByRepo

private List<String> querySnapshotByRepo(String repositoryName) throws IOException {
    GetSnapshotsRequest request = new GetSnapshotsRequest();
    request.repository(repositoryName);
    GetSnapshotsResponse response = restHighLevelClient.snapshot().get(request, RequestOptions.DEFAULT);
    List<String> list = Lists.newArrayList();
    response.getSnapshots().stream()
            .filter(snapshotInfo -> SnapshotState.SUCCESS.equals(snapshotInfo.state()))
            .forEach(snapshotInfo -> {
                list.add(snapshotInfo.snapshotId().getName());
            });
    return list;
}

輔助方法分析

輸入引數

  • String repositoryName:倉庫名稱。

輸出引數

  • List<String> list:快照名稱列表。

方法步驟

  1. 建立請求物件

    GetSnapshotsRequest request = new GetSnapshotsRequest();
    request.repository(repositoryName);
    
  2. 傳送請求並獲取響應

    GetSnapshotsResponse response = restHighLevelClient.snapshot().get(request, RequestOptions.DEFAULT);
    
  3. 過濾並收集快照名稱

    List<String> list = Lists.newArrayList();
    response.getSnapshots().stream()
            .filter(snapshotInfo -> SnapshotState.SUCCESS.equals(snapshotInfo.state()))
            .forEach(snapshotInfo -> {
                list.add(snapshotInfo.snapshotId().getName());
            });
    
  4. 返回快照名稱列表

    return list;
    

總結

querySnapshotByRepo 方法的主要功能是根據倉庫名稱查詢該倉庫中的所有快照名稱,並將結果封裝在響應物件中返回。具體步驟包括:

  1. 引數校驗:確保請求物件和倉庫名稱不為空。
  2. 查詢快照列表:呼叫 querySnapshotByRepo 方法查詢指定倉庫的快照列表,並將結果設定到響應物件中。
  3. 異常處理:如果查詢過程中發生 IOException,記錄錯誤日誌並丟擲異常。
  4. 返回響應物件:返回包含查詢結果的響應物件。

透過 querySnapshotByRepo 輔助方法,我們可以更詳細地瞭解如何從 Elasticsearch 中獲取快照資訊並進行過濾。
當然可以,讓我們詳細分析一下 querySnapshotByRepo 輔助方法。這個方法負責從指定的倉庫中查詢所有的快照,並返回這些快照的名稱列表。以下是詳細的分析:

querySnapshotByRepo 輔助方法

private List<String> querySnapshotByRepo(String repositoryName) throws IOException {
    GetSnapshotsRequest request = new GetSnapshotsRequest();
    request.repository(repositoryName);
    GetSnapshotsResponse response = restHighLevelClient.snapshot().get(request, RequestOptions.DEFAULT);
    List<String> list = Lists.newArrayList();
    response.getSnapshots().stream()
            .filter(snapshotInfo -> SnapshotState.SUCCESS.equals(snapshotInfo.state()))
            .forEach(snapshotInfo -> {
                list.add(snapshotInfo.snapshotId().getName());
            });
    return list;
}

方法分析

輸入引數

  • String repositoryName:倉庫名稱。

輸出引數

  • List<String> list:快照名稱列表。

方法步驟

  1. 建立請求物件

    GetSnapshotsRequest request = new GetSnapshotsRequest();
    request.repository(repositoryName);
    
    • 建立一個 GetSnapshotsRequest 物件。
    • 設定請求物件的倉庫名稱為 repositoryName
  2. 傳送請求並獲取響應

    GetSnapshotsResponse response = restHighLevelClient.snapshot().get(request, RequestOptions.DEFAULT);
    
    • 使用 restHighLevelClient 傳送請求,獲取快照資訊。
    • restHighLevelClient 是 Elasticsearch 的高階客戶端,用於與 Elasticsearch 進行互動。
    • RequestOptions.DEFAULT 是預設的請求選項。
  3. 初始化快照名稱列表

    List<String> list = Lists.newArrayList();
    
    • 建立一個新的 List<String> 物件 list,用於儲存快照名稱。
  4. 過濾並收集快照名稱

    response.getSnapshots().stream()
            .filter(snapshotInfo -> SnapshotState.SUCCESS.equals(snapshotInfo.state()))
            .forEach(snapshotInfo -> {
                list.add(snapshotInfo.snapshotId().getName());
            });
    
    • 獲取 GetSnapshotsResponse 物件中的快照列表 response.getSnapshots()
    • 使用 Java Stream API 對快照列表進行過濾,只保留狀態為 SUCCESS 的快照。
    • 對過濾後的快照資訊進行遍歷,將每個快照的名稱新增到 list 中。
      • snapshotInfo.snapshotId().getName() 獲取快照的名稱。
  5. 返回快照名稱列表

    return list;
    
    • 返回包含所有成功快照名稱的列表 list

詳細分析

1. 建立請求物件

  • 目的:構建一個請求物件,用於向 Elasticsearch 傳送查詢快照的請求。
  • 實現
    • 建立 GetSnapshotsRequest 物件。
    • 設定請求物件的倉庫名稱為 repositoryName

2. 傳送請求並獲取響應

  • 目的:向 Elasticsearch 傳送請求,獲取指定倉庫中的快照資訊。
  • 實現
    • 使用 restHighLevelClient 傳送請求。
    • 獲取 GetSnapshotsResponse 物件,該物件包含了查詢結果。

3. 初始化快照名稱列表

  • 目的:準備一個空的列表,用於儲存過濾後的快照名稱。
  • 實現
    • 使用 Lists.newArrayList() 建立一個新的 List<String> 物件 list

4. 過濾並收集快照名稱

  • 目的:從查詢結果中篩選出狀態為 SUCCESS 的快照,並提取其名稱。
  • 實現
    • 使用 Java Stream API 對 response.getSnapshots() 進行流式處理。
    • 使用 filter 方法過濾出狀態為 SUCCESS 的快照。
    • 使用 forEach 方法遍歷過濾後的快照資訊,將每個快照的名稱新增到 list 中。

5. 返回快照名稱列表

  • 目的:將包含所有成功快照名稱的列表返回給呼叫者。
  • 實現
    • 返回 list

總結

querySnapshotByRepo 方法的主要功能是從指定的倉庫中查詢所有快照,並返回狀態為 SUCCESS 的快照名稱列表。具體步驟包括:

  1. 建立請求物件:構建一個 GetSnapshotsRequest 物件並設定倉庫名稱。
  2. 傳送請求並獲取響應:使用 restHighLevelClient 傳送請求,獲取 GetSnapshotsResponse 物件。
  3. 初始化快照名稱列表:建立一個空的列表,用於儲存快照名稱。
  4. 過濾並收集快照名稱:使用 Java Stream API 過濾出狀態為 SUCCESS 的快照,並提取其名稱。
  5. 返回快照名稱列表:返回包含所有成功快照名稱的列表。

透過這個方法,我們可以有效地從 Elasticsearch 中獲取指定倉庫中的快照資訊,並進行必要的過濾和處理。

相關文章