コンテンツへ移動

同期

bae の同期は coven の同期です。bae はテーブルと blob を宣言し、残りは coven が行います。このページは bae に適用される仕組みです。各部分の詳細は coven 自身のドキュメントにあります。

coven は SQLite 接続を所有するため、bae がコミットするすべての書き込みは coven を通ります。SQLite の session extension が各トランザクションで正確に何が変わったかを記録します。同期テーブルへの変更は changeset となり、ライブラリ鍵で封印され、デバイスの身元鍵で署名されます。差分取りも dirty フラグもありません。捕捉は接続の性質であり、書き込みは取り逃がされません。

各デバイスは、自分の変更セットをクラウドホーム内の自分専用ストリームへ順番に追加します。デバイスは互いのストリームへ書き込まないため、ストレージ上の書き込み競合はありません。各デバイスは、相手ごとのストリームにカーソルを持ちます。同期サイクルはローカルの送信待ちを プッシュし、その後で各相手のストリームをカーソルから先へ pull し、適用前に各変更セットの署名と作成者のメンバーシップを検証します。

サイクルはローカル変更後、バックオフ付きのアイドルタイマー(ポーリング間隔は最大 5 分)、および Sync Now で即時に実行されます。失敗時はバックオフして再試行します。ループは各サイクルの結果を、ステータス、エラーテキスト、適用された行数として UI へ報告します。

離れた場所にある 2 台のデバイスが同じライブラリを編集することは、例外ではなく通常の状況です。変更が出会ったときは次のようになります。

  • 異なる行または異なる列への編集は両方が適用されます。ラップトップでリリースの年を編集し、デスクトップでレーベルを編集した場合、両方が残ります。
  • 同じ行の同じ列への編集は、その行の _updated_at ハイブリッド論理クロックで順序付けられます。後の編集が勝ち、すべてのデバイスで決定的かつ同一です。
  • 削除は同時編集に勝ちます。あるデバイスで削除されたリリースは、同じ間隔に別のデバイスで編集されても削除されたままです。

未解決状態がないため、競合 UI はありません。どの適用順でも、すべてのデバイスは同じ結果へ収束します。

参加または復元するデバイスは、履歴を最初から再生しません。クラウドホームへ定期的に公開される完全な SQLite イメージである snapshot をダウンロードし、その後に各ストリームへ蓄積された変更セットだけを適用します。スナップショットメタデータは、スキーマバージョンと、それが含むストリームごとのカーソルを記録します。

スキーマバージョン

このセクションへのリンク

bae のスキーマは番号付きの段を通じて移行され、段の最上位はデバイスが書くすべての変更セットに刻印されます。自分より新しいスキーマからの変更セットを pull したデバイスは、アプリが更新されるまでそのストリームを保留し、それ以降は何も適用しません。失われるものはなく、誤って適用されるものもありません。データベースファイル自体も、そのスキーマより古いバイナリでは開きません。

スキーマバージョンより粗い単位が 互換性世代 です。各バイナリに組み込まれた固定 coven リビジョンです。2 つのビルドは同じ世代内でだけ同期します。coven のワイヤー形式が壊れる場合は新しい世代となり、すべてのアプリでメジャーバージョンが上がります。1.0 前はすべてのビルドが世代 0 で、形式はマイグレーションなしに変わります。

プロバイダーが見るもの

このセクションへのリンク

不透明ホームでは、プロバイダーは暗号文の変更セット、暗号文の blob、署名済みメンバーシップレコードを保存します。オブジェクト数、サイズ、タイミングは観測できますが、中身は読めません。デバイスが 取得するすべてのオブジェクトは、署名とメンバーシップが検証されてからデータベースに触れます。ストレージは信頼できない受け渡し箱です。暗号化身元とメンバーシップ を参照してください。