fix(minio): 添加删除 bucket 功能,优化知识库删除逻辑 #534

This commit is contained in:
Wenjie Zhang 2026-03-04 19:29:33 +08:00
parent df80829bb2
commit 24cbb41f4f
3 changed files with 31 additions and 4 deletions

View File

@ -723,12 +723,16 @@ async def delete_document(db_id: str, doc_id: str, current_user: User = Depends(
await knowledge_base.delete_folder(db_id, doc_id)
return {"message": "文件夹删除成功"}
file_name = file_meta_info.get("meta", {}).get("filename")
file_name = file_meta_info.get("meta", {}).get("path", "").split("/")[-1]
# 尝试从MinIO删除文件如果失败例如旧知识库没有MinIO实例则忽略
try:
minio_client = get_minio_client()
await minio_client.adelete_file(MinIOClient.get_ref_bucket_name(db_id), file_name)
# 同时删除 parsed bucket 中的 parsed.md 文件
await minio_client.adelete_file(
minio_client.KB_BUCKETS["parsed"], f"{db_id}/{doc_id}/parsed.md"
)
logger.debug(f"成功从MinIO删除文件: {file_name}")
except Exception as minio_error:
logger.warning(f"从MinIO删除文件失败可能是旧知识库: {minio_error}")

View File

@ -506,9 +506,9 @@ class KnowledgeBase(ABC):
minio_client.adelete_objects_by_prefix(minio_client.KB_BUCKETS["parsed"], prefix),
minio_client.adelete_objects_by_prefix(minio_client.KB_BUCKETS["documents"], prefix),
minio_client.adelete_objects_by_prefix(minio_client.KB_BUCKETS["images"], prefix),
# 删除 ref bucket 中的文件(两种命名格式)
minio_client.adelete_objects_by_prefix(minio_client.get_ref_bucket_name(db_id), prefix),
minio_client.adelete_objects_by_prefix(minio_client.get_ref_bucket_name_full(db_id), prefix),
# 直接删除 ref bucket两种命名格式
minio_client.adelete_bucket(minio_client.get_ref_bucket_name(db_id)),
minio_client.adelete_bucket(minio_client.get_ref_bucket_name_full(db_id)),
)
# 3. 删除数据库记录

View File

@ -283,6 +283,29 @@ class MinIOClient:
await asyncio.to_thread(_delete_objects)
return deleted_count
async def adelete_bucket(self, bucket_name: str) -> bool:
"""
删除 bucket先删除所有对象再删除 bucket
Args:
bucket_name: bucket 名称
Returns:
是否成功
"""
try:
# 先删除所有对象
await self.adelete_objects_by_prefix(bucket_name, "")
# 再删除 bucket
await asyncio.to_thread(self.client.remove_bucket, bucket_name)
logger.info(f"成功删除 bucket: {bucket_name}")
return True
except S3Error as e:
if "NoSuchBucket" in str(e):
logger.warning(f"bucket 不存在: {bucket_name}")
return False
raise StorageError(f"删除 bucket 失败: {e}")
def file_exists(self, bucket_name: str, object_name: str) -> bool:
"""检查文件是否存在"""
try: