Skip to content

fix(seafobj): route V2 automatic-local objects through RepoStorageId - #43

Merged
opendev9 merged 10 commits into
devfrom
fix/v2-uuid-bootstrap-20261024
Oct 24, 2026
Merged

opendev9 merged 10 commits into
devfrom
fix/v2-uuid-bootstrap-20261024

Conversation

@opendev9

Copy link
Copy Markdown

背景

Docker #42 已合并进 dev,目标是「新装 V2 默认、正常重启不跑全库登记」。真实 CE14 新装验收发现两个阻断,均与 #42 的启动路径直接相关:

  1. 新装 V2 容器不健康:生成后的 seafile.conf 含 [cloudfile_v2] auto_local_root 与三个 name = filesystem 后端;C/Go 认这个值,但 Hub 的 Python seafobj 只认 fs/s3/ceph/oss/swift,导入即 InvalidConfigError: unknown blocks backend "filesystem",seahub 起不来。
  2. 即使只把 filesystem 映射成 fs,seafobj 仍会按原生 seafile-data/storage 读取所有库,V2 路由库的 commit/fs/blocks 全部读不到(Hub 侧预览/打包/索引/GC 会静默读错位置)。

修改

  • patches/seafobj/automatic-local-storage.patch:
    • SeafileConfig.init_backend_conf() 识别 [cloudfile_v2] auto_local_root,复用已审核的 multiple-backend 机制:一个 synthetic is_auto 模板 + 一个 native 默认;
    • routed 库按 RepoStorageId 读 <root>/<key>/storage/<kind>(含旧自定义 key),旧 CE 库走原生 seafile-data;
    • seafobj/db.py 优先使用环境变量里的完整 MySQL 连接串(容器只写 connection_charset,避免 partial [database] 解析崩溃)。
  • 不新增表、DDL、第二路由;仍由 RepoStorageId 唯一决定物理位置。

验证

  • 镜像由本 Head(1f6d2e1)+ Server 8cfc9e0 + Hub 2b7ad4c 构建;隔离 CE14 + MariaDB 联合验收 66/66 通过,其中:
    • 新装 V2 健康、seafile.conf 正确、fresh 不跑全库 inventory(reports=0);
    • 新建库 RepoStorageId=auto-local:<uuid>、物理目录为 UUID、上传/下载/列表/删除一致;
    • Hub seafobj 直接读路由库对象字节一致(A16);旧 CE 库走原生 store(B10a);V2 路由库走 UUID store(B10b);
    • 历史自定义 key 原址读写不迁移;失路由 fail-closed;原生布局库仍可读写;
    • 显式 CE→V2 切换跑一次 preflight,之后正常重启不再扫描(B6/B11)。
  • 构建记录:local_storage 与 objstore 测试均 passed。

已知的非本 PR 问题

新装 seahub 还缺 CloudFile fork 的 4 个列(share 库管理员授权 3 列、favorites obj_id、tags is_system):打包的 sql/mysql.sql 早于 fork migrations,而启动兼容 shim 已按设计退役,所以 fresh install 的分享/收藏/标签端点会 500。验收时用 fixture 列绕开并单独记录,需在 Hub/打包侧另修,不属于本 PR 范围。

关联:原 #42 已合并;本 PR 修验收门禁发现的新装启动阻断。

servicememeai and others added 10 commits October 24, 2026 20:24
The generated V2 config (auto_local_root plus filesystem backends) was rejected
by seafobj's backend reader, so seahub could not start on a fresh V2 install.
Map that config onto the reviewed multiple-backend machinery with one synthetic
auto template and a native default: routed libraries read from their own key
directory and original CE libraries keep the native tree. Prefer the complete
MySQL facts from the environment before parsing a partial [database] section.
The quick source check runs git diff --check; blank context lines in the patch
file must not carry the space marker. The applied source tree is unchanged.
@opendev9
opendev9 merged commit 7f7e7c3 into dev Oct 24, 2026
1 check passed
@opendev9

Copy link
Copy Markdown
Author

已合并进 dev。当前 dev 三仓 head 构建镜像(cloudfile/cloudfile:14.0.0-cf.devverify20261024,Server 93d312a / Hub 7b42169 / Docker 7f7e7c3)在隔离 CE14 + MariaDB 11.4 上完整验收 66/66 通过,其中与本 PR 直接相关:

  • 修复前复现:新装 V2 容器 unhealthy(InvalidConfigError: unknown blocks backend "filesystem");V2 下共享子目录 HTTP 500(Failed to add commit)。
  • 修复后:fresh V2 健康、后重启不跑 inventory;普通建库 UUID 路由/物理目录/上传下载一致;Hub seafobj 读路由库字节一致;子目录共享成功且 commit 落原生树;历史自定义 key 原址;失路由 fail-closed;fsck/cold GC 通过;CE→V2 显式切换只跑一次有界 preflight。
  • 镜像构建 receipt 中 local_storage C 测试与 objstore Go 测试均 passed。

详见原 PR 的验收评论与 cloudfile-storage-merge-gate-20261024.md。

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.

2 participants