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
的代码, 才发现有这么一句注释:
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;
}
再次测试删除, 顺利搞定...