-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathpeer.py
53 lines (42 loc) · 1.73 KB
/
peer.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
import zerorpc
from datetime import datetime
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
class Peer:
def __init__(self, bid: str, ip: str, port: str):
logger.info(f"Creating peer {bid} {ip} {port}")
self.bid = bid
self.ip = ip
self.port = int(port)
self.kid = int(bid, 2)
# FIXME(vin) Heartbeat doesnt seem to work
self.owner_peer_config = None
# A worker can only add a node that's seen
self.last_seen = datetime.utcnow()
def __str__(self):
return f"{self.bid} {self.ip} {self.port}"
def set_owner_peer_config(self, owner_peer_config):
self.owner_peer_config = owner_peer_config
def find_node(self, bid: str):
try:
client = zerorpc.Client(f"tcp://{self.ip}:{self.port}", timeout=10, heartbeat=None)
logger.info(f"Find Node {str(self)} {bid} with owner {self.owner_peer_config}")
peer_context = client.find_node(f"{bid} caller {self.owner_peer_config}")
client.close()
return (peer_context, False) if peer_context != self.owner_peer_config else (None, False)
except zerorpc.exceptions.TimeoutExpired:
return None, True
def ping(self):
try:
client = zerorpc.Client(f"tcp://{self.ip}:{self.port}", timeout=2, heartbeat=None)
logger.info(f"Ping {str(self)}")
retvalue = client.ping()
logger.info(f"Ping {str(self)}=>{retvalue}")
client.close()
self.last_seen = datetime.utcnow()
return True
except zerorpc.exceptions.TimeoutExpired:
return False