This is an implementation of the Erlang's DVV on Python.
It is used in distributed systems, where UTC timestamp is unreliable value for object's version control.
- Creating a new version
from dvvset import DVVSet
dvvset = DVVSet()
dot = dvvset.create(dvvset.new("something"), "user_id_1")
- Incrementing version
context = dvvset.join(dot)
new_dot = dvvset.update(dvvset.new_with_history(context, "something else"), dot, "user_id_2")
dvvset.sync([dot, new_dot])
- Detecting conflicts
Conflict is situation when two branches of the history exist. It could happen when someone updates old version ( casual history ).
merged_history = dvvset.sync([OldVersion, NewVersion])
if len(dvvset.values(merged_history)) > 1:
print("Conflict detected")
else:
print("Ok")
- User 1 uploads file to the server, specifying version vector:
from dvvset import DVVSet
dvvset = DVVSet()
dot = dvvset.create(dvvset.new("something"), "user_id_1")
- Server checks version on a subject of conflict. Then it stores file with version information and provides it to User 2.
merged_history = dvvset.sync([ExistingVersion, UploadedVersion])
if len(dvvset.values(merged_history)) > 1:
return "409 Conflict"
else:
return "200 OK" # Casual history is linear
- User 2 downloads file, edits it and increments its version, before uploading back to server.
context = dvvset.join(dot) # ``dot`` is a downloaded version
new_dot = dvvset.update(dvvset.new_with_history(context, "something else"), dot, "user_id_2")
dvvset.sync([dot, new_dot])