MCPcopy
hub / github.com/HelloZeroNet/ZeroNet / downloader

Method downloader

src/Worker/Worker.py:28–144  ·  view source on GitHub ↗
(self)

Source from the content-addressed store, hash-verified

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:

Callers

nothing calls this directly

Calls 11

getTaskMethod · 0.80
findWorkersMethod · 0.80
errorMethod · 0.80
failTaskMethod · 0.80
onWorkerDoneMethod · 0.80
removeWorkerMethod · 0.80
getFileMethod · 0.45
verifyFileMethod · 0.45
seekMethod · 0.45
writeMethod · 0.45
doneTaskMethod · 0.45

Tested by

no test coverage detected