sync-rsync: Add option to defer initial sync
authorJack Miller <jack@codezen.org>
Fri, 21 Jul 2017 21:37:09 +0000 (16:37 -0500)
committerJack Miller <jack@codezen.org>
Fri, 21 Jul 2017 21:37:09 +0000 (16:37 -0500)
The way that sync-rsync works, it would call sync() immediately on the
daemon_start_serving hook which is theoretically good behavior to truly
keep old items from ever being served up, but in practice it causes a
long delay before the daemon can actually serve up items that is
particularly noticeable when the daemon is started by the client (rather
than being started on system/WM start).

Solve this by changing the hook to just setup the synchronization timer
to sync after a delay. This means the hook executes almost instantly,
and the daemon goes on to load/serve the existing on-disk items
immediately, only to sync() after running for n (default 30) seconds.

Adjusting this may also improve startup behavior on systems that take a
while to get network where the initial sync would timeout and wait
another INTERVAL (default 300 seconds) before trying again.

Setting INITIAL_SYNC to 0 will restore the old default behavior.

plugins/sync-rsync.py

index 791807a..5f05d61 100644 (file)
@@ -23,6 +23,13 @@ ENABLED = False
 # Synchronization interval in seconds
 INTERVAL = 5 * 60
 
+# How long, in seconds, we should wait for the initial sync. Setting to 0 will
+# cause a sync to occur before any other items can be read from disk, which
+# ensures you won't see any old items, but also means a full sync has to occur
+# before any items make it to the client and causes a long delay on startup.
+
+INITIAL_SYNC = 30
+
 #============================================
 # Probably won't need to change these.
 
@@ -84,8 +91,6 @@ class CantoFileSync(DaemonBackendPlugin):
         # Use setattributes and setconfigs commands to determine that we are the fresh
         # copy that should be synchronized.
 
-        self.sync_ts = 0;
-
         on_hook("daemon_end_loop", self.loop)
         on_hook("daemon_pre_setconfigs", self.pre_setconfigs)
         on_hook("daemon_pre_setattributes", self.pre_setattributes)
@@ -93,13 +98,15 @@ class CantoFileSync(DaemonBackendPlugin):
 
         self.reset()
 
-        # Do the initial sync
-
         # sync will grab files, check the timediff on the file if the file is
         # actually newer (like we failed to sync last time) then it will set
         # fresh_config and do a syncto.
 
-        self.cmd_sync()
+        self.sync_ts = 0
+        if (INITIAL_SYNC == 0):
+            self.cmd_sync()
+        elif (INITIAL_SYNC < INTERVAL):
+            self.sync_ts = time.time() - (INTERVAL - INITIAL_SYNC)
 
     def reset(self):
         self.fresh_config = False