-
Notifications
You must be signed in to change notification settings - Fork 2
/
peerList.py
135 lines (104 loc) · 3.96 KB
/
peerList.py
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# -----------------------------------------------------------------------------
# Distributed Systems (TDDD25)
# -----------------------------------------------------------------------------
# Author: Sergiu Rafiliu (sergiu.rafiliu@liu.se)
# Modified: 31 July 2013
#
# Copyright 2012 Linkoping University
# -----------------------------------------------------------------------------
"""Package for handling a list of objects of the same type as a given one."""
import threading
from Common import orb
class PeerList(object):
"""Class that builds a list of objects of the same type as this one."""
def __init__(self, owner):
self.owner = owner
self.lock = threading.Condition()
self.peers = {}
# Public methods
def initialize(self):
"""Populates the list of existing peers and registers the current
peer at each of the discovered peers.
It only adds the peers with lower ids than this one or else
deadlocks may occur. This method must be called after the owner
object has been registered with the name service.
"""
#print("PEERLIST" +str(self.peers))
#id,type = orb.Peer.check(self.owner)
#print("ID:" +str(id))
#print("TYPE:" +str(type))
self. display_peers()
self.lock.acquire()
try:
peers_temp = (self.owner.name_service.require_all(self.owner.type))
#
# Your code here.
#
temp = self.peers
for pid, addr in peers_temp:
if pid < self.owner.id:
self.peers[pid] = orb.Stub(addr)
self.peers[pid].register_peer(self.owner.id,self.owner.address)
finally:
self.lock.release()
def destroy(self):
"""Unregister this peer from all others in the list."""
self.lock.acquire()
try:
for pid in self.peers:
self.peers[pid].unregister_peer(self.owner.id)
#
# Your code here.
#
finally:
self.lock.release()
def register_peer(self, pid, paddr):
"""Register a new peer joining the network."""
print("PID " +str(pid))
print("ADDRESS " +str(paddr))
# Synchronize access to the peer list as several peers might call
# this method in parallel.
self.lock.acquire()
try:
self.peers[pid] = orb.Stub(paddr)
print("Peer {} has joined the system." .format(pid))
finally:
self.lock.release()
def unregister_peer(self, pid):
"""Unregister a peer leaving the network."""
# Synchronize access to the peer list as several peers might call
# this method in parallel.
self.lock.acquire()
try:
if pid in self.peers:
del self.peers[pid]
print("Peer {} has left the system.".format(pid))
else:
raise Exception("No peer with id: '{}'".format(pid))
finally:
self.lock.release()
def display_peers(self):
"""Display all the peers in the list."""
self.lock.acquire()
try:
pids = sorted(self.peers.keys())
print("List of peers of type '{}':".format(self.owner.type))
for pid in pids:
addr = self.peers[pid].address
print(" id: {:>2}, address: {}".format(pid, addr))
finally:
self.lock.release()
def peer(self, pid):
"""Return the object with the given id."""
self.lock.acquire()
try:
return self.peers[pid]
finally:
self.lock.release()
def get_peers(self):
"""Return all registered objects."""
self.lock.acquire()
try:
return self.peers
finally:
self.lock.release()