Ефективне порівняння DAG по мережі


11

У розподілених системах управління версіями (таких як Mercurial і Git ) є необхідність ефективного порівняння спрямованих ациклічних графіків (DAG). Я розробник Mercurial, і нам було б дуже цікаво почути теоретичну роботу, яка обговорює складність у часі та мережі порівняння двох DAG.

Розглядаються DAG, відповідно до ревізій, записані. Зміни однозначно ідентифікуються за хеш-значенням. Кожна редакція залежить від нуля (початкова комісія), одна (звичайна фіксація) або більше (об'єднання об'єднань) попередніх версій. Нижче наведено приклад , де зміни aдо eбули зроблені один за іншим:

a --- b --- c --- d --- e

Порівняння графіків потрапляє на малюнок, коли хтось має лише частину історії та хоче отримати відсутню частину. Уявіть, що я повинен aбув cзробити xі yгрунтуватися на c:

a --- b --- c --- x --- y

У Mercurial, я б hg pullі завантажити dі e:

a --- b --- c --- x --- y
              \
                d --- e

Мета - визначити dта eефективно, коли на графіку є багато (скажімо, понад 100 000) вузлів. Ефективність стосується обох

  • складність мережі: кількість переданих байтів та кількість необхідних об’їзних мереж
  • часова складність: кількість обчислень, проведених двома серверами, що обмінюються наборами змін

Типові графіки будуть вузькими з кількома паралельними доріжками, як вище. Також зазвичай буде лише декілька листових вузлів (ми називаємо їх головами в Mercurial), як eі yвище. Нарешті, коли використовується центральний сервер, клієнт часто матиме пару наборів змін, яких немає на сервері, тоді як сервер може мати 100+ нових наборів змін для клієнтів, залежно від того, хто давно клієнт востаннє витягнув із сервера . Асиметричне рішення є кращим: централізований сервер повинен зробити невелике обчислення в порівнянні зі своїми клієнтами.


Обговорення трохи продовжилось на Google Plus .
Мартін Гейслер

Відповіді:


13

У цьому контексті вузли графіків мають якийсь унікальний ідентифікатор (хеш або контрольна сума), правда? Таким чином, вам не потрібно робити якісь тести на підграф-ізоморфізм, вам просто потрібен перелік вузлів, які відрізняються між вашими двома версіями, і краї зовсім не корисні для цього кроку. Мій документ SIGCOMM 2011 " Яка різниця? Ефективне узгодження без попереднього контексту"(з Гудріхом, Уєдою та Варгезе) вважає саме цю проблему: виявляється, ви можете визначити тотожності вузлів, які утримуються одним, але не обома двома комунікаційними серверами, використовуючи кількість зв'язку, пропорційна лише до кількості змінених вузлів та використання лише однієї зворотної поїздки. Після того, як ви отримаєте цю інформацію, легко перетягнути самі зміни в другу поїздку, знову ж таки з оптимальним зв’язком.


А, це звучить цікаво! Ви маєте рацію, що пряме порівняння ідентифікаторів набору змін (так, це хеш-значення) спрацює. Ми просто завжди намагаємось використовувати структуру графіків: якщо ми обидва знаємо X, то я також знаю, що ви знаєте всіх предків X. Це здається важливою інформацією, але, можливо, це не так. Зараз я прочитаю ваш документ, дякую за вказівник!
Мартін Гейслер

@David: Точність (я один з авторів алгоритму, який зараз використовує Mercurial). Ми насправді дбаємо про набір "загальних" вузлів, не потрібно знати значення відсутнього вузла.
tonfa

1
Якщо ви знаєте, що відрізняється, то ви також знаєте, що спільного: це все, що ви маєте, копія цього не є частиною різниці. Але, як правило, різниця повинна бути порівняно невеликою, навіть коли загальна частина велика, тому передача лише кількості даних, пропорційних різниці, краща, ніж передача всієї історії DAG або загальної частини.
Девід Еппштейн

@David: через відносини з предками ми фактично обчислюємо головки (вузлики листя) загального регіону. Тож це ще невелика кількість даних, навіть якщо існує величезна спільна історія.
Мартін Гейслер

Я оновив свою відповідь, щоб включити також кількість використаних туди і назад (що виявляється дуже малим).
Девід Еппштейн

3

У рішенні, яке ми впровадили для Mercurial, ще однією проблемою була асиметрія: завантаження сервера повинно бути мінімізоване як для пропускної здатності вихідного каналу, так і для часу процесора, за рахунок завантаження клієнта.


1
Дякую, я трохи оновив питання, щоб відзначити це.
Мартін Гейслер

0

Мені це звучить як двоетапний процес.

  1. запитайте всіх клієнтів, чи є у них коміти, де батьків є c
  2. якщо так, знайдіть усіх дітей c

Завдання 1. Я думаю, що в основному обробляється на стороні клієнта, і всім клієнтові потрібен хеш фіксації через мережу.


Який сценарій ви описуєте? Випадок, коли я зробив xі yпотрібно витягнути eі dз сервера? Основна проблема полягає в тому, що я (як клієнт) не знаю "точки відділення" c.
Мартін Гейслер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.