Avoid write race on same file
This commit is contained in:
parent
e1dc29c374
commit
1c587bde25
2 changed files with 13 additions and 4 deletions
|
@ -107,7 +107,9 @@ class Worker(object):
|
|||
if self.manager.started_task_num < 50 or config.verbose:
|
||||
self.manager.log.debug("%s: Verify correct: %s" % (self.key, task["inner_path"]))
|
||||
write_error = None
|
||||
if correct is True and task["done"] is False: # Save if changed and task not done yet
|
||||
task_finished = False
|
||||
if correct is True and task["locked"] is False: # Save if changed and task not done yet
|
||||
task["locked"] = True
|
||||
buff.seek(0)
|
||||
try:
|
||||
site.storage.write(task["inner_path"], buff)
|
||||
|
@ -115,8 +117,13 @@ class Worker(object):
|
|||
except Exception as err:
|
||||
self.manager.log.error("%s: Error writing: %s (%s)" % (self.key, task["inner_path"], err))
|
||||
write_error = err
|
||||
task_finished = True
|
||||
|
||||
if task["done"] is False:
|
||||
if correct is None and task["locked"] is False: # Mark as done if same file
|
||||
task["locked"] = True
|
||||
task_finished = True
|
||||
|
||||
if task_finished and not task["done"]:
|
||||
if write_error:
|
||||
self.manager.failTask(task)
|
||||
self.num_failed += 1
|
||||
|
|
|
@ -21,7 +21,7 @@ class WorkerManager(object):
|
|||
self.tasks = WorkerTaskManager()
|
||||
self.next_task_id = 1
|
||||
# {"id": 1, "evt": evt, "workers_num": 0, "site": self.site, "inner_path": inner_path, "done": False, "optional_hash_id": None,
|
||||
# "time_started": None, "time_added": time.time(), "peers": peers, "priority": 0, "failed": peer_ids}
|
||||
# "time_started": None, "time_added": time.time(), "peers": peers, "priority": 0, "failed": peer_ids, "locked": False}
|
||||
self.started_task_num = 0 # Last added task num
|
||||
self.asked_peers = []
|
||||
self.running = True
|
||||
|
@ -124,6 +124,8 @@ class WorkerManager(object):
|
|||
continue # Peer already tried to solve this, but failed
|
||||
if task["optional_hash_id"] and task["peers"] is None:
|
||||
continue # No peers found yet for the optional task
|
||||
if task["done"]:
|
||||
continue
|
||||
return task
|
||||
|
||||
def removeSolvedFileTasks(self, mark_as_good=True):
|
||||
|
@ -498,7 +500,7 @@ class WorkerManager(object):
|
|||
|
||||
task = {
|
||||
"id": self.next_task_id, "evt": evt, "workers_num": 0, "site": self.site, "inner_path": inner_path, "done": False,
|
||||
"optional_hash_id": optional_hash_id, "time_added": time.time(), "time_started": None,
|
||||
"optional_hash_id": optional_hash_id, "time_added": time.time(), "time_started": None, "locked": False,
|
||||
"time_action": None, "peers": peers, "priority": priority, "failed": [], "size": size
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue