optimize performance for multiple ports
UDPRelay is broken now
This commit is contained in:
parent
d95e5ce680
commit
4a8d0774b4
7 changed files with 2171 additions and 168 deletions
|
@ -256,7 +256,6 @@ class DNSResolver(object):
|
|||
self._hostname_to_cb = {}
|
||||
self._cb_to_hostname = {}
|
||||
self._cache = lru_cache.LRUCache(timeout=300)
|
||||
self._last_time = time.time()
|
||||
self._sock = None
|
||||
self._servers = None
|
||||
self._parse_resolv()
|
||||
|
@ -304,7 +303,7 @@ class DNSResolver(object):
|
|||
except IOError:
|
||||
self._hosts['localhost'] = '127.0.0.1'
|
||||
|
||||
def add_to_loop(self, loop, ref=False):
|
||||
def add_to_loop(self, loop):
|
||||
if self._loop:
|
||||
raise Exception('already add to loop')
|
||||
self._loop = loop
|
||||
|
@ -312,8 +311,8 @@ class DNSResolver(object):
|
|||
self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,
|
||||
socket.SOL_UDP)
|
||||
self._sock.setblocking(False)
|
||||
loop.add(self._sock, eventloop.POLL_IN)
|
||||
loop.add_handler(self.handle_events, ref=ref)
|
||||
loop.add(self._sock, eventloop.POLL_IN, self)
|
||||
loop.add_periodic(self.handle_periodic)
|
||||
|
||||
def _call_callback(self, hostname, ip, error=None):
|
||||
callbacks = self._hostname_to_cb.get(hostname, [])
|
||||
|
@ -354,30 +353,27 @@ class DNSResolver(object):
|
|||
self._call_callback(hostname, None)
|
||||
break
|
||||
|
||||
def handle_events(self, events):
|
||||
for sock, fd, event in events:
|
||||
if sock != self._sock:
|
||||
continue
|
||||
if event & eventloop.POLL_ERR:
|
||||
logging.error('dns socket err')
|
||||
self._loop.remove(self._sock)
|
||||
self._sock.close()
|
||||
# TODO when dns server is IPv6
|
||||
self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,
|
||||
socket.SOL_UDP)
|
||||
self._sock.setblocking(False)
|
||||
self._loop.add(self._sock, eventloop.POLL_IN)
|
||||
else:
|
||||
data, addr = sock.recvfrom(1024)
|
||||
if addr[0] not in self._servers:
|
||||
logging.warn('received a packet other than our dns')
|
||||
break
|
||||
self._handle_data(data)
|
||||
break
|
||||
now = time.time()
|
||||
if now - self._last_time > CACHE_SWEEP_INTERVAL:
|
||||
self._cache.sweep()
|
||||
self._last_time = now
|
||||
def handle_event(self, sock, fd, event):
|
||||
if sock != self._sock:
|
||||
return
|
||||
if event & eventloop.POLL_ERR:
|
||||
logging.error('dns socket err')
|
||||
self._loop.remove(self._sock, self)
|
||||
self._sock.close()
|
||||
# TODO when dns server is IPv6
|
||||
self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,
|
||||
socket.SOL_UDP)
|
||||
self._sock.setblocking(False)
|
||||
self._loop.add(self._sock, eventloop.POLL_IN, self)
|
||||
else:
|
||||
data, addr = sock.recvfrom(1024)
|
||||
if addr[0] not in self._servers:
|
||||
logging.warn('received a packet other than our dns')
|
||||
return
|
||||
self._handle_data(data)
|
||||
|
||||
def handle_periodic(self):
|
||||
self._cache.sweep()
|
||||
|
||||
def remove_callback(self, callback):
|
||||
hostname = self._cb_to_hostname.get(callback)
|
||||
|
@ -385,7 +381,7 @@ class DNSResolver(object):
|
|||
del self._cb_to_hostname[callback]
|
||||
arr = self._hostname_to_cb.get(hostname, None)
|
||||
if arr:
|
||||
arr.remove(callback)
|
||||
arr.remove(callback, self)
|
||||
if not arr:
|
||||
del self._hostname_to_cb[hostname]
|
||||
if hostname in self._hostname_status:
|
||||
|
@ -430,6 +426,7 @@ class DNSResolver(object):
|
|||
|
||||
def close(self):
|
||||
if self._sock:
|
||||
self._loop.remove(self._sock, self)
|
||||
self._sock.close()
|
||||
self._sock = None
|
||||
|
||||
|
@ -451,7 +448,6 @@ def test():
|
|||
print(result, error)
|
||||
counter += 1
|
||||
if counter == 9:
|
||||
loop.remove_handler(dns_resolver.handle_events)
|
||||
dns_resolver.close()
|
||||
a_callback = callback
|
||||
return a_callback
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue