add some tests, don't use lighthouse for cost ests
This commit is contained in:
parent
d83abd81f8
commit
d741c705cd
5 changed files with 73 additions and 15 deletions
|
@ -28,9 +28,7 @@ KNOWN_DHT_NODES = [('104.236.42.182', 4000),
|
||||||
POINTTRADER_SERVER = 'http://ec2-54-187-192-68.us-west-2.compute.amazonaws.com:2424'
|
POINTTRADER_SERVER = 'http://ec2-54-187-192-68.us-west-2.compute.amazonaws.com:2424'
|
||||||
#POINTTRADER_SERVER = 'http://127.0.0.1:2424'
|
#POINTTRADER_SERVER = 'http://127.0.0.1:2424'
|
||||||
|
|
||||||
if IS_DEVELOPMENT_VERSION:
|
|
||||||
SEARCH_SERVERS = ["http://107.170.207.64:50005"]
|
|
||||||
else:
|
|
||||||
SEARCH_SERVERS = ["http://lighthouse1.lbry.io:50005",
|
SEARCH_SERVERS = ["http://lighthouse1.lbry.io:50005",
|
||||||
"http://lighthouse2.lbry.io:50005",
|
"http://lighthouse2.lbry.io:50005",
|
||||||
"http://lighthouse3.lbry.io:50005"]
|
"http://lighthouse3.lbry.io:50005"]
|
||||||
|
|
|
@ -67,6 +67,7 @@ class BlobAvailabilityTracker(object):
|
||||||
encoded = hash.encode('hex')
|
encoded = hash.encode('hex')
|
||||||
dl.append(self._update_peers_for_blob(encoded))
|
dl.append(self._update_peers_for_blob(encoded))
|
||||||
return defer.DeferredList(dl)
|
return defer.DeferredList(dl)
|
||||||
|
|
||||||
d = _get_most_popular()
|
d = _get_most_popular()
|
||||||
d.addCallback(lambda _: self._get_mean_peers())
|
d.addCallback(lambda _: self._get_mean_peers())
|
||||||
|
|
||||||
|
@ -76,6 +77,7 @@ class BlobAvailabilityTracker(object):
|
||||||
for hash in blobs:
|
for hash in blobs:
|
||||||
dl.append(self._update_peers_for_blob(hash))
|
dl.append(self._update_peers_for_blob(hash))
|
||||||
return defer.DeferredList(dl)
|
return defer.DeferredList(dl)
|
||||||
|
|
||||||
d = self._blob_manager.get_all_verified_blobs()
|
d = self._blob_manager.get_all_verified_blobs()
|
||||||
d.addCallback(_get_peers)
|
d.addCallback(_get_peers)
|
||||||
d.addCallback(lambda _: self._get_mean_peers())
|
d.addCallback(lambda _: self._get_mean_peers())
|
||||||
|
@ -84,3 +86,32 @@ class BlobAvailabilityTracker(object):
|
||||||
num_peers = [len(self.availability[blob]) for blob in self.availability]
|
num_peers = [len(self.availability[blob]) for blob in self.availability]
|
||||||
mean = float(sum(num_peers)) / float(max(1, len(num_peers)))
|
mean = float(sum(num_peers)) / float(max(1, len(num_peers)))
|
||||||
self.last_mean_availability = mean
|
self.last_mean_availability = mean
|
||||||
|
|
||||||
|
|
||||||
|
class DummyBlobAvailabilityTracker(object):
|
||||||
|
"""
|
||||||
|
Class to track peer counts for known blobs, and to discover new popular blobs
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
availability (dict): dictionary of peers for known blobs
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.availability = {
|
||||||
|
'91dc64cf1ff42e20d627b033ad5e4c3a4a96856ed8a6e3fb4cd5fa1cfba4bf72eefd325f579db92f45f4355550ace8e7': ['1.2.3.4'],
|
||||||
|
'b2e48bb4c88cf46b76adf0d47a72389fae0cd1f19ed27dc509138c99509a25423a4cef788d571dca7988e1dca69e6fa0': ['1.2.3.4', '1.2.3.4'],
|
||||||
|
'6af95cd062b4a179576997ef1054c9d2120f8592eea045e9667bea411d520262cd5a47b137eabb7a7871f5f8a79c92dd': ['1.2.3.4', '1.2.3.4', '1.2.3.4'],
|
||||||
|
'6d8017aba362e5c5d0046625a039513419810a0397d728318c328a5cc5d96efb589fbca0728e54fe5adbf87e9545ee07': ['1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4'],
|
||||||
|
'5a450b416275da4bdff604ee7b58eaedc7913c5005b7184fc3bc5ef0b1add00613587f54217c91097fc039ed9eace9dd': ['1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4'],
|
||||||
|
'd7c82e6cac093b3f16107d2ae2b2c75424f1fcad2c7fbdbe66e4a13c0b6bd27b67b3a29c403b82279ab0f7c1c48d6787': ['1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4'],
|
||||||
|
'9dbda74a472a2e5861a5d18197aeba0f5de67c67e401124c243d2f0f41edf01d7a26aeb0b5fc9bf47f6361e0f0968e2c': ['1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4'],
|
||||||
|
'8c70d5e2f5c3a6085006198e5192d157a125d92e7378794472007a61947992768926513fc10924785bdb1761df3c37e6': ['1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4'],
|
||||||
|
'f99d24cd50d4bfd77c2598bfbeeb8415bf0feef21200bdf0b8fbbde7751a77b7a2c68e09c25465a2f40fba8eecb0b4e0': ['1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4'],
|
||||||
|
'c84aa1fd8f5009f7c4e71e444e40d95610abc1480834f835eefb267287aeb10025880a3ce22580db8c6d92efb5bc0c9c': ['1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4', '1.2.3.4'],
|
||||||
|
}
|
||||||
|
self._get_mean_peers()
|
||||||
|
|
||||||
|
def _get_mean_peers(self):
|
||||||
|
num_peers = [len(self.availability[blob]) for blob in self.availability]
|
||||||
|
mean = float(sum(num_peers)) / float(max(1, len(num_peers)))
|
||||||
|
self.last_mean_availability = mean
|
||||||
|
|
|
@ -1887,13 +1887,8 @@ class Daemon(jsonrpc.JSONRPC):
|
||||||
"""
|
"""
|
||||||
|
|
||||||
name = p['name']
|
name = p['name']
|
||||||
force = p.get('force', False)
|
|
||||||
|
|
||||||
if force:
|
|
||||||
d = self._get_est_cost(name)
|
d = self._get_est_cost(name)
|
||||||
else:
|
|
||||||
d = self._search(name)
|
|
||||||
d.addCallback(lambda r: [i['cost'] for i in r][0])
|
|
||||||
d.addCallback(lambda r: self._render_response(r, OK_CODE))
|
d.addCallback(lambda r: self._render_response(r, OK_CODE))
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,6 @@ class GetStream(object):
|
||||||
self.description = None
|
self.description = None
|
||||||
self.fee = None
|
self.fee = None
|
||||||
self.data_rate = data_rate
|
self.data_rate = data_rate
|
||||||
self.name = None
|
|
||||||
self.file_name = file_name
|
self.file_name = file_name
|
||||||
self.session = session
|
self.session = session
|
||||||
self.exchange_rate_manager = exchange_rate_manager
|
self.exchange_rate_manager = exchange_rate_manager
|
||||||
|
@ -147,7 +146,7 @@ class GetStream(object):
|
||||||
return self.finished
|
return self.finished
|
||||||
|
|
||||||
def _start_download(self, downloader):
|
def _start_download(self, downloader):
|
||||||
log.info('Starting download for %s', self.name)
|
log.info('Starting download for %s', self.resolved_name)
|
||||||
self.downloader = downloader
|
self.downloader = downloader
|
||||||
self.download_path = os.path.join(downloader.download_directory, downloader.file_name)
|
self.download_path = os.path.join(downloader.download_directory, downloader.file_name)
|
||||||
|
|
||||||
|
|
35
tests/unit/core/test_Strategy.py
Normal file
35
tests/unit/core/test_Strategy.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
from twisted.trial import unittest
|
||||||
|
from lbrynet.core.Strategy import BasicAvailabilityWeightedStrategy
|
||||||
|
from lbrynet.core.BlobAvailability import DummyBlobAvailabilityTracker
|
||||||
|
|
||||||
|
|
||||||
|
class StrategyTests(unittest.TestCase):
|
||||||
|
def test_first_offer_is_zero_and_second_isnt(self):
|
||||||
|
strategy = BasicAvailabilityWeightedStrategy(DummyBlobAvailabilityTracker())
|
||||||
|
peer = "1.1.1.1"
|
||||||
|
blobs = strategy.model.blob_tracker.availability.keys()
|
||||||
|
offer1 = strategy.make_offer(peer, blobs)
|
||||||
|
offer2 = strategy.make_offer(peer, blobs)
|
||||||
|
self.assertEquals(offer1.rate, 0.0)
|
||||||
|
self.assertNotEqual(offer2.rate, 0.0)
|
||||||
|
|
||||||
|
def test_accept_zero_for_first_offer_and_reject_after(self):
|
||||||
|
host_strategy = BasicAvailabilityWeightedStrategy(DummyBlobAvailabilityTracker())
|
||||||
|
client = "1.1.1.1"
|
||||||
|
host = "1.1.1.2"
|
||||||
|
blobs = host_strategy.model.blob_tracker.availability.keys()
|
||||||
|
client_strategy = BasicAvailabilityWeightedStrategy(DummyBlobAvailabilityTracker())
|
||||||
|
client_offer1 = client_strategy.make_offer(host, blobs)
|
||||||
|
client_strategy = BasicAvailabilityWeightedStrategy(DummyBlobAvailabilityTracker())
|
||||||
|
client_offer2 = client_strategy.make_offer(host, blobs)
|
||||||
|
|
||||||
|
host_response1 = host_strategy.respond_to_offer(client_offer1, client, blobs)
|
||||||
|
host_response2 = host_strategy.respond_to_offer(client_offer2, client, blobs)
|
||||||
|
|
||||||
|
self.assertEquals(host_response2.too_low, False)
|
||||||
|
self.assertEquals(host_response1.accepted, True)
|
||||||
|
self.assertEquals(host_response1.rate, 0.0)
|
||||||
|
|
||||||
|
self.assertEquals(host_response2.too_low, True)
|
||||||
|
self.assertEquals(host_response2.accepted, False)
|
||||||
|
self.assertEquals(host_response2.rate, 0.0)
|
Loading…
Reference in a new issue