Mark files updates currently working on to avoid double update on slow systems
This commit is contained in:
parent
c7b8ec5667
commit
21cfa653ca
2 changed files with 26 additions and 10 deletions
|
@ -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"])
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in a new issue