(self)
| 26 | |
| 27 | # Downloader thread |
| 28 | def downloader(self): |
| 29 | self.peer.hash_failed = 0 # Reset hash error counter |
| 30 | while self.running: |
| 31 | # Try to pickup free file download task |
| 32 | task = self.manager.getTask(self.peer) |
| 33 | if not task: # No more task |
| 34 | time.sleep(0.1) # Wait a bit for new tasks |
| 35 | task = self.manager.getTask(self.peer) |
| 36 | if not task: # Still no task, stop it |
| 37 | stats = "downloaded files: %s, failed: %s" % (self.num_downloaded, self.num_failed) |
| 38 | self.manager.log.debug("%s: No task found, stopping (%s)" % (self.key, stats)) |
| 39 | break |
| 40 | if not task["time_started"]: |
| 41 | task["time_started"] = time.time() # Task started now |
| 42 | |
| 43 | if task["workers_num"] > 0: # Wait a bit if someone already working on it |
| 44 | if task["peers"]: # It's an update |
| 45 | timeout = 3 |
| 46 | else: |
| 47 | timeout = 1 |
| 48 | |
| 49 | if task["size"] > 100 * 1024 * 1024: |
| 50 | timeout = timeout * 2 |
| 51 | |
| 52 | if config.verbose: |
| 53 | self.manager.log.debug("%s: Someone already working on %s (pri: %s), sleeping %s sec..." % ( |
| 54 | self.key, task["inner_path"], task["priority"], timeout |
| 55 | )) |
| 56 | |
| 57 | for sleep_i in range(1, timeout * 10): |
| 58 | time.sleep(0.1) |
| 59 | if task["done"] or task["workers_num"] == 0: |
| 60 | if config.verbose: |
| 61 | self.manager.log.debug("%s: %s, picked task free after %ss sleep. (done: %s)" % ( |
| 62 | self.key, task["inner_path"], 0.1 * sleep_i, task["done"] |
| 63 | )) |
| 64 | break |
| 65 | |
| 66 | if sleep_i % 10 == 0: |
| 67 | workers = self.manager.findWorkers(task) |
| 68 | if not workers or not workers[0].peer.connection: |
| 69 | break |
| 70 | worker_idle = time.time() - workers[0].peer.connection.last_recv_time |
| 71 | if worker_idle > 1: |
| 72 | if config.verbose: |
| 73 | self.manager.log.debug("%s: %s, worker %s seems idle, picked up task after %ss sleep. (done: %s)" % ( |
| 74 | self.key, task["inner_path"], workers[0].key, 0.1 * sleep_i, task["done"] |
| 75 | )) |
| 76 | break |
| 77 | |
| 78 | if task["done"]: |
| 79 | continue |
| 80 | |
| 81 | self.task = task |
| 82 | site = task["site"] |
| 83 | task["workers_num"] += 1 |
| 84 | error_message = "Unknown error" |
| 85 | try: |
nothing calls this directly
no test coverage detected