All pastes #639171 Raw Edit

Stuff

public text v1 · immutable
#639171 ·published 2007-07-30 11:58 UTC
rendered paste body
== Jupiter (obby >= 0.3.0) ==

Statt der Revisionsnummer wird nun eine sogenannte "vector time" eingefuehrt,
die aus zwei Komponenten besteht: Der "local count" (die die Anzahl an lokalen
Aenderungen angibt) und der "remote count" (die die Anzahl an Aenderungen
angibt, die uebers Netzwerk eingetroffen sind). Jeder Client hat eine solche
"vector time", und der Server hat eine fuer jeden Client.

Begeht eine Client eine Operation, so sendet er diese mit seiner aktuellen
vector time an den Server und erhoeht den "local count". Der Server hat diesmal
fuer jeden Client eine Liste aus allen Operationen, von denen er noch nicht
weiss, ob der Client sie bereits erhalten hat (acklist). Kommt also eine
Opertion von einem Client an, so loescht der Server zuerst alle Operationen
aus dieser Liste, deren vector time eine kleinere remote count hat als die
local count der eingehenden Operation (die der Client somit also schon hat).
Die eingehende Operation wird dann gegen die verbleibenden transformiert (da
der Client von denen noch nichts wusste). Ausserdem wird der remote count fuer
diesen Client erhoeht (Es wurde eine Operation uebers Netzwerk empfangen).
Die daraus resultierende Operation wird dann auf das Dokument angewendet und an
alle anderen Clients geschickt und in deren acklist gepackt (jedoch nicht mehr
an den Client, von dem die Operation kam). Dabei wird auch der local count zu
dem entsprechenden Client erhoeht.

Empfaengt ein Client eine Operation vom Server, so geht er im Prinzip genauso
vor: Auch er hat eine acklist, in der die Operationen stehen, von denen er
nicht sagen kann, ob der Server sie bereits kennt (und in die er jede Operation
packt, die er an den Server schickt). Er loescht nun ebenfalls alle Operationen
in dieser Liste, deren remote count unter dem local count der eingehenden
Operation ist, transformiert die eingehende Operation gegen die Operationen in
der Liste und erhoeht den eigenen remote count. Die Operation wird dann auf das
Dokument angewandt.