delay starting, based on from status file

This commit is contained in:
bigeagle 2014-12-08 15:58:19 +08:00
parent eecd8628cc
commit c4c6d44987
4 changed files with 41 additions and 6 deletions

View File

@ -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:

View File

@ -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):

View File

@ -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")

View File

@ -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(