DSH 学习 · 日志重放 01

状态是事件的函数,不是页面记住的东西。

拖动重放位置,看状态怎么从日志折叠出来。再换到含未知事件的场景:标了 ignorable 的可以跳过,必需的那条必须让加载停在它之前——悄悄忽略它,后面每条事件都建立在一个没人知道的状态上。

阅读配套课程 打开 Turn 流程实验

这一页把一段日志重放成状态,滑块控制重放到第几条。先押一个注:把滑块拖到末尾,再拖回中间,然后又拖回末尾——最后的状态和第一次到末尾时相比?

当前输入会写进地址栏 #state= 后面:刷新页面不丢,把链接发给别人打开的就是同一份输入。不用账号,不写本机存储。
事件
已应用
已跳过
拒绝位置
消息
独立校验

每条事件的去向

序号 × 去向

一格一条事件,按序号排列。已应用、已跳过、导致拒绝和未达四种去向各有自己的字形和文字,不靠颜色单独区分。竖线是当前重放位置。

折叠到这一条时的状态

纯折叠

这一块完全由左边的重放位置决定。把滑块拖回去再拖回来,状态一定回到同一个值——独立校验(oracle) 会重放两次并逐字段比对。

重建出的消息序列

    确定性和拒绝规则由 独立校验 核对

    重放校验

    独立校验 自己重放两次比对状态,再逐个前缀检查已应用条数与状态计数一致,并核对“被跳过的都标了 ignorable”“拒绝之后没有任何事件被应用”。

      哪些结论可以带走

      能证明什么

        不能证明什么

          完整事件表

          不用脚本也能读

          图里的每一格,这张表都逐行给出,包括去向和原因。没有脚本或图形支持时从这里读。

          当前场景的全部事件
          序号 类型 可跳过 去向 原因

          同一段流在 SQLite 里的样子

          schema 17 · 应用 id DSHP(基线 aa6c361a 值;本地源码树可能已演进)

          上游的 SQLite 会话库把连续的流式增量打包成一条物理行:信封只存首序号和首时间戳,其余时间用增量数组还原;data 不足 4096 字节直接存文本,达到阈值才进 zstd 分支。打包行的 source_event_seqs 列按「差分 + zigzag + base-128 varint」逐字节编码(输入的有序性由生产方保证),表里给的就是真实字节,可解码还原。切一下开关,看同一条流怎么落库。

          逻辑事件
          物理行
          data 总字节
          进入压缩分支
          独立校验
          data 字节
          dt 增量数
          越过压缩阈值
          最小越线成员数
          当前输入下的物理行布局
          覆盖序号 类型标记 成员数 dt 增量数 data 字节 ≥4096 走压缩 ignorable 标记 source_event_seqs 编码