def recreateOutputOperations(cls, pool): """ __recreateOutputOperations__ recreate interrupted get output operations. Two types of operations can be in interrupted states: 1) operations that have been requested but never performed, and 2) operations that have been performed but never processed (meaning that output was retrieved but no messages were sent based on it). """ logging.debug("Recreating interrupted operations") try : # open database bossLiteSession = \ BossLiteAPI('MySQL', pool=cls.params['sessionPool']) # get interrupted operations jobs = bossLiteSession.loadJobsByRunningAttr( { 'processStatus' : 'in_progress' } ) jobs.extend( bossLiteSession.loadJobsByRunningAttr( { 'processStatus' : 'output_retrieved' } ) ) except DbError, msg: logging.error('Error updating DB : %s ' % str(msg))
class PilotBossMonitor(MonitorInterface): """ _PilotBossMonitor_ """ def __init__(self, schedType, **args): """ __init__ """ self.schedType = schedType self.bossTask = None self.scheduler = None self.counters = ['pending', 'submitted', 'waiting', 'ready', \ 'scheduled', 'running', 'cleared', 'created', 'other'] print dbConfig self.bossLiteSession = BossLiteAPI('MySQL', dbConfig, makePool=True) self.sessionPool = self.bossLiteSession.bossLiteDB.getPool() self.db = TrackingDB( self.bossLiteSession.bossLiteDB ) def monitorPilot(self, site, tqStateApi): """ __monitorPilot__ This fnction will submit pilot jobs using the selected mechanism """ if ( self.schedType == 'LSF' ): #schedConfig = {'user_proxy' : '', 'service' : '', 'config' : '' } schedConfig = {'cpCmd': 'rfcp', 'rfioSer': '%s:' % self.host} #self.scheduler = Scheduler.Scheduler('SchedulerLsf', schedConfig) poller = PABossLitePoll() poller() total = poller.pilotJobs #start the logic here def getGroups(self, group): tasks = self.db.getGroupTasks(group) for taskId in tasks : print taskId def getStatistic(self): """ __getStatistics__ Poll the BOSS DB for a summary of the job status """ # summary of the jobs in the DB result = self.db.getJobsStatistic() if result is not None: counter = {} for ctr in self.counters: counter[ctr] = 0 for pair in result : status, count = pair if status == 'E': continue elif status == 'R' : counter['running'] = count elif status == 'I': counter['pending'] = count elif status == 'SW' : counter['waiting'] = count elif status == 'SR': counter['ready'] = count elif status == 'SS': counter['scheduled'] = count elif status == 'SU': counter['submitted'] = count elif status == 'SE': counter['cleared'] = count elif status == 'C': counter['created'] = count else: counter['other'] += count # display counters for ctr, value in counter.iteritems(): print(ctr + " jobs : " + str(value)) print("....................") return result def pollJobs(self, runningAttrs, processStatus, skipStatus=None ): """ __pollJobs__ basic structure for jobs polling """ offset = 0 loop = True while loop : logging.debug("Max jobs to be loaded %s:%s " % \ (str( offset ), str( offset + self.jobLimit) ) ) self.newJobs = self.bossLiteSession.loadJobsByRunningAttr( runningAttrs=runningAttrs, \ limit=self.jobLimit, offset=offset ) logging.info("Polled jobs : " + str( len(self.newJobs) ) ) # exit if no more jobs to query if self.newJobs == [] : loop = False break else : offset += self.jobLimit try: self.db.processBulkUpdate( self.newJobs, processStatus, \ skipStatus ) logging.info( "Changed status to %s for %s loaded jobs" \ % ( processStatus, str( len(self.newJobs) ) ) ) except BossLiteError, err: logging.error( "Failed handling %s loaded jobs, waiting next round: %s" \ % ( processStatus, str( err ) ) ) continue