fix duplicate/buffering problem

fix problem where get request takes time to respond, in this time it
can receive more get requests that each manage to start downloading
This commit is contained in:
Jack 2016-04-22 18:48:44 -04:00
parent 28f66e30dd
commit 3e7c09bb44
2 changed files with 12 additions and 3 deletions

View file

@ -134,6 +134,7 @@ class LBRYDaemon(jsonrpc.JSONRPC):
self.current_db_revision = 1
self.run_server = True
self.session = None
self.waiting_on = {}
self.known_dht_nodes = KNOWN_DHT_NODES
self.platform_info = {
"processor": platform.processor(),
@ -867,6 +868,10 @@ class LBRYDaemon(jsonrpc.JSONRPC):
elif not os.path.isdir(download_directory):
download_directory = self.download_directory
def _remove_from_wait(r):
del self.waiting_on[name]
return r
def _disp_file(f):
file_path = os.path.join(self.download_directory, f.file_name)
log.info("[" + str(datetime.now()) + "] Already downloaded: " + str(f.stream_hash) + " --> " + file_path)
@ -891,8 +896,10 @@ class LBRYDaemon(jsonrpc.JSONRPC):
return d
self.waiting_on[name] = True
d = self._check_history(name)
d.addCallback(lambda lbry_file: _get_stream(name) if not lbry_file else _disp_file(lbry_file))
d.addCallback(_remove_from_wait)
return d
@ -1382,8 +1389,11 @@ class LBRYDaemon(jsonrpc.JSONRPC):
if 'name' in p.keys():
name = p['name']
d = self._download_name(name=name, timeout=timeout, download_directory=download_directory)
d.addCallback(lambda message: self._render_response(message, OK_CODE))
if p['name'] not in self.waiting_on.keys():
d = self._download_name(name=name, timeout=timeout, download_directory=download_directory)
d.addCallback(lambda message: self._render_response(message, OK_CODE))
else:
d = server.failure
else:
d = server.failure

View file

@ -123,7 +123,6 @@ class GetStream(object):
self.download_path = os.path.join(downloader.download_directory, downloader.file_name)
d.addCallback(lambda _: log.info("Downloading " + str(self.stream_hash) + " --> " + str(self.download_path)))
d.addCallback(lambda _: downloader.start())
d.callback()
class FetcherDaemon(object):
def __init__(self, session, lbry_file_manager, lbry_file_metadata_manager, wallet, sd_identifier, autofetcher_conf,