]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mgr/balancer: restrict automatic balancing to specific weekdays
authorxie xingguo <xie.xingguo@zte.com.cn>
Fri, 15 Feb 2019 05:35:53 +0000 (13:35 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Mon, 18 Feb 2019 01:14:07 +0000 (09:14 +0800)
We have implemented similar semantics for the scrub behaviour.
Let's try to keep pace with that.

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
src/pybind/mgr/balancer/module.py

index 60a361e368da551852f78d63509f42f6518ff203..54763775a6a736cfe4fd1a9e1e2f93fada4960e2 100644 (file)
@@ -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()