Logoot CRDT: чередование данных при одновременном редактировании в одном и том же месте?

Я хочу внедрить Logoot для конвергентного редактирования текста P2P, и я запустил в небольшую проблему.

Мое понимание Logoot заключается в том, что интервалы между объектами (стрками текста в исходной статье, но могут быть символы или слова) могут быть разделены бесконечно из-за неограниченного идентификатора. Это означает, что положение объекта определяется не его соседями, как в WOOT (что потребовало бы надгробий), а фиксированной числовой точкой по длине строки. В сочетании с уникальным идентификатором сайта это также дает нам общий порядок и обеспечивает конвергенцию в конечном итоге.

Однако... не вызывает ли это проблемы, когда одновременные изменения вносятся в одно и то же место? Если два разъединенных клиента начинают писать новые предложения в одной и той же позиции курсора, а затем объединяются, их предложения имеют хорошие шансы чередоваться.

Ниже приведен пример доски того, о чем я говорю:

«Доска»

Как видите, и сайт B, и сайт C делят интервал между «I» и «завоеванным» в соответствии с правилами Logoot, давая нам случайные точки между позициями (20,A) и (25,A). Но ничто не упорядочивает эти точки относительно друг друга, заставляя их смешиваться при слиянии. Между тем алгоритмы на основе соседей могут учитывать эту проблему, поскольку цепочка причинно-следственных связей каждого объекта сохраняется.

Вышеприведенный пример — детский пример, но в более общем случае представьте, что два пользователя хотят вставить другое предложение между двумя существующими предложениями. Если один из пользователей оказался в офлайне, он не должен вернуться к искаженному беспорядку! Ясно, что для сохранения намерения одно предложение должно следовать за другим.

Я что-то упустил при чтении статьи, или это неотъемлемый недостаток Logoot?

(Кроме того, почему существует записанное значение часов, которое, по-видимому, не используется в алгоритме? В документе даже указывается, что идентификатор каждого объекта обязательно уникален без часов.)


person Archagon    schedule 16.08.2017    source источник


Ответы (1)


Вы правы, это настоящая аномалия в Logoot и LSEQ. Является ли это нарушением намерения или нет, зависит от вашего определения намерения. Расширение определения, требующее, чтобы непрерывные последовательности оставались непрерывными, если они не разделены случайной последующей операцией, имело бы интуитивный смысл.

Часы не нужны. Скорее всего, авторы использовали пару (сайт, часы) или метку времени Лампорта в качестве своих UUID вне соглашения. Один сайт никогда не сможет создать две одинаковые позиции, поэтому никогда не нужно будет сравнивать часы. (Предположим, что сообщения с сайта поступают по порядку, что требуется и для других аспектов Logoot/LSEQ.)

person t-mullen    schedule 01.10.2018
comment
Оптимизация разделения могла бы решить, по крайней мере, некоторые из этих аномалий. Разделение блока происходит только в причинно-следственных операциях (невозможно разделить блок, которого у вас нет). Таким образом, блоки должны оставаться смежными. Я еще не тестировал это. - person t-mullen; 01.10.2018
comment
Добавление этой ссылки: dl.acm.org/doi/10.1145/3301419.3323972 - person Jean Monet; 15.06.2021