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 objectNames) {
        List deleteObjects = new ArrayList<>(objectNames.size());
        for (String objectName : objectNames) {
            deleteObjects.add(new DeleteObject(objectName));
        }
        Iterable> 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>以执行删除, 于是修改了一下自己的代码:

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

再次测试删除, 顺利搞定...

你可能感兴趣的:(Minio 批量删除文件失效的问题分析 (Java SDK))