SnapshotService 查詢快照下所有索引 queryIndicesByRepoAndSnapshotWithIndices分析

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

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

提取的 queryIndicesByRepoAndSnapshotWithIndices 方法

@Override
public QueryIndicesByRepoAndSnapshotWithIndicesResponse queryIndicesByRepoAndSnapshotWithIndices(QueryIndicesByRepoAndSnapshotWithIndicesRequest request) {
    QueryIndicesByRepoAndSnapshotWithIndicesResponse response = new QueryIndicesByRepoAndSnapshotWithIndicesResponse();
    if (request == null || StringUtils.isBlank(request.getRepositoryName()) || StringUtils.isBlank(request.getSnapshotName()) || request.getIndicesNameList() == null || request.getIndicesNameList().isEmpty()) {
        throw new TitanException("傳入引數不可為空");
    }
    try {
        List<SnapshotInfo> snapshotInfoList = queryIndicesByRepoAndSnapshot(request.getRepositoryName(), request.getSnapshotName());
        List<String> indices = new ArrayList<>();
        List<String> indicesList = new ArrayList<>();
        request.getIndicesNameList().forEach(indicesName -> {
            indicesList.add(indicesName.replace("*", ""));
        });
        List<String> snapIndexList = snapshotInfoList.get(0).indices();
        for (String indicesName : snapIndexList) {
            for (String nIndicesName : indicesList) {
                if (indicesName.contains(nIndicesName)) {
                    indices.add(indicesName);
                    break;
                }
            }
        }
        response.setIndicesList(indices);
        log.info("查詢索引快照成功{}", indices);
    } catch (IOException e) {
        log.error("查詢索引快照異常 [repository:{}] [snapshot:{}]", request.getRepositoryName(), request.getSnapshotName(), e);
        throw new TitanException("查詢索引快照異常!");
    }
    return response;
}

方法分析

輸入引數

  • QueryIndicesByRepoAndSnapshotWithIndicesRequest request:包含請求引數,主要包括 repositoryName(倉庫名稱)、snapshotName(快照名稱)和 indicesNameList(索引名稱列表)。

輸出引數

  • QueryIndicesByRepoAndSnapshotWithIndicesResponse response:包含查詢結果的響應物件,主要欄位有 indicesList(匹配的索引列表)。

方法步驟

  1. 建立響應物件

    QueryIndicesByRepoAndSnapshotWithIndicesResponse response = new QueryIndicesByRepoAndSnapshotWithIndicesResponse();
    
  2. 引數校驗

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

    try {
        List<SnapshotInfo> snapshotInfoList = queryIndicesByRepoAndSnapshot(request.getRepositoryName(), request.getSnapshotName());
        List<String> indices = new ArrayList<>();
        List<String> indicesList = new ArrayList<>();
        request.getIndicesNameList().forEach(indicesName -> {
            indicesList.add(indicesName.replace("*", ""));
        });
        List<String> snapIndexList = snapshotInfoList.get(0).indices();
        for (String indicesName : snapIndexList) {
            for (String nIndicesName : indicesList) {
                if (indicesName.contains(nIndicesName)) {
                    indices.add(indicesName);
                    break;
                }
            }
        }
        response.setIndicesList(indices);
        log.info("查詢索引快照成功{}", indices);
    } catch (IOException e) {
        log.error("查詢索引快照異常 [repository:{}] [snapshot:{}]", request.getRepositoryName(), request.getSnapshotName(), e);
        throw new TitanException("查詢索引快照異常!");
    }
    
    • 呼叫 queryIndicesByRepoAndSnapshot 方法查詢指定倉庫和快照的索引資訊。
    • 建立兩個新的 List<String> 物件 indicesindicesList,分別用於儲存匹配的索引名稱和處理後的索引名稱列表。
    • 遍歷 request.getIndicesNameList(),將每個索引名稱中的萬用字元 * 替換為空字串,並新增到 indicesList 中。
    • 獲取快照資訊中的索引列表 snapIndexList
    • 遍歷 snapIndexList,檢查每個索引名稱是否包含 indicesList 中的任何一個名稱,如果包含則將其新增到 indices 列表中。
    • indices 列表設定到響應物件 response 中。
    • 記錄查詢成功的日誌。
  4. 異常處理

    • 如果查詢過程中發生 IOException,記錄錯誤日誌並丟擲異常。
  5. 返回響應物件

    return response;
    

詳細分析

1. 引數校驗

  • 請求物件校驗:確保 request 不為空。
  • 倉庫名稱和快照名稱校驗:確保 repositoryNamesnapshotName 不為空字串。
  • 索引名稱列表校驗:確保 indicesNameList 不為空且不為空列表。

2. 查詢索引快照資訊

  • 呼叫查詢方法:呼叫 queryIndicesByRepoAndSnapshot 方法查詢指定倉庫和快照的索引資訊。
  • 處理索引名稱列表:遍歷 request.getIndicesNameList(),將每個索引名稱中的萬用字元 * 替換為空字串,並新增到 indicesList 中。
  • 匹配索引名稱:遍歷快照資訊中的索引列表 snapIndexList,檢查每個索引名稱是否包含 indicesList 中的任何一個名稱,如果包含則將其新增到 indices 列表中。
  • 設定響應物件:將 indices 列表設定到響應物件 response 中。
  • 記錄日誌:記錄查詢成功的日誌。

3. 異常處理

  • 捕獲 IOException:如果查詢過程中發生 IOException,記錄錯誤日誌並丟擲異常。

4. 返回響應物件

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

總結

queryIndicesByRepoAndSnapshotWithIndices 方法的主要功能是根據倉庫名稱、快照名稱和索引名稱列表查詢匹配的索引資訊,並將結果封裝在響應物件中返回。具體步驟包括:

  1. 引數校驗:確保請求物件和關鍵引數不為空。
  2. 查詢索引快照資訊:呼叫查詢方法獲取索引資訊,並處理索引名稱列表,匹配索引名稱。
  3. 設定響應物件:將匹配的索引名稱列表設定到響應物件中,並記錄成功日誌。
  4. 異常處理:捕獲查詢過程中可能發生的 IOException,記錄錯誤日誌並丟擲異常。
  5. 返回響應物件:返回包含查詢結果的響應物件。

相關文章