Skip to content

drivers(turso): remote 模式补 canonical backfill 通道(@libsql/client,分批、可恢复、完成标记)—— cloud#1005 移交,维护者已裁方案 1 #5770

Closed

Description

@claude

Part of objectstack-ai/cloud#1005(随 #4645 驱动迁移移交本仓;完整分析与维护者 2026-08-03 决策记录在该单正文与评论,链接为准)。

现状(cloud#1005 实测)

  • SqlDriver.backfillCanonicalDatetimes 是 Knex 路径,remote 模式永不执行 → canonicalDatetimeFields / canonicalTimeFields 在 remote 恒空 → needsLegacyDatetimeRepair 恒 true,每次对 Field.datetime / Field.time 的 filter 都编译成修复表达式 —— 正确但不可索引,且 local 跑完 backfill 能退回 col >= ?,remote 没有出口,代价永久(后果 A)。
  • RemoteTransport 的 DDL 把时间列声明为 TEXT;数字 epoch 经 TEXT affinity 落成 '1753660800000.0' 一类文本,共享修复表达式 typeof(col) in ('integer','real') 一支永不命中、strftime 又解析不了 → 这一群 legacy 行在 remote 任何 filter 都匹配不到,而 local 的 INTEGER 孪生群体可修(后果 B)。

裁定(维护者 2026-08-03,原文见 cloud#1005 评论)

  1. 方案 1 派发:走 @libsql/client 的 remote backfill —— 大表分批、失败可恢复、成功后标记 canonical;解除后果 A,并一并处理后果 B 的可解部分。
  2. 方案 2(DDL 亲和性对齐)以 staging 数字 epoch 存量探针结果再议;探针需 staging 访问,归维护者/运维,不阻塞方案 1。

关联

ADR-0053 storage-form 轴(#4191);cloud#1003(D-B3:正确性不以 backfill 跑过为前提,该姿态保持不变 —— backfill 是性能出口,不是正确性前提)。


Generated by Claude Code

Activity

  1. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 6, 2026
  2. self-assigned this
    on Aug 6, 2026
  3. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    Contributor

    认领:PM 循环第 9 轮(drivers 车道,#5769 落地后的同文件串行棒)
    会话:session_01WyvqvKMG6asi9aXjKE6xtx
    分支:claude/issue-5770-turso-remote-backfill
    Worktree:objectstack-issue-5770
    域:domain:drivers(cloud#1005 跨仓移交,分诊 domain 标欠账,认领申报;turso 不在 #5499 冻结范围)
    文件面:packages/drivers/driver-turso(remote-transport.ts / turso-driver.ts / 新 backfill 模块 + 测试;libsql-sqlite-stub.testkit.ts 可复用)+ changeset
    前置已清:#5921(条件层拒收闸)已 MERGED,本单基于含闸的新 main;⛔ 不触闸逻辑。裁决依据:维护者 2026-08-03 已裁方案 1(cloud#1005 评论),方案 2(DDL 亲和性)等 staging 探针另议、⛔ 不在本单。


    Generated by Claude Code

  4. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    Contributor

    复核:ACCEPT → PR #6006(PM 实测复核):

    • 变更面 6 文件(新模块 + 接线 + 两测试 + changeset);⛔ 双核验:fix(driver-turso): RemoteTransport 拒收条件层的 $-算子键 —— 不再编译成静默空集/全表写 (#5769) #5921 拒收闸/buildWhereSQL 零触碰、driver-sql 公共表达式零触碰(方案 3 否决执行到位);
    • 方案 1 三要素全落地且形态优于预期:分批(rowid IN 子查询,不依赖 libSQL 非保证编译选项)、可恢复(WHERE 守卫即断点,零状态表——因此无新公开契约,无需回报裁决,判断正确)、完成标记(写 local 同一消费点,两 transport 共用一条规则);
    • 后果 B 实测精化:不动点行是「进错窗口、假阴假阳并存」而非「匹配不到」——已修正进套件文件头;可解部分用 cast as real 回喂驱动自身表达式,epoch 转换规则保持唯一;界外残留计数不猜(秒/毫秒陷阱有实测与专门用例);
    • 自纠留档可贵:完成门从单计数改双计数——全 legacy 表被误标完成→永久搁浅的陷阱被自己的用例抓住并钉死;
    • D-B3 姿态直接断言(标记与否答案一致,失败只 report 不 throw 不阻 boot);
    • 反向验证:摘接线 6 红、正交用例保持绿,恢复 711/711;fixture 两条 legacy sweep 的处置(显式清标记 + 断言修复仍生效)与 driver-sql 同款,不是削弱;
    • changeset 自带。

    CI 清零后转 ready 入队;MERGED 后放 #5903(同文件串行棒解锁,其派发词并入 N1+N4 两行入表职责)。


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

pm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions