@startuml fig_35_sync_merge_algorithm
scale 2.5
title Wallenc — алгоритм согласования журналов синхронизации (StorageSyncEngine)

skinparam defaultFontName "DejaVu Sans"
skinparam activity {
  BackgroundColor #F8F8F8
  BorderColor #333333
  DiamondBackgroundColor #E8F4FF
}

start

:Группа Storage (≥ 2 UUID из DbStorageSyncGroup);
:Захват блокировок sync (lease);
:Параллельно: flush + readSyncJournal
для каждого Storage;

partition "Слияние (StorageSyncJournalMerge)" {
  :Для каждого пути — запись
с максимальной ревизией;
  note right
    compare: sequence → actorId → createdAt
  end note
}

while (Есть необработанный путь?) is (да)
  :winnerEntry = победитель по пути;
  :sourceStorage = findSourceStorage(winnerEntry);
  if (operation == UPSERT
и source == null?) then (да)
    :пропуск пути;
  else (нет)
    while (Есть target Storage?) is (да)
      if (ревизия target ≥ winner?) then (да)
        :пропуск target;
      else (нет)
        :applyEntry:
UPSERT — copy stream
DELETE/TRASH — на target
(recordSyncJournal = false);
      endif
    endwhile (нет)
  endif
endwhile (нет)

:Снятие блокировок;
stop

@enduml
