1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16  from twisted.internet import defer 
 17  from twisted.application import service 
 18  from twisted.python import log, reflect 
 19  from buildbot.process import metrics 
 20  from buildbot import config, util 
 21   
 22 -class SchedulerManager(config.ReconfigurableServiceMixin, 
 23                         service.MultiService): 
  28   
 29      @defer.deferredGenerator 
 31          timer = metrics.Timer("SchedulerManager.reconfigService") 
 32          timer.start() 
 33   
 34          old_by_name = dict((sch.name, sch) for sch in self) 
 35          old_set = set(old_by_name.iterkeys()) 
 36          new_by_name = new_config.schedulers 
 37          new_set = set(new_by_name.iterkeys()) 
 38   
 39          removed_names, added_names = util.diffSets(old_set, new_set) 
 40   
 41           
 42           
 43           
 44           
 45           
 46          for n in old_set & new_set: 
 47              old = old_by_name[n] 
 48              new = new_by_name[n] 
 49               
 50              if reflect.qual(old.__class__) != reflect.qual(new.__class__): 
 51                  removed_names.add(n) 
 52                  added_names.add(n) 
 53   
 54               
 55              elif not hasattr(old, 'reconfigService'): 
 56                  if old != new: 
 57                      removed_names.add(n) 
 58                      added_names.add(n) 
 59   
 60           
 61   
 62          for sch_name in removed_names: 
 63              log.msg("removing scheduler '%s'" % (sch_name,)) 
 64              sch = old_by_name[sch_name] 
 65              wfd = defer.waitForDeferred( 
 66                      defer.maybeDeferred(lambda : 
 67                          sch.disownServiceParent())) 
 68              yield wfd 
 69              wfd.getResult() 
 70              sch.master = None 
 71   
 72           
 73   
 74          for sch_name in added_names: 
 75              log.msg("adding scheduler '%s'" % (sch_name,)) 
 76              sch = new_by_name[sch_name] 
 77   
 78               
 79              class_name = '%s.%s' % (sch.__class__.__module__, 
 80                                      sch.__class__.__name__) 
 81              wfd = defer.waitForDeferred( 
 82                  self.master.db.state.getObjectId( 
 83                      sch.name, class_name)) 
 84              yield wfd 
 85              objectid = wfd.getResult() 
 86   
 87               
 88              sch.objectid = objectid 
 89              sch.master = self.master 
 90   
 91               
 92              sch.setServiceParent(self) 
 93   
 94          metrics.MetricCountEvent.log("num_schedulers", len(list(self)), 
 95                                      absolute=True) 
 96   
 97           
 98          wfd = defer.waitForDeferred( 
 99              config.ReconfigurableServiceMixin.reconfigService(self, 
100                                                      new_config)) 
101          yield wfd 
102          wfd.getResult() 
103   
104          timer.stop() 
  105