From 0412a51ac6dfecc1a72b654196ecb1a599dcc94d Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Fri, 15 Feb 2019 13:35:53 +0800 Subject: [PATCH] mgr/balancer: restrict automatic balancing to specific weekdays We have implemented similar semantics for the scrub behaviour. Let's try to keep pace with that. Signed-off-by: xie xingguo --- src/pybind/mgr/balancer/module.py | 59 +++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/src/pybind/mgr/balancer/module.py b/src/pybind/mgr/balancer/module.py index 60a361e368d..54763775a6a 100644 --- a/src/pybind/mgr/balancer/module.py +++ b/src/pybind/mgr/balancer/module.py @@ -221,6 +221,22 @@ class Module(MgrModule): 'long_desc': 'This is a time of day in the format HHMM.', 'runtime': True, }, + { + 'name': 'begin_weekday', + 'type': 'uint', + 'default': 0, + 'desc': 'Restrict automatic balancing to this day of the week or later', + 'long_desc': '0 or 7 = Sunday, 1 = Monday, etc.', + 'runtime': True, + }, + { + 'name': 'end_weekday', + 'type': 'uint', + 'default': 7, + 'desc': 'Restrict automatic balancing to days of the week earlier than this', + 'long_desc': '0 or 7 = Sunday, 1 = Monday, etc.', + 'runtime': True, + }, { 'name': 'crush_compat_max_iterations', 'type': 'uint', @@ -542,24 +558,45 @@ class Module(MgrModule): self.run = False self.event.set() - def time_in_interval(self, tod, begin, end): - if begin <= end: - return tod >= begin and tod < end + def time_permit(self): + local_time = time.localtime() + time_of_day = time.strftime('%H%M', local_time) + weekday = local_time.tm_wday + permit = False + + begin_time = self.get_module_option('begin_time') + end_time = self.get_module_option('end_time') + if begin_time <= end_time: + permit = begin_time <= time_of_day < end_time + else: + permit = time_of_day >= begin_time or time_of_day < end_time + if not permit: + self.log.debug("should run between %s - %s, now %s, skipping", + begin_time, end_time, time_of_day) + return False + + begin_weekday = self.get_module_option('begin_weekday') + end_weekday = self.get_module_option('end_weekday') + if begin_weekday <= end_weekday: + permit = begin_weekday <= weekday < end_weekday else: - return tod >= begin or tod < end + permit = weekday >= begin_weekday or weekday < end_weekday + if not permit: + self.log.debug("should run between weekday %d - %d, now %d, skipping", + begin_weekday, end_weekday, weekday) + return False + + return True def serve(self): self.log.info('Starting') while self.run: self.active = self.get_module_option('active') - begin_time = self.get_module_option('begin_time') - end_time = self.get_module_option('end_time') - timeofday = time.strftime('%H%M', time.localtime()) - self.log.debug('Waking up [%s, scheduled for %s-%s, now %s]', - "active" if self.active else "inactive", - begin_time, end_time, timeofday) sleep_interval = self.get_module_option('sleep_interval') - if self.active and self.time_in_interval(timeofday, begin_time, end_time): + self.log.debug('Waking up [%s, now %s]', + "active" if self.active else "inactive", + time.strftime(TIME_FORMAT, time.localtime())) + if self.active and self.time_permit(): self.log.debug('Running') name = 'auto_%s' % time.strftime(TIME_FORMAT, time.gmtime()) osdmap = self.get_osdmap() -- 2.39.5