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;
}
再次測試刪除, 順利搞定...