Minio 批量刪除文件失效的問題分析 (Java SDK)

JDK: 1.8.0_281
minio: 2022-01-08T03:11:54Z
minio-java-sdk: 8.2.2

最近線上一直告警文件服務存儲超標, 按照設計本不該存在這個問題, 遠遠富于需要的存儲才是, 結果一看線上文件都沒刪除, 最老的文件都積壓到切分文件存儲上線的那天了, 當時估計太自信沒測試好...
很簡單的就分析出是定時刪除的業務出現問題, 但是一看日志也沒有報錯, 所有刪除代碼邏輯執行都是順利的, 除了沒刪除文件...那就看刪除的API了, 原批量刪除代碼如下:

  public boolean removeObjects(String bucketName, List<String> objectNames) {
        List<DeleteObject> deleteObjects = new ArrayList<>(objectNames.size());
        for (String objectName : objectNames) {
            deleteObjects.add(new DeleteObject(objectName));
        }
        Iterable<Result<DeleteError>> results = minioClient.removeObjects(
                RemoveObjectsArgs.builder()
                        .bucket(bucketName)
                        .objects(deleteObjects)
                        .build()
        );
        return true;
    }

再看了一下removeObjects的代碼, 才發現有這么一句注釋:

Removes multiple objects lazily. Its required to iterate the returned Iterable to perform removal.

Minio處理批量刪除的時候, 采用的延遲執行, 需要通過迭代返回的Iterable<Result<DeleteError>>以執行刪除, 于是修改了一下自己的代碼:

 @SneakyThrows
    public boolean removeObjects(String bucketName, List<String> objectNames) {
        List<DeleteObject> deleteObjects = new ArrayList<>(objectNames.size());
        for (String objectName : objectNames) {
            deleteObjects.add(new DeleteObject(objectName));
        }
        Iterable<Result<DeleteError>> results = minioClient.removeObjects(
                RemoveObjectsArgs.builder()
                        .bucket(bucketName)
                        .objects(deleteObjects)
                        .build()
        );
        for (Result<DeleteError> result : results) {
            DeleteError error = result.get();
            log.error(
                    "Error in deleting object " + error.objectName() + "; " + error.message());
        }
        return true;
    }

再次測試刪除, 順利搞定...

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容