From c4c6d4498759b4a0e01c1fa00c879065d3f1dccd Mon Sep 17 00:00:00 2001 From: bigeagle Date: Mon, 8 Dec 2014 15:58:19 +0800 Subject: [PATCH] delay starting, based on from status file --- tunasync/jobs.py | 8 ++++++++ tunasync/mirror_config.py | 11 +++++++++++ tunasync/mirror_provider.py | 5 +++++ tunasync/status_manager.py | 23 +++++++++++++++++------ 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/tunasync/jobs.py b/tunasync/jobs.py index 451a456..280c4f1 100644 --- a/tunasync/jobs.py +++ b/tunasync/jobs.py @@ -19,6 +19,14 @@ def run_job(sema, child_q, manager_q, provider, **settings): sys.exit(0) 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) while 1: diff --git a/tunasync/mirror_config.py b/tunasync/mirror_config.py index a688c02..21c6687 100644 --- a/tunasync/mirror_config.py +++ b/tunasync/mirror_config.py @@ -1,6 +1,7 @@ #!/usr/bin/env python2 # -*- coding:utf-8 -*- import os +from datetime import datetime from .mirror_provider import RsyncProvider, ShellProvider from .btrfs_snapshot import BtrfsHook from .loglimit import LogLimitHook @@ -83,6 +84,16 @@ class MirrorConfig(object): 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 def compare(self, other): diff --git a/tunasync/mirror_provider.py b/tunasync/mirror_provider.py index 955388c..38cb843 100644 --- a/tunasync/mirror_provider.py +++ b/tunasync/mirror_provider.py @@ -19,6 +19,7 @@ class MirrorProvider(object): self.interval = interval self.hooks = hooks self.p = None + self.delay = 0 # deprecated def ensure_log_dir(self): @@ -35,6 +36,10 @@ class MirrorProvider(object): ctx['log_file'] = log_file return log_file + def set_delay(self, sec): + ''' Set start delay ''' + self.delay = sec + def run(self, ctx={}): raise NotImplementedError("run method should be implemented") diff --git a/tunasync/status_manager.py b/tunasync/status_manager.py index e323f00..dc0cced 100644 --- a/tunasync/status_manager.py +++ b/tunasync/status_manager.py @@ -27,6 +27,19 @@ class StatusManager(object): } 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): _m = self.mirrors.get(name, { @@ -42,16 +55,14 @@ class StatusManager(object): else: 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: _mirrors = self.list_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): _mirrors = sorted(