(self, inner_path, peer=None, priority=0, file_info=None)
| 459 | |
| 460 | # Create new task and return asyncresult |
| 461 | def addTask(self, inner_path, peer=None, priority=0, file_info=None): |
| 462 | self.site.onFileStart(inner_path) # First task, trigger site download started |
| 463 | task = self.findTask(inner_path) |
| 464 | if task: # Already has task for that file |
| 465 | task["priority"] = max(priority, task["priority"]) |
| 466 | if peer and task["peers"]: # This peer also has new version, add it to task possible peers |
| 467 | task["peers"].append(peer) |
| 468 | self.log.debug("Added peer %s to %s" % (peer.key, task["inner_path"])) |
| 469 | self.startWorkers([peer], reason="Added new task (update received by peer)") |
| 470 | elif peer and peer in task["failed"]: |
| 471 | task["failed"].remove(peer) # New update arrived, remove the peer from failed peers |
| 472 | self.log.debug("Removed peer %s from failed %s" % (peer.key, task["inner_path"])) |
| 473 | self.startWorkers([peer], reason="Added new task (peer failed before)") |
| 474 | return task |
| 475 | else: # No task for that file yet |
| 476 | evt = gevent.event.AsyncResult() |
| 477 | if peer: |
| 478 | peers = [peer] # Only download from this peer |
| 479 | else: |
| 480 | peers = None |
| 481 | if not file_info: |
| 482 | file_info = self.site.content_manager.getFileInfo(inner_path) |
| 483 | if file_info and file_info["optional"]: |
| 484 | optional_hash_id = helper.toHashId(file_info["sha512"]) |
| 485 | else: |
| 486 | optional_hash_id = None |
| 487 | if file_info: |
| 488 | size = file_info.get("size", 0) |
| 489 | else: |
| 490 | size = 0 |
| 491 | priority += self.getPriorityBoost(inner_path) |
| 492 | |
| 493 | if self.started_task_num == 0: # Boost priority for first requested file |
| 494 | priority += 1 |
| 495 | |
| 496 | task = { |
| 497 | "evt": evt, "workers_num": 0, "site": self.site, "inner_path": inner_path, "done": False, |
| 498 | "optional_hash_id": optional_hash_id, "time_added": time.time(), "time_started": None, |
| 499 | "time_action": None, "peers": peers, "priority": priority, "failed": [], "size": size |
| 500 | } |
| 501 | |
| 502 | self.tasks.append(task) |
| 503 | |
| 504 | self.started_task_num += 1 |
| 505 | if config.verbose: |
| 506 | self.log.debug( |
| 507 | "New task: %s, peer lock: %s, priority: %s, optional_hash_id: %s, tasks started: %s" % |
| 508 | (task["inner_path"], peers, priority, optional_hash_id, self.started_task_num) |
| 509 | ) |
| 510 | |
| 511 | self.time_task_added = time.time() |
| 512 | |
| 513 | if optional_hash_id: |
| 514 | if self.asked_peers: |
| 515 | del self.asked_peers[:] # Reset asked peers |
| 516 | self.startFindOptional(high_priority=priority > 0) |
| 517 | |
| 518 | if peers: |
no test coverage detected