跳转到内容

同步

bae 的同步是 coven 的同步:bae 声明自己的表和 blobs,其余由 coven 处理。本页说明这些机制如何应用到 bae;coven 自己的文档会完整覆盖每个部分。

coven 拥有 SQLite 连接,因此 bae 提交的每次写入都会经过它。当一个更改同步表的 transaction 提交时,coven 会在同一个 transaction 中记录每一行更改及其涉及的列,因此已提交的更改不会丢失,即使应用随后立刻崩溃。没有 diffing,没有 dirty flags:捕获是连接的属性,写入不会被漏掉。更改先在设备上等待,只有在发送时才会加密和签名,因此写入既不需要密钥也不需要网络。

资料库在云端主目录中的全部历史是一条编号的对象序列。每个对象包含一台设备的一批更改、一个管理条目、封装给某个成员的密钥,或一个 snapshot 公告。每台设备按顺序应用它们,从不跳过,因此所有设备对发生了什么、何时发生达成一致。设备只有在应用了之前的全部对象之后,才会添加下一个对象。

一次同步过程会从设备最后应用的对象开始向前读取,直到遇到缺失的对象,逐个检查签名并应用,把本设备排队的更改作为一个新对象发送,然后完成新状态所要求的工作:共享或取消共享访问、生成 snapshot、删除旧历史。对一个没有变化的资料库,一次同步过程只需两个请求,无论其规模多大。

同步过程会在本地更改后、空闲定时器上,以及点击 立即同步 后立即运行。失败会按同一个退避计划重试,任何无法继续的事项都会说明它在等待什么,bae 会在同步状态行中显示这些内容。

两台设备分开时编辑同一个资料库是正常情况,不是例外。当它们的更改相遇时:

  • 对不同行或不同列的编辑都会应用。在笔记本上编辑发行年份,在桌面上编辑其厂牌,会得到两者。
  • 对同一行同一列的编辑按时间戳排序:较晚编辑获胜,并且每台设备上结果确定且相同。
  • 删除胜过并发编辑:对已被删除的行所做的编辑无论何时到达都会失败,因此一个设备删除的发行会保持删除,即使另一个设备在同一间隔内编辑过它。

coven 会把每个被替换的值保留为丢失值;bae 不显示也不丢弃其中任何一个,因此没有冲突 UI。无论到达顺序如何,每台设备都会收敛到同一结果。

加入或恢复的设备不会从头回放历史。设备会生成 snapshot,即资料库在序列中某一点的完整状态;当资料库和每个私密圈子都有了 snapshot,之前的历史就会被删除。新设备载入最新的 snapshot,然后只应用它之后的内容。离开时间超过所保留历史的设备也会这样做,并保留自己未发送的编辑。

bae 的架构只有一个迁移,设备发送的每项更改都会记录其所用的架构版本。设备遇到来自比自己更新的架构的更改时会停在那里,在应用更新之前不应用其后的任何内容;没有内容丢失,也不会错误应用。

比架构版本更大的单位是 兼容时代:编译进每个二进制程序的固定 coven 修订版。两个构建只能在同一时代内同步;coven 传输格式的兼容性破坏会产生新的时代,并让每个应用的主版本增加。1.0 之前,每个构建都是时代 0,格式可以无迁移变化。

提供商存储加密的更改、snapshot、成员资格记录和文件;它可以计数对象、观察大小和时间,以及看到每个对象由哪个账户写入,但无法读取任何内容。设备拉取的每个对象都会在触碰数据库前被验证,包括签名和成员资格:存储只是一个被动且不可信的信箱。见加密和身份和成员资格。