From 561bd80aa3a86e5dd18ab30efe95174d0e1847ea Mon Sep 17 00:00:00 2001 From: HelloZeroNet Date: Sat, 9 Apr 2016 19:43:44 +0200 Subject: [PATCH] Fallback to simple file copy if rename failed --- src/Site/SiteStorage.py | 2 +- src/Ui/UiWebsocket.py | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Site/SiteStorage.py b/src/Site/SiteStorage.py index 42696cae..0e53336f 100644 --- a/src/Site/SiteStorage.py +++ b/src/Site/SiteStorage.py @@ -175,7 +175,7 @@ class SiteStorage: err = None break except Exception, err: - self.log.error("%s rename error: %s" % (inner_path_before, err)) + self.log.error("%s rename error: %s (retry #%s)" % (inner_path_before, err, retry)) time.sleep(0.1 + retry) if err: raise err diff --git a/src/Ui/UiWebsocket.py b/src/Ui/UiWebsocket.py index 3d5ebebc..f9eebef7 100644 --- a/src/Ui/UiWebsocket.py +++ b/src/Ui/UiWebsocket.py @@ -3,7 +3,7 @@ import time import sys import hashlib import os -import re +import shutil import gevent @@ -383,8 +383,14 @@ class UiWebsocket(object): import base64 content = base64.b64decode(content_base64) # Save old file to generate patch later - if self.site.storage.isFile(inner_path) and not self.site.storage.isFile(inner_path+"-old"): - self.site.storage.rename(inner_path, inner_path+"-old") + if inner_path.endswith(".json") and self.site.storage.isFile(inner_path) and not self.site.storage.isFile(inner_path + "-old"): + try: + self.site.storage.rename(inner_path, inner_path + "-old") + except Exception: + # Rename failed, fall back to standard file write + f_old = self.site.storage.open(inner_path, "rb") + f_new = self.site.storage.open(inner_path + "-old", "wb") + shutil.copyfileobj(f_old, f_new) self.site.storage.write(inner_path, content) except Exception, err: