work on better peer connections
parent
d6eabe9f12
commit
f82e7bfb59
|
@ -143,9 +143,9 @@ class PublicAPI:
|
||||||
|
|
||||||
@app.route('/pex')
|
@app.route('/pex')
|
||||||
def peerExchange():
|
def peerExchange():
|
||||||
response = ','.join(clientAPI._core.listAdders())
|
response = ','.join(clientAPI._core.listAdders(recent=3600))
|
||||||
if len(response) == 0:
|
if len(response) == 0:
|
||||||
response = 'none'
|
response = ''
|
||||||
return Response(response)
|
return Response(response)
|
||||||
|
|
||||||
@app.route('/announce', methods=['post'])
|
@app.route('/announce', methods=['post'])
|
||||||
|
|
|
@ -107,7 +107,7 @@ class OnionrCommunicatorDaemon:
|
||||||
|
|
||||||
netCheckTimer = OnionrCommunicatorTimers(self, self.daemonTools.netCheck, 600)
|
netCheckTimer = OnionrCommunicatorTimers(self, self.daemonTools.netCheck, 600)
|
||||||
if config.get('general.security_level') == 0:
|
if config.get('general.security_level') == 0:
|
||||||
announceTimer = OnionrCommunicatorTimers(self, self.daemonTools.announceNode, 86400, requiresPeer=True, maxThreads=1)
|
announceTimer = OnionrCommunicatorTimers(self, self.daemonTools.announceNode, 3600, requiresPeer=True, maxThreads=1)
|
||||||
announceTimer.count = (announceTimer.frequency - 120)
|
announceTimer.count = (announceTimer.frequency - 120)
|
||||||
else:
|
else:
|
||||||
logger.debug('Will not announce node.')
|
logger.debug('Will not announce node.')
|
||||||
|
|
|
@ -405,7 +405,7 @@ class Core:
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def listAdders(self, randomOrder=True, i2p=True):
|
def listAdders(self, randomOrder=True, i2p=True, recent=0):
|
||||||
'''
|
'''
|
||||||
Return a list of addresses
|
Return a list of addresses
|
||||||
'''
|
'''
|
||||||
|
@ -417,8 +417,17 @@ class Core:
|
||||||
addresses = c.execute('SELECT * FROM adders;')
|
addresses = c.execute('SELECT * FROM adders;')
|
||||||
addressList = []
|
addressList = []
|
||||||
for i in addresses:
|
for i in addresses:
|
||||||
|
if len(i[0].strip()) == 0:
|
||||||
|
continue
|
||||||
addressList.append(i[0])
|
addressList.append(i[0])
|
||||||
conn.close()
|
conn.close()
|
||||||
|
testList = list(addressList) # create new list to iterate
|
||||||
|
for address in testList:
|
||||||
|
try:
|
||||||
|
if recent > 0 and (self._utils.getEpoch() - self.getAddressInfo(address, 'lastConnect')) > recent:
|
||||||
|
raise TypeError # If there is no last-connected date or it was too long ago, don't add peer to list if recent is not 0
|
||||||
|
except TypeError:
|
||||||
|
addressList.remove(address)
|
||||||
return addressList
|
return addressList
|
||||||
|
|
||||||
def listPeers(self, randomOrder=True, getPow=False, trust=0):
|
def listPeers(self, randomOrder=True, getPow=False, trust=0):
|
||||||
|
|
|
@ -28,6 +28,7 @@ class PeerProfiles:
|
||||||
self.friendSigCount = 0
|
self.friendSigCount = 0
|
||||||
self.success = 0
|
self.success = 0
|
||||||
self.failure = 0
|
self.failure = 0
|
||||||
|
self.connectTime = None
|
||||||
|
|
||||||
if not isinstance(coreInst, core.Core):
|
if not isinstance(coreInst, core.Core):
|
||||||
raise TypeError("coreInst must be a type of core.Core")
|
raise TypeError("coreInst must be a type of core.Core")
|
||||||
|
@ -35,6 +36,7 @@ class PeerProfiles:
|
||||||
assert isinstance(self.coreInst, core.Core)
|
assert isinstance(self.coreInst, core.Core)
|
||||||
|
|
||||||
self.loadScore()
|
self.loadScore()
|
||||||
|
self.getConnectTime()
|
||||||
return
|
return
|
||||||
|
|
||||||
def loadScore(self):
|
def loadScore(self):
|
||||||
|
@ -45,6 +47,12 @@ class PeerProfiles:
|
||||||
self.success = 0
|
self.success = 0
|
||||||
self.score = self.success
|
self.score = self.success
|
||||||
|
|
||||||
|
def getConnectTime(self):
|
||||||
|
try:
|
||||||
|
self.connectTime = self.coreInst.getAddressInfo(self.address, 'lastConnect')
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
def saveScore(self):
|
def saveScore(self):
|
||||||
'''Save the node's score to the database'''
|
'''Save the node's score to the database'''
|
||||||
self.coreInst.setAddressInfo(self.address, 'success', self.score)
|
self.coreInst.setAddressInfo(self.address, 'success', self.score)
|
||||||
|
@ -61,14 +69,21 @@ def getScoreSortedPeerList(coreInst):
|
||||||
|
|
||||||
peerList = coreInst.listAdders()
|
peerList = coreInst.listAdders()
|
||||||
peerScores = {}
|
peerScores = {}
|
||||||
|
peerTimes = {}
|
||||||
|
|
||||||
for address in peerList:
|
for address in peerList:
|
||||||
# Load peer's profiles into a list
|
# Load peer's profiles into a list
|
||||||
profile = PeerProfiles(address, coreInst)
|
profile = PeerProfiles(address, coreInst)
|
||||||
peerScores[address] = profile.score
|
peerScores[address] = profile.score
|
||||||
|
if not isinstance(profile.connectTime, type(None)):
|
||||||
|
peerTimes[address] = profile.connectTime
|
||||||
|
else:
|
||||||
|
peerTimes[address] = 9000
|
||||||
|
|
||||||
# Sort peers by their score, greatest to least
|
# Sort peers by their score, greatest to least, and then last connected time
|
||||||
peerList = sorted(peerScores, key=peerScores.get, reverse=True)
|
peerList = sorted(peerScores, key=peerScores.get, reverse=True)
|
||||||
|
peerList = sorted(peerTimes, key=peerTimes.get, reverse=True)
|
||||||
|
print(peerList)
|
||||||
return peerList
|
return peerList
|
||||||
|
|
||||||
def peerCleanup(coreInst):
|
def peerCleanup(coreInst):
|
||||||
|
|
Loading…
Reference in New Issue