In verteilten Versionskontrollsystemen (wie Mercurial und Git ) müssen gerichtete azyklische Graphen (DAGs) effizient verglichen werden. Ich bin ein Mercurial-Entwickler, und wir wären sehr daran interessiert, etwas über theoretische Arbeiten zu erfahren, in denen die Zeit- und Netzwerkkomplexität des Vergleichs zweier DAGs erörtert wird.
Die fraglichen DAGs werden durch die aufgezeichneten Revisionen gebildet. Revisionen werden durch einen Hashwert eindeutig identifiziert. Jede Revision hängt von null (anfängliches Commit), einem (normales Commit) oder mehreren (Merge Commit) der vorherigen Revisionen ab. Hier ist ein Beispiel , wo Revisionen a
zu e
gemacht wurden einer nach dem sie:
a --- b --- c --- d --- e
Der Diagrammvergleich wird angezeigt, wenn jemand nur einen Teil des Verlaufs hat und den fehlenden Teil abrufen möchte. Stellen Sie sich vor ich hatte a
zu c
und machte x
und auf y
Basis von c
:
a --- b --- c --- x --- y
In Mercurial würde ich tun hg pull
und herunterladen d
und e
:
a --- b --- c --- x --- y
\
d --- e
Das Ziel besteht darin, zu identifizieren d
und e
effizient zu sein, wenn der Graph viele (beispielsweise mehr als 100.000) Knoten hat. Effizienz betrifft beides
- Netzwerkkomplexität: Die Anzahl der übertragenen Bytes und die Anzahl der erforderlichen Netzwerk-Roundtrips
- Zeitkomplexität: Der Rechenaufwand der beiden Server, die Änderungssätze austauschen
Typische Diagramme sind schmal mit wenigen parallelen Spuren wie oben. Es wird normalerweise auch nur eine Handvoll Blattknoten (wir nennen sie in Mercurial Köpfe) wie e
und y
darüber geben. Wenn ein zentraler Server verwendet wird, verfügt der Client häufig über einige Änderungssätze, die sich nicht auf dem Server befinden, während der Server über 100 neue Änderungssätze für die Clients verfügen kann, je nachdem, wer den Client vor langer Zeit zuletzt vom Server abgerufen hat . Eine asymmetrische Lösung wird bevorzugt: Ein zentraler Server sollte im Vergleich zu seinen Clients nur wenig rechnen.
quelle
Antworten:
In diesem Zusammenhang haben die Diagrammknoten eine eindeutige Kennung (einen Hash oder eine Prüfsumme), oder? Sie müssen also keine Subgraph-Isomorphismustests durchführen. Sie benötigen lediglich eine Liste der Knoten, die sich zwischen Ihren beiden Versionen unterscheiden, und die Kanten sind für diesen Schritt überhaupt nicht nützlich. Mein SIGCOMM 2011-Artikel " Was ist der Unterschied? Effiziente Set-Abstimmung ohne vorherigen Kontext"(mit Goodrich, Uyeda und Varghese) betrachtet genau dieses Problem: Es stellt sich heraus, dass Sie die Identität der Knoten, die von einem, aber nicht von beiden Kommunikationsservern gehalten werden, mithilfe einer nur proportionalen Kommunikationsmenge bestimmen können auf die Anzahl der geänderten Knoten und mit nur einem einzigen Roundtrip. Sobald Sie diese Informationen haben, ist es einfach, die Änderungen in einem zweiten Roundtrip selbst mit optimaler Kommunikation abzurufen.
quelle
Bei der für Mercurial implementierten Lösung war ein weiteres Problem die Asymmetrie: Die Auslastung des Servers sollte sowohl für die ausgehende Bandbreite als auch für die CPU-Zeit auf Kosten der Auslastung des Clients minimiert werden.
quelle
Klingt für mich nach einem zweistufigen Prozess.
Die Aufgabe von 1. Ich denke, wird hauptsächlich auf der Client-Seite verarbeitet, und alle Clients benötigen den Commit-Hash über das Netz.
quelle
x
undy
und musse
undd
vom Server ziehen? Das anfängliche Problem dort ist, dass ich (als Kunde) den "Verzweigungspunkt" nicht kennec
.