remotely-save/docs/sync_algorithm/v3/design.md
2024-03-17 23:58:54 +08:00

3.7 KiB

Sync Algorithm V3

Drafted on 20240117.

An absolutely better sync algorithm. Better for tracking deletions and better for subbranching.

Huge Thanks

Basically a combination of algorithm v2 + synclone + rsinc + (some of rclone bisync). All of the later three are released under MIT License so no worries about the licenses.

Features

Must have

  1. true deletion detection
  2. deletion protection (blocking) with a setting
  3. transaction from the old algorithm
  4. user warning show up, new algorithm needs all clients to be updated! (deliberately corrput the metadata file??)
  5. filters
  6. conflict warning
  7. partial sync

Nice to have

  1. true time and hash
  2. conflict rename

Description

We have five input sources:

  1. local all files
  2. remote all files
  3. local previous succeeded sync history
  4. local deletions
  5. remote deletions.

Init run, consuming remote deletions :

Change history data into local previous succeeded sync history.

Later runs, use the first, second, third sources only.

Bidirectional table is modified based on synclone and rsinc. Incremental push / pull only tables is further modified based on the bidirectional table. The number inside the table cell is the decision branch in the code.

Bidirectional:

local\remote remote unchanged remote modified remote deleted remote created
local unchanged (02/21) do nothing (09) pull (07) delete local (??) conflict
local modified (10) push (16/17/18/19/20) conflict (08) push (??) conflict
local deleted (04) delete remote (05) pull (01) clean history (03) pull
local created (??) conflict (??) conflict (06) push (11/12/13/14/15) conflict

Incremental push only:

local\remote remote unchanged remote modified remote deleted remote created
local unchanged (02/21) do nothing (26) conflict push (32) conflict push (??) conflict
local modified (10) push (25) conflict push (08) push (??) conflict
local deleted (29) conflict do nothing (30) conflict do nothing (01) clean history (28) conflict do nothing
local created (??) conflict (??) conflict (06) push (23) conflict push

Incremental pull only:

local\remote remote unchanged remote modified remote deleted remote created
local unchanged (02/21) do nothing (09) pull (33) conflict do nothing (??) conflict
local modified (27) conflict pull (24) conflict pull (34) conflict do nothing (??) conflict
local deleted (35) conflict pull (05) pull (01) clean history (03) pull
local created (??) conflict (??) conflict (31) conflict do nothing (22) conflict pull