This repository has been archived on 2024-05-09. You can view files and clone it, but cannot push or open issues/pull-requests.
ipodderx-core/khashmir/util.py

70 lines
2.2 KiB
Python

# The contents of this file are subject to the BitTorrent Open Source License
# Version 1.1 (the License). You may not copy or use this file, in either
# source code or executable form, except in compliance with the License. You
# may obtain a copy of the License at http://www.bittorrent.com/license/.
#
# Software distributed under the License is distributed on an AS IS basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
from struct import pack, unpack
def bucket_stats(l):
"""given a list of khashmir instances, finds min, max, and average number of nodes in tables"""
max = avg = 0
min = None
def count(buckets):
c = 0
for bucket in buckets:
c = c + len(bucket.l)
return c
for node in l:
c = count(node.table.buckets)
if min == None:
min = c
elif c < min:
min = c
if c > max:
max = c
avg = avg + c
avg = avg / len(l)
return {'min':min, 'max':max, 'avg':avg}
def compact_peer_info(ip, port):
return pack('!BBBBH', *([int(i) for i in ip.split('.')] + [port]))
def packPeers(peers):
return map(lambda a: compact_peer_info(a[0], a[1]), peers)
def reducePeers(peers):
return reduce(lambda a, b: a + b, peers, '')
def unpackPeers(p):
peers = []
if type(p) == type(''):
for x in xrange(0, len(p), 6):
ip = '.'.join([str(ord(i)) for i in p[x:x+4]])
port = unpack('!H', p[x+4:x+6])[0]
peers.append((ip, port, None))
else:
for x in p:
peers.append((x['ip'], x['port'], x.get('peer id')))
return peers
def compact_node_info(id, ip, port):
return id + compact_peer_info(ip, port)
def packNodes(nodes):
return ''.join([compact_node_info(x['id'], x['host'], x['port']) for x in nodes])
def unpackNodes(n):
nodes = []
for x in xrange(0, len(n), 26):
id = n[x:x+20]
ip = '.'.join([str(ord(i)) for i in n[x+20:x+24]])
port = unpack('!H', n[x+24:x+26])[0]
nodes.append({'id':id, 'host':ip, 'port': port})
return nodes