From 4eb843fd8cbc0d28b59a4e86a8d06810fd33fe85 Mon Sep 17 00:00:00 2001
From: shortcutme <tamas@zeronet.io>
Date: Thu, 12 Apr 2018 19:25:13 +0200
Subject: [PATCH] Delay saving users.json

---
 src/User/User.py        | 16 +++++++++++-----
 src/User/UserManager.py |  2 +-
 2 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/src/User/User.py b/src/User/User.py
index f14144af..acaaf1d2 100644
--- a/src/User/User.py
+++ b/src/User/User.py
@@ -25,6 +25,7 @@ class User(object):
             self.master_address = CryptBitcoin.privatekeyToAddress(self.master_seed)
         self.sites = data.get("sites", {})
         self.certs = data.get("certs", {})
+        self.delayed_save_thread = None
 
         self.log = logging.getLogger("User:%s" % self.master_address)
 
@@ -41,7 +42,12 @@ class User(object):
         user_data["sites"] = self.sites
         user_data["certs"] = self.certs
         helper.atomicWrite("%s/users.json" % config.data_dir, json.dumps(users, indent=2, sort_keys=True))
-        self.log.debug("Saved in %.3fs" % (time.time()-s))
+        self.log.debug("Saved in %.3fs" % (time.time() - s))
+        self.delayed_save_thread = None
+
+    def saveDelayed(self):
+        if not self.delayed_save_thread:
+            self.delayed_save_thread = gevent.spawn_later(5, self.save)
 
     def getAddressAuthIndex(self, address):
         return int(address.encode("hex"), 16)
@@ -71,13 +77,13 @@ class User(object):
     def deleteSiteData(self, address):
         if address in self.sites:
             del(self.sites[address])
-            self.save()
+            self.saveDelayed()
             self.log.debug("Deleted site: %s" % address)
 
     def setSettings(self, address, settings):
         site_data = self.getSiteData(address)
         site_data["settings"] = settings
-        self.save()
+        self.saveDelayed()
         return site_data
 
     # Get data for a new, unique site
@@ -92,7 +98,7 @@ class User(object):
         # Save to sites
         self.getSiteData(site_address)
         self.sites[site_address]["privatekey"] = site_privatekey
-        self.save()
+        self.saveDelayed()
         return site_address, bip32_index, self.sites[site_address]
 
     # Get BIP32 address from site address
@@ -145,7 +151,7 @@ class User(object):
         else:
             if "cert" in site_data:
                 del site_data["cert"]
-        self.save()
+        self.saveDelayed()
         return site_data
 
     # Get cert for the site address
diff --git a/src/User/UserManager.py b/src/User/UserManager.py
index c90c7eea..e174f75e 100644
--- a/src/User/UserManager.py
+++ b/src/User/UserManager.py
@@ -47,7 +47,7 @@ class UserManager(object):
         self.log.debug("Created user: %s" % user.master_address)
         if user.master_address:  # If successfully created
             self.users[user.master_address] = user
-            user.save()
+            user.saveDelayed()
         return user
 
     # List all users from data/users.json