Mark files updates currently working on to avoid double update on slow systems

This commit is contained in:
HelloZeroNet 2016-04-20 23:38:22 +02:00
parent c7b8ec5667
commit 21cfa653ca
2 changed files with 26 additions and 10 deletions

View file

@ -1,7 +1,7 @@
# Included modules # Included modules
import os import os
import time import time
from cStringIO import StringIO import json
# Third party modules # Third party modules
import gevent import gevent
@ -89,15 +89,25 @@ class FileRequest(object):
changed, deleted = site.content_manager.loadContent(params["inner_path"], add_bad_files=False) changed, deleted = site.content_manager.loadContent(params["inner_path"], add_bad_files=False)
if changed or deleted: # Content.json changed locally if changed or deleted: # Content.json changed locally
site.settings["size"] = site.content_manager.getTotalSize() # Update site size site.settings["size"] = site.content_manager.getTotalSize() # Update site size
buff = StringIO(params["body"])
valid = site.content_manager.verifyFile(params["inner_path"], buff)
if not params["inner_path"].endswith("content.json"): if not params["inner_path"].endswith("content.json"):
self.response({"error": "Only content.json update allowed"}) self.response({"error": "Only content.json update allowed"})
return return
content = json.loads(params["body"])
file_uri = "%s/%s:%s" % (site.address, params["inner_path"], content["modified"])
if self.server.files_parsing.get(file_uri): # Check if we already working on it
valid = None # Same file
else:
valid = site.content_manager.verifyFile(params["inner_path"], content)
if valid is True: # Valid and changed if valid is True: # Valid and changed
self.log.info("Update for %s looks valid, saving..." % params["inner_path"]) self.log.info("Update for %s/%s looks valid, saving..." % (params["site"], params["inner_path"]))
buff.seek(0) self.server.files_parsing[file_uri] = True
site.storage.write(params["inner_path"], buff) site.storage.write(params["inner_path"], params["body"])
del params["body"]
site.onFileDone(params["inner_path"]) # Trigger filedone site.onFileDone(params["inner_path"]) # Trigger filedone
@ -107,9 +117,13 @@ class FileRequest(object):
site.onComplete.once(lambda: site.publish(inner_path=params["inner_path"], diffs=params.get("diffs", {})), "publish_%s" % params["inner_path"]) site.onComplete.once(lambda: site.publish(inner_path=params["inner_path"], diffs=params.get("diffs", {})), "publish_%s" % params["inner_path"])
# Load new content file and download changed files in new thread # Load new content file and download changed files in new thread
gevent.spawn( def downloader():
lambda: site.downloadContent(params["inner_path"], peer=peer, diffs=params.get("diffs", {})) site.downloadContent(params["inner_path"], peer=peer, diffs=params.get("diffs", {}))
) del self.server.files_parsing[file_uri]
gevent.spawn(downloader)
else:
del self.server.files_parsing[file_uri]
self.response({"ok": "Thanks, file %s updated!" % params["inner_path"]}) self.response({"ok": "Thanks, file %s updated!" % params["inner_path"]})
self.connection.goodAction() self.connection.goodAction()
@ -353,7 +367,8 @@ class FileRequest(object):
self.connection.badAction(5) self.connection.badAction(5)
return False return False
peer = site.addPeer(self.connection.ip, self.connection.port, return_peer=True, connection=self.connection) # Add or get peer # Add or get peer
peer = site.addPeer(self.connection.ip, self.connection.port, return_peer=True, connection=self.connection)
if not peer.connection: if not peer.connection:
peer.connect(self.connection) peer.connect(self.connection)
peer.hashfield.replaceFromString(params["hashfield_raw"]) peer.hashfield.replaceFromString(params["hashfield_raw"])

View file

@ -25,6 +25,7 @@ class FileServer(ConnectionServer):
self.port_opened = None # Is file server opened on router self.port_opened = None # Is file server opened on router
self.sites = {} self.sites = {}
self.last_request = time.time() self.last_request = time.time()
self.files_parsing = {}
# Handle request to fileserver # Handle request to fileserver
def handleRequest(self, connection, message): def handleRequest(self, connection, message):