fix(session): 会话副本继承源会话时间戳,不再污染目标账号列表顺序 - #105
magicapple123 wants to merge 1 commit into
Conversation
复制会话时 created_at / updated_at 曾一律写成复制时刻,而客户端会话列表 按这两个字段降序排列 —— 批量复制的历史会话会被顶到列表最上方,把用户正在 进行的对话挤下去,看起来像原有对话被覆盖或丢失。 改为继承源行的原始时间戳(last_activity_at 本来就沿用原值,说明原时间可得); 源值为空时才回退到复制时刻,保证排序列始终可比较。 新增回归测试 insert_session_copy_inherits_source_timestamps。 closes changexbc#103
|
@changexbc 也麻烦帮忙看下这个修复 🙏 #103 的根因很小: 三平台 CI 全绿,有需要调整的随时提,谢谢! |
感谢,这个我晚上具体看下吧,这个是 bug 吗,还是如何排序的问题?我们的这个关联会话我测过没问题啊,如果只是一直复制的会话在最前面我觉得不算是问题。 |
|
澄清一下,这个和第 0.1.41 起的关联会话机制是两件事——你测的「反复切号不会越复制越多」确实没问题,这个 PR 不碰那部分。 现象(#103 里报的):把 A 账号的会话复制到 B 账号后,在 B 账号的客户端里,这批副本会全部出现在列表最上方,把 B 账号自己正在进行的对话挤到下面,看起来像「原有会话被覆盖或丢失」。 根因在 match col.as_str() {
"id" => ...new_cid,
"user_id" => ...target_uid,
"created_at" | "updated_at" => vals.push(Integer(now_ms())), // ← 无条件写复制时刻
"deleted_at" => vals.push(Null),
_ => vals.push(v), // ← last_activity_at 等原样继承
}客户端会话列表按 修复: 如果你的设计意图就是「刚复制进来的会话要排最前、方便一眼看到」,那这个 PR 可以直接关掉,你定就行 🙏 如果认同副本应保留源时间语义,这个 PR 就是那 6 行的改动 + 一个回归测试。 |
|
你的意思是复制的绘画会出现在列表会话列表的最前面对吗?我理解的是复制的绘画是即将要继续进行的绘画,没什么问题吧。 |
|
嗯,我理解你的立场——副本是「接下来要继续进行的会话」,放前面方便一眼找到,这个意图完全合理。 我想补一个数据一致性的角度供你判断,问题可能不在于「副本该排前还是排后」: 复制后的行里,两个时间字段会互相矛盾——
客户端按 所以两个方向,你定就好:
两种我都接受 🙏 |
|
我又做了更硬的实证,结论反过来了:这个 PR 应该关掉,我上一轮的推断有误。 我直接在 WorkBuddy 客户端产物( -- cloud 活跃 / 归档列表、local 列表,共 4 处
ORDER BY COALESCE(last_activity_at, created_at) DESC, id ASC配套的还有客户端建在库上的索引(同一意图): CREATE INDEX idx_sessions_cloud_sort ON sessions(user_id, last_activity_at, created_at)
WHERE transport = 'cloud' AND deleted_at = -1关键在 我上一条说的「同一行两个时间字段矛盾」在数据本身层面确实成立,但既然它不进排序、也没有其它读取路径依赖它,就没有用户可见影响——不是 bug。你的判断是对的 🙏 补充一个可能有用的信息:会看到「副本排最前」的地方是本工具自己的会话列表( 先关掉这个 PR,感谢花时间看 ❤️ |
背景与根因
#103:把账号 A 的会话复制到账号 B,目标账号里批量复制的历史会话会被顶到列表最上方,把用户正在进行的对话挤下去,看起来像原有对话被覆盖或丢失。
根因在
insert_session_copy:写入副本时created_at/updated_at无条件赋值为now_ms(),而客户端会话列表按这两个字段降序排列。同一行数据的
last_activity_at是原样继承的(走的是_ => vals.push(v)分支),说明源会话的原始时间信息在复制流程里完全可得,只是没写进排序依赖的列。改动
insert_session_copy中created_at/updated_at改为继承源行的值;源值为空(脏数据)时才回退到复制时刻,保证排序列始终可比较。新增回归测试
insert_session_copy_inherits_source_timestamps,覆盖两条路径:正常继承(1000 / 2000)与空值回退(落在复制时刻区间内)。没做的
冲突提示
本 PR 只改
insert_session_copy内部 6 行 + 新增一个测试(约 5150 行处)。同样触碰session.rs的 #62 / #66 / #68 / #69 改的是备份可见性、清理逻辑等其它位置,与本改动不相邻,预期可自动合并。验证
cargo test -p wb-switch-core:607 passed / 0 failed(含新增测试)cargo fmt --check:本改动行无格式差异(上游本身有 87 处既有 diff,未触碰)closes #103