diff --git a/lbrynet/daemon/Daemon.py b/lbrynet/daemon/Daemon.py index 521134f87..1155f0cab 100644 --- a/lbrynet/daemon/Daemon.py +++ b/lbrynet/daemon/Daemon.py @@ -392,6 +392,11 @@ class Daemon(AuthJSONRPCServer): def _already_shutting_down(sig_num, frame): log.info("Already shutting down") + def _stop_streams(self): + """stop pending GetStream downloads""" + for claim_id, stream in self.streams.iteritems(): + stream.cancel(reason="daemon shutdown") + def _shutdown(self): # ignore INT/TERM signals once shutdown has started signal.signal(signal.SIGINT, self._already_shutting_down) @@ -399,6 +404,9 @@ class Daemon(AuthJSONRPCServer): log.info("Closing lbrynet session") log.info("Status at time of shutdown: " + self.startup_status[0]) + + self._stop_streams() + self.looping_call_manager.shutdown() if self.analytics_manager: self.analytics_manager.shutdown() diff --git a/lbrynet/daemon/Downloader.py b/lbrynet/daemon/Downloader.py index 626c79947..53a164d58 100644 --- a/lbrynet/daemon/Downloader.py +++ b/lbrynet/daemon/Downloader.py @@ -151,9 +151,7 @@ class GetStream(object): def fail(self, err): safe_stop_looping_call(self.checker) - if not err.check(DownloadDataTimeout): - raise err - return DownloadCanceledError() + raise err @defer.inlineCallbacks def _initialize(self, stream_info): @@ -184,8 +182,7 @@ class GetStream(object): log.info("Downloading lbry://%s (%s) --> %s", name, self.sd_hash[:6], self.download_path) self.finished_deferred = self.downloader.start() - self.finished_deferred.addCallbacks(lambda result: self.finish(result, name), - self.fail) + self.finished_deferred.addCallbacks(lambda result: self.finish(result, name), self.fail) @defer.inlineCallbacks def start(self, stream_info, name): @@ -215,3 +212,13 @@ class GetStream(object): raise err defer.returnValue((self.downloader, self.finished_deferred)) + + def cancel(self, reason=None): + if reason: + msg = "download stream cancelled: %s" % reason + else: + msg = "download stream cancelled" + if self.finished_deferred and not self.finished_deferred.called: + self.finished_deferred.errback(DownloadCanceledError(msg)) + if self.data_downloading_deferred and not self.data_downloading_deferred.called: + self.data_downloading_deferred.errback(DownloadCanceledError(msg))