Refactor task adding with less locking
This commit is contained in:
parent
5987274edf
commit
b2e7cbb927
1 changed files with 75 additions and 60 deletions
|
@ -460,12 +460,7 @@ class WorkerManager(object):
|
|||
return 2
|
||||
return 0
|
||||
|
||||
# Create new task and return asyncresult
|
||||
def addTask(self, inner_path, peer=None, priority=0, file_info=None):
|
||||
self.lock_add_task.acquire()
|
||||
self.site.onFileStart(inner_path) # First task, trigger site download started
|
||||
task = self.tasks.findTask(inner_path)
|
||||
if task: # Already has task for that file
|
||||
def addTaskUpdate(self, task, peer, priority=0):
|
||||
if priority > task["priority"]:
|
||||
self.tasks.updateItem(task, "priority", priority)
|
||||
if peer and task["peers"]: # This peer also has new version, add it to task possible peers
|
||||
|
@ -476,7 +471,8 @@ class WorkerManager(object):
|
|||
task["failed"].remove(peer) # New update arrived, remove the peer from failed peers
|
||||
self.log.debug("Removed peer %s from failed %s" % (peer.key, task["inner_path"]))
|
||||
self.startWorkers([peer], reason="Added new task (peer failed before)")
|
||||
else: # No task for that file yet
|
||||
|
||||
def addTaskCreate(self, inner_path, peer, priority=0, file_info=None):
|
||||
evt = gevent.event.AsyncResult()
|
||||
if peer:
|
||||
peers = [peer] # Only download from this peer
|
||||
|
@ -492,6 +488,15 @@ class WorkerManager(object):
|
|||
size = file_info.get("size", 0)
|
||||
else:
|
||||
size = 0
|
||||
|
||||
self.lock_add_task.acquire()
|
||||
|
||||
# Check again if we have task for this file
|
||||
task = self.tasks.findTask(inner_path)
|
||||
if task:
|
||||
self.addTaskUpdate(task, peer, priority)
|
||||
return task
|
||||
|
||||
priority += self.getPriorityBoost(inner_path)
|
||||
|
||||
if self.started_task_num == 0: # Boost priority for first requested file
|
||||
|
@ -504,6 +509,7 @@ class WorkerManager(object):
|
|||
}
|
||||
|
||||
self.tasks.append(task)
|
||||
self.lock_add_task.release()
|
||||
|
||||
self.next_task_id += 1
|
||||
self.started_task_num += 1
|
||||
|
@ -525,7 +531,16 @@ class WorkerManager(object):
|
|||
|
||||
else:
|
||||
self.startWorkers(peers, reason="Added new task")
|
||||
self.lock_add_task.release()
|
||||
return task
|
||||
|
||||
# Create new task and return asyncresult
|
||||
def addTask(self, inner_path, peer=None, priority=0, file_info=None):
|
||||
self.site.onFileStart(inner_path) # First task, trigger site download started
|
||||
task = self.tasks.findTask(inner_path)
|
||||
if task: # Already has task for that file
|
||||
self.addTaskUpdate(task, peer, priority)
|
||||
else: # No task for that file yet
|
||||
task = self.addTaskCreate(inner_path, peer, priority, file_info)
|
||||
return task
|
||||
|
||||
def addTaskWorker(self, task, worker):
|
||||
|
|
Loading…
Reference in a new issue