CRDT вставка сортировки конфликтов задержки и дробного положения - PullRequest
0 голосов
/ 25 марта 2020

Согласно этой статье решения для сохранения сортировки позиции в списке символов идентификатор позиции должен содержать идентификатор сайта для каждого ди git, чтобы вставка выполнялась в соответствии с размером сайта. Я бы. Синхронизация достигается потому, что каждая операция коммутативна и идемпотентна. Ниже показан пример и некоторые фрагменты кода.

[(1, 0)]                      0.1
[(1, 0), (4, 0)]              0.14
[(1, 0), (6, 0), (3, 1)]      0.163
[(1, 0), (7, 0)]              0.17
[(1, 1)]                      0.1
[(1, 1), (1, 1)]              0.11

Хорошо, теперь, начиная с этого примера, возможна следующая ситуация.

[(1, 0)]
[(1, 0), (4, 0)]
[(1, 0), (5, 0)]
[(1, 0), (5, 0), (2, 0)]    
[(1, 0), (6, 0), (3, 1)]
[(1, 0), (7, 0)]
[(1, 1)]
[(1, 1), (1, 1)]

Допустим, два пира хотят написать символ между [(1, 0), (5, 0), (2, 0)] и [(1, 0), (6, 0), (3, 1)], тогда каждый из них генерирует один и тот же идентификатор позиции, имеющий последний идентификатор, отличный от идентификатора сайта

peer 0 -> [(1, 0), (5, 0), (2, 0), (6, 0)]
peer 1 -> [(1, 0), (5, 0), (2, 0), (6, 1)]

Включение их в список символов не нарушит позицию сортировка

[(1, 0)]
[(1, 0), (4, 0)]
[(1, 0), (5, 0)]
[(1, 0), (5, 0), (2, 0)] 
[(1, 0), (5, 0), (2, 0), (6, 0)]
[(1, 0), (5, 0), (2, 0), (6, 1)]  
[(1, 0), (6, 0), (3, 1)]
[(1, 0), (7, 0)]
[(1, 1)]
[(1, 1), (1, 1)]

Но что произойдет, если peer 0 захочет вставить новый символ между ними? Разве сортировка позиций не нарушена?

[(1, 0)]
[(1, 0), (4, 0)]
[(1, 0), (5, 0)]
[(1, 0), (5, 0), (2, 0)] 
[(1, 0), (5, 0), (2, 0), (6, 0)]
?
[(1, 0), (5, 0), (2, 0), (6, 1)]  
[(1, 0), (6, 0), (3, 1)]
[(1, 0), (7, 0)]
[(1, 1)]
[(1, 1), (1, 1)]
...