Browse Source

delay starting, based on from status file

bigeagle 10 years ago
parent
commit
c4c6d44987
4 changed files with 41 additions and 6 deletions
  1. 8 0
      tunasync/jobs.py
  2. 11 0
      tunasync/mirror_config.py
  3. 5 0
      tunasync/mirror_provider.py
  4. 17 6
      tunasync/status_manager.py

+ 8 - 0
tunasync/jobs.py

@@ -19,6 +19,14 @@ def run_job(sema, child_q, manager_q, provider, **settings):
         sys.exit(0)
         sys.exit(0)
 
 
     signal.signal(signal.SIGTERM, before_quit)
     signal.signal(signal.SIGTERM, before_quit)
+    if provider.delay > 0:
+        try:
+            msg = child_q.get(timeout=provider.delay)
+            if msg == "terminate":
+                manager_q.put(("CONFIG_ACK", (provider.name, "QUIT")))
+                return
+        except Queue.Empty:
+            pass
 
 
     max_retry = settings.get("max_retry", 1)
     max_retry = settings.get("max_retry", 1)
     while 1:
     while 1:

+ 11 - 0
tunasync/mirror_config.py

@@ -1,6 +1,7 @@
 #!/usr/bin/env python2
 #!/usr/bin/env python2
 # -*- coding:utf-8 -*-
 # -*- coding:utf-8 -*-
 import os
 import os
+from datetime import datetime
 from .mirror_provider import RsyncProvider, ShellProvider
 from .mirror_provider import RsyncProvider, ShellProvider
 from .btrfs_snapshot import BtrfsHook
 from .btrfs_snapshot import BtrfsHook
 from .loglimit import LogLimitHook
 from .loglimit import LogLimitHook
@@ -83,6 +84,16 @@ class MirrorConfig(object):
                 hooks=hooks
                 hooks=hooks
             )
             )
 
 
+        sm = self._parent.status_manager
+        last_update = sm.get_info(self.name, 'last_update')
+        if last_update not in (None, '-'):
+            last_update = datetime.strptime(last_update, '%Y-%m-%d %H:%M:%S')
+            delay = int(last_update.strftime("%s")) \
+                + self.interval * 60 - int(datetime.now().strftime("%s"))
+            if delay < 0:
+                delay = 0
+            provider.set_delay(delay)
+
         return provider
         return provider
 
 
     def compare(self, other):
     def compare(self, other):

+ 5 - 0
tunasync/mirror_provider.py

@@ -19,6 +19,7 @@ class MirrorProvider(object):
         self.interval = interval
         self.interval = interval
         self.hooks = hooks
         self.hooks = hooks
         self.p = None
         self.p = None
+        self.delay = 0
 
 
     # deprecated
     # deprecated
     def ensure_log_dir(self):
     def ensure_log_dir(self):
@@ -35,6 +36,10 @@ class MirrorProvider(object):
             ctx['log_file'] = log_file
             ctx['log_file'] = log_file
         return log_file
         return log_file
 
 
+    def set_delay(self, sec):
+        ''' Set start delay '''
+        self.delay = sec
+
     def run(self, ctx={}):
     def run(self, ctx={}):
         raise NotImplementedError("run method should be implemented")
         raise NotImplementedError("run method should be implemented")
 
 

+ 17 - 6
tunasync/status_manager.py

@@ -27,6 +27,19 @@ class StatusManager(object):
                 }
                 }
         self.mirrors = mirrors
         self.mirrors = mirrors
 
 
+    def get_info(self, name, key):
+        _m = self.mirrors.get(name, {})
+        return _m.get(key, None)
+
+    def update_info(self, name, key, value):
+        _m = self.mirrors.get(name, {
+            'name': name,
+            'last_update': '-',
+            'status': '-',
+        })
+        _m[key] = value
+        self.mirrors[name] = dict(_m.items())
+
     def update_status(self, name, status):
     def update_status(self, name, status):
 
 
         _m = self.mirrors.get(name, {
         _m = self.mirrors.get(name, {
@@ -42,16 +55,14 @@ class StatusManager(object):
         else:
         else:
             print("Invalid status: {}, from {}".format(status, name))
             print("Invalid status: {}, from {}".format(status, name))
 
 
-        self.mirrors[name] = {
-            'name': name,
-            'last_update': update_time,
-            'status': status,
-        }
+        _m['last_update'] = update_time
+        _m['status'] = status
+        self.mirrors[name] = dict(_m.items())
 
 
         with open(self.dbfile, 'wb') as f:
         with open(self.dbfile, 'wb') as f:
             _mirrors = self.list_status()
             _mirrors = self.list_status()
             print("Updated status file, {}:{}".format(name, status))
             print("Updated status file, {}:{}".format(name, status))
-            json.dump(_mirrors, f)
+            json.dump(_mirrors, f, indent=2, separators=(',', ':'))
 
 
     def list_status(self, _format=False):
     def list_status(self, _format=False):
         _mirrors = sorted(
         _mirrors = sorted(