Skip to content

fix(storage): tolerate headbucket 403 on s3-compatible providers#255

Open
dongmucat wants to merge 1 commit intomainfrom
fix/s3-headbucket-compat
Open

fix(storage): tolerate headbucket 403 on s3-compatible providers#255
dongmucat wants to merge 1 commit intomainfrom
fix/s3-headbucket-compat

Conversation

@dongmucat
Copy link
Copy Markdown
Collaborator

概述

修复 #237:当 storage.provider=s3 且使用阿里云 OSS、腾讯云 COS 等 S3 兼容存储时,HeadBucket 返回 403 不再导致 SkillHub 在启动期硬失败。

变更内容

后端实现

  • 调整 S3StorageService.ensureBucketExists(),将 HeadBucket403 视为兼容性探测失败并记录 warning,继续启动。
  • 保留 404/NoSuchBucket 的缺桶语义,在 auto-create-bucket=true 时继续自动创建 bucket。
  • 保持其他 S3Exception 继续抛出,避免吞掉真实故障。
  • 增加包级注入构造器,便于在单测中注入 mock 的 S3Client / S3Presigner

前端实现

  • 本次无前端变更。

测试覆盖

  • 后端单测:新增 server/skillhub-storage/src/test/java/com/iflytek/skillhub/storage/S3StorageServiceTest.java,覆盖 HeadBucket200/403/404/500auto-create-bucket 分支。
  • 后端回归:保留并联跑 LocalFileStorageServiceTest,确认存储模块现有逻辑不回归。
  • 前端单测 / E2E:本次无前端改动,不适用。

质量门禁

  • make test-backend-app 通过
  • cd server && JDK_JAVA_OPTIONS="-XX:+EnableDynamicAgentLoading" ./mvnw -pl skillhub-storage test -Dtest=S3StorageServiceTest,LocalFileStorageServiceTest 通过
  • 本次无前端变更,make typecheck-web / make lint-web / make test-frontend / Playwright E2E 不适用
  • 本次无 Controller 变更,make generate-api 不适用

安全考虑

本次变更不涉及安全敏感内容。未新增鉴权逻辑、敏感数据处理或外部输入面;仅调整对象存储启动期探测策略。

相关 Issue

Closes #237

测试说明

本地验证步骤

  1. 配置 SKILLHUB_STORAGE_PROVIDER=s3 和一组 OSS/COS/S3 兼容存储参数。
  2. 启动服务,观察 S3StorageService 初始化阶段:当 HeadBucket 返回 403 时,服务应记录 warning 并继续启动。
  3. 继续执行真实对象读写路径,确认错误会在运行时对象操作阶段暴露,而不是在启动期被 HeadBucket 阻断。
  4. 若配置 SKILLHUB_STORAGE_S3_AUTO_CREATE_BUCKET=true 且 bucket 不存在,验证 404/NoSuchBucket 时仍会创建 bucket。

回归测试范围

  • skillhub-storage 模块的 S3 兼容存储初始化流程
  • auto-create-bucket 的缺桶处理逻辑
  • OSS/COS/MinIO/AWS S3 在启动期 bucket 探测上的差异化行为

截图/录屏(如有 UI 变更)

无 UI 变更。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] when storage.provider is s3, The ensureBucketExists method always failing.

1 participant