Commit a00f6201 authored by Ulysse Beaugnon's avatar Ulysse Beaugnon

A peer now advertise itself more at the begining to be as present in the local...

A peer now advertise itself more at the begining to be as present in the local db of other peers than the average
parent 7c638d8d
...@@ -2,16 +2,8 @@ Bug : ...@@ -2,16 +2,8 @@ Bug :
possible bug in the upnp refresh, when refreshing after a too long time possible bug in the upnp refresh, when refreshing after a too long time
To be done : To be done :
Choose the db size and how peers are deleted
find out who to have an automatic recovery without declare
Test the package Test the package
at the beggining a node tries to find 10 other nodes so ask for 10 bootsrap nodes
This slow the beginning and might overload the server
If their is too many nodes flaged as bad, the node never ask for some bootstrap peer
When a node arrive it is in nobody DB => very slow beginning. It should advertise itself more.
check the ips attributed check the ips attributed
remove decalre remove decalre
how do we make sure that none inject some false packets ? how do we make sure that none inject some false packets ?
......
import logging, sqlite3, socket, subprocess, xmlrpclib, time import logging, sqlite3, socket, subprocess, xmlrpclib, time
import utils import utils
# used = 0 : fresh node
# used = 1 : previously used peer
# used = 2 : curently in use
class PeerManager: class PeerManager:
...@@ -11,7 +15,7 @@ class PeerManager: ...@@ -11,7 +15,7 @@ class PeerManager:
self.address = address self.address = address
self._internal_ip = internal_ip self._internal_ip = internal_ip
self._prefix = prefix self._prefix = prefix
self._db_size = db_size self.db_size = db_size
self._registry = registry self._registry = registry
self._key_path = key_path self._key_path = key_path
self._pp = pp self._pp = pp
...@@ -28,7 +32,7 @@ class PeerManager: ...@@ -28,7 +32,7 @@ class PeerManager:
address TEXT NOT NULL, address TEXT NOT NULL,
used INTEGER NOT NULL DEFAULT 0, used INTEGER NOT NULL DEFAULT 0,
date INTEGER DEFAULT (strftime('%s', 'now')))""") date INTEGER DEFAULT (strftime('%s', 'now')))""")
self._db.execute("UPDATE peers SET used = 0") self._db.execute("UPDATE peers SET used = 1 WHERE used = 2")
self._db.execute("""CREATE INDEX IF NOT EXISTS self._db.execute("""CREATE INDEX IF NOT EXISTS
_peers_used ON peers(used)""") _peers_used ON peers(used)""")
self._db.execute("""CREATE TABLE IF NOT EXISTS config ( self._db.execute("""CREATE TABLE IF NOT EXISTS config (
...@@ -73,30 +77,28 @@ class PeerManager: ...@@ -73,30 +77,28 @@ class PeerManager:
def refresh(self): def refresh(self):
logging.info('Refreshing the peers DB...') logging.info('Refreshing the peers DB...')
try: try:
self.next_refresh = time.time() + 30
self._declare() self._declare()
self.next_refresh = time.time() + self._refresh_time
except socket.error, e: except socket.error, e:
logging.info('Connection to server failed, re-bootstraping') logging.info('Connection to server failed, re-bootstraping and retrying in 30s')
try: try:
self._bootstrap() self._bootstrap()
self.next_refresh = time.time() + self._refresh_time
except socket.error, e: except socket.error, e:
logging.debug('socket.error : %s' % e) logging.debug('socket.error : %s' % e)
logging.info('Connection to server failed, retrying in 30s')
self.next_refresh = time.time() + 30
def _declare(self): def _declare(self):
if self.address != None: if self.address != None:
logging.info('Sending connection info to server...') logging.info('Sending connection info to server...')
self._proxy.declare(utils.address_str(self.address)) self._proxy.declare(utils.address_str(self.address))
self.next_refresh = time.time() + self._refresh_time
logging.debug('Info sent') logging.debug('Info sent')
else: else:
logging.warning("Warning : couldn't send ip, unknown external config") logging.warning("Warning : couldn't send ip, unknown external config. retrying in 30s")
def getUnusedPeers(self, peer_count): def getUnusedPeers(self, peer_count):
for populate in self._bootstrap, bool: for populate in self._bootstrap, bool:
peer_list = self._db.execute("""SELECT prefix, address FROM peers WHERE used peer_list = self._db.execute("""SELECT prefix, address FROM peers WHERE used
<= 0 ORDER BY used DESC,RANDOM() LIMIT ?""", <> 2 ORDER BY used ASC, RANDOM() LIMIT ?""",
(peer_count,)).fetchall() (peer_count,)).fetchall()
if peer_list: if peer_list:
return peer_list return peer_list
...@@ -125,19 +127,13 @@ class PeerManager: ...@@ -125,19 +127,13 @@ class PeerManager:
def usePeer(self, prefix): def usePeer(self, prefix):
logging.trace('Updating peers database : using peer %s' % prefix) logging.trace('Updating peers database : using peer %s' % prefix)
self._db.execute("UPDATE peers SET used = 1 WHERE prefix = ?", self._db.execute("UPDATE peers SET used = 2 WHERE prefix = ?",
(prefix,)) (prefix,))
logging.debug('DB updated') logging.debug('DB updated')
def unusePeer(self, prefix): def unusePeer(self, prefix):
logging.trace('Updating peers database : unusing peer %s' % prefix) logging.trace('Updating peers database : unusing peer %s' % prefix)
self._db.execute("UPDATE peers SET used = 0 WHERE prefix = ?", self._db.execute("UPDATE peers SET used = 1 WHERE prefix = ?",
(prefix,))
logging.debug('DB updated')
def flagPeer(self, prefix):
logging.trace('Updating peers database : flagging peer %s' % prefix)
self._db.execute("UPDATE peers SET used = -1 WHERE prefix = ?",
(prefix,)) (prefix,))
logging.debug('DB updated') logging.debug('DB updated')
...@@ -164,8 +160,7 @@ class PeerManager: ...@@ -164,8 +160,7 @@ class PeerManager:
self._declare() self._declare()
except socket.error, e: except socket.error, e:
logging.debug('socket.error : %s' % e) logging.debug('socket.error : %s' % e)
logging.info('''Connection to server failed while logging.info("""Connection to server failed while declaring external infos""")
declaring external infos''')
else: else:
logging.debug('Unknow message recieved from the openvpn pipe : %s' logging.debug('Unknow message recieved from the openvpn pipe : %s'
% msg) % msg)
...@@ -182,9 +177,10 @@ class PeerManager: ...@@ -182,9 +177,10 @@ class PeerManager:
if int(self._db.execute("""SELECT COUNT(*) FROM blacklist.flag WHERE prefix = ?""", (peer[0],)).next()[0]) > 0: if int(self._db.execute("""SELECT COUNT(*) FROM blacklist.flag WHERE prefix = ?""", (peer[0],)).next()[0]) > 0:
logging.info('Peer is blacklisted') logging.info('Peer is blacklisted')
return False return False
self._db.execute("""DELETE FROM peers WHERE used <= 0 ORDER BY used, self._db.execute("""DELETE FROM peers WHERE used <> 2 ORDER BY used DESC, date DESC
RANDOM() LIMIT MAX(0, (SELECT COUNT(*) FROM peers LIMIT MAX(0, (SELECT COUNT(*) FROM peers
WHERE used <= 0) - ?)""", (str(self._db_size),)) WHERE used <> 2) - ?)""", (str(self.db_size),))
self._db.execute("UPDATE peers SET address = ?, used = 0, date = strftime('%s','now') WHERE used = 1 and prefix = ?", (peer[1], peer[0],))
self._db.execute("INSERT OR IGNORE INTO peers (prefix, address) VALUES (?,?)", peer) self._db.execute("INSERT OR IGNORE INTO peers (prefix, address) VALUES (?,?)", peer)
logging.debug('Peer added') logging.debug('Peer added')
return True return True
...@@ -51,6 +51,7 @@ class TunnelManager: ...@@ -51,6 +51,7 @@ class TunnelManager:
self._prefix = prefix self._prefix = prefix
self._nSend = nSend self._nSend = nSend
self._encrypt = encrypt self._encrypt = encrypt
self._fast_start_done = False
self.next_refresh = time.time() self.next_refresh = time.time()
self._next_tunnel_refresh = time.time() self._next_tunnel_refresh = time.time()
...@@ -75,7 +76,6 @@ class TunnelManager: ...@@ -75,7 +76,6 @@ class TunnelManager:
for prefix in self._connection_dict.keys(): for prefix in self._connection_dict.keys():
if not self._connection_dict[prefix].refresh(): if not self._connection_dict[prefix].refresh():
self._kill(prefix) self._kill(prefix)
self._peer_db.flagPeer(prefix)
def _removeSomeTunnels(self): def _removeSomeTunnels(self):
# Get the candidates to killing # Get the candidates to killing
...@@ -149,7 +149,11 @@ class TunnelManager: ...@@ -149,7 +149,11 @@ class TunnelManager:
self._peer_db.blacklist(prefix, 0) self._peer_db.blacklist(prefix, 0)
possiblePeers.add(line[0]) possiblePeers.add(line[0])
for ip in random.sample(possiblePeers, min(3, len(possiblePeers))): if not self._fast_start_done and len(possiblePeers) > 4:
nSend = min(self._peer_db.db_size, len(possiblePeers))
else:
nSend = min(4, len(possiblePeers))
for ip in random.sample(possiblePeers, nSend):
self._notifyPeer(ip) self._notifyPeer(ip)
logging.debug("Routes have been counted") logging.debug("Routes have been counted")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment