-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.py
More file actions
62 lines (52 loc) · 2.1 KB
/
server.py
File metadata and controls
62 lines (52 loc) · 2.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import Pyro4
@Pyro4.expose
class Replica(object):
def __init__(self, name):
self.name = name
self.data = {}
self.vector_clock = 0
self.other_replicas = []
def add_replica(self, replica):
self.other_replicas.append(replica)
def write(self, key, value, clock=None, propagate=True):
if clock is None or clock > self.vector_clock:
self.vector_clock = max(self.vector_clock, clock or 0) + 1
self.data[key] = (value, self.vector_clock)
print(f"Replica '{self.name}': Key '{key}' added.")
if propagate:
for replica in self.other_replicas:
replica.write(key, value, self.vector_clock, False)
else:
print(f"Replica '{self.name}': Write operation for key '{key}' ignored due to stale clock.")
def delete(self, key, clock=None, propagate=True):
if key in self.data and (clock is None or clock > self.vector_clock):
del self.data[key]
self.vector_clock = max(self.vector_clock, clock or 0) + 1
print(f"Replica '{self.name}': Key '{key}' deleted.")
if propagate:
for replica in self.other_replicas:
replica.delete(key, self.vector_clock, False)
else:
print(f"Replica '{self.name}': Delete operation for key '{key}' ignored due to stale clock.")
def read(self, key):
value, clock = self.data.get(key, (None, -1))
if value is None:
print(f"Replica '{self.name}': Key '{key}' not found.")
else:
print(f"Replica '{self.name}': Key '{key}' found.")
return value, clock
def main():
replica1 = Replica('Replica1')
replica2 = Replica('Replica2')
replica1.add_replica(replica2)
replica2.add_replica(replica1)
daemon = Pyro4.Daemon()
ns = Pyro4.locateNS()
uri1 = daemon.register(replica1)
uri2 = daemon.register(replica2)
ns.register("replica1", uri1)
ns.register("replica2", uri2)
print("Replicas are running...")
daemon.requestLoop()
if __name__=="__main__":
main()