コード例 #1
0
ファイル: clock.py プロジェクト: colin-zhou/reserve
    def __init__(self):
        super(self.__class__, self).__init__()
        # sync clock while restart or in the midnight
        try:
            self.base_time_diff = datetime.timedelta(0)
            self.base_host = cfg.BASE_TIME_SERVER
            self.pre_snapshot = {}
            self.adjust_day = None

            self.clock_diff = {}
            self.clock_diff[self.base_host] = datetime.timedelta(0)

            self.redis_host_set = MessageSet(cfg.AGENT_OSS_HOSTS)
            self.redis_hash_map = MessageHashMap(cfg.AGENT_OSS_CLOCK)

            self.running = True
            self.cycle = cfg.CLOCK_QUERY_SYCLE
        except:
            Log.error('error happened')
コード例 #2
0
ファイル: clock.py プロジェクト: colin-zhou/reserve
class ScanServerClock(threading.Thread):
    """scan server clock interval to check the delay time"""
    # default scan cycle is 0.2 second
    def __init__(self):
        super(self.__class__, self).__init__()
        # sync clock while restart or in the midnight
        try:
            self.base_time_diff = datetime.timedelta(0)
            self.base_host = cfg.BASE_TIME_SERVER
            self.pre_snapshot = {}
            self.adjust_day = None

            self.clock_diff = {}
            self.clock_diff[self.base_host] = datetime.timedelta(0)

            self.redis_host_set = MessageSet(cfg.AGENT_OSS_HOSTS)
            self.redis_hash_map = MessageHashMap(cfg.AGENT_OSS_CLOCK)

            self.running = True
            self.cycle = cfg.CLOCK_QUERY_SYCLE
        except:
            Log.error('error happened')

    def get_clock_diff(self, host=None):
        if not host:
            return self.clock_diff
        if host in self.clock_diff:
            return self.clock_diff[host]
        return None

    def adjust_basediff(self, unix_timestamp):
        local_basetime = datetime.datetime.fromtimestamp(float(unix_timestamp) / 1000)
        now = datetime.datetime.now()
        self.base_time_diff = local_basetime - now

    def clock_updated(self, host, timestamp):
        if host in self.pre_snapshot and self.pre_snapshot[host] == timestamp:
            return False
        self.pre_snapshot[host] = timestamp
        return True

    def calc_clock_diff(self, local_time, host_time):
        relative_time = local_time + self.base_time_diff
        return relative_time - host_time

    def scan_server_clock(self):
        scan_time = datetime.datetime.now()
        hosts = self.redis_host_set.get_msg()
        for host in hosts:
            host_clock = self.redis_hash_map.get_msg(host)
            # host_clock not exist
            if not host_clock:
                self.clock_diff[host] = None
            # adjust time once a day
            elif host == self.base_host:
                if self.ajust_day != scan_time.day:
                    if self.clock_updated(host, host_clock):
                        self.adjust_day = scan_time.day
                        self.adjust_basediff(host_clock)
            # one check-server clock updated
            elif self.clock_updated(host, host_clock):
                host_clock = datetime.datetime.fromtimestamp(float(host_clock) / 1000)
                self.clock_diff[host] = self.calc_clock_diff(scan_time,
                                                             host_clock)
        # clear host not in redis-hosts or redis-clock
        to_del_host = []
        for exist_host in self.clock_diff:
            if exist_host not in hosts:
                to_del_host.append(exist_host)

    def stop(self):
        self.running = False

    def run(self):
        while self.running:
            self.scan_server_clock()
            time.sleep(self.cycle)