def canSubmit(self, neededTime, canCurrentlySubmit): if not self._checkTimeleft(self._lowerLimit): raise UserError('Your proxy only has %d seconds left! (Required are %s)' % (self._getTimeleft(cached = True), utils.strTime(self._lowerLimit))) if not self._checkTimeleft(self._lowerLimit + neededTime) and canCurrentlySubmit: utils.vprint('Proxy lifetime (%s) does not meet the proxy and walltime (%s) requirements!' % (utils.strTime(self._getTimeleft(cached = False)), utils.strTime(self._lowerLimit + neededTime)), -1, printTime = True) utils.vprint('Disabling job submission', -1, printTime = True) return False return True
def canSubmit(self, neededTime, canCurrentlySubmit): if not self._checkTimeleft(self._lowerLimit): raise UserError('Your access token (%s) only has %d seconds left! (Required are %s)' % (self.getObjectName(), self._getTimeleft(cached = True), utils.strTime(self._lowerLimit))) if self._ignoreTime: return True if not self._checkTimeleft(self._lowerLimit + neededTime) and canCurrentlySubmit: self._logUser.warning('Access token (%s) lifetime (%s) does not meet the access and walltime (%s) requirements!' % (self.getObjectName(), utils.strTime(self._getTimeleft(cached = False)), utils.strTime(self._lowerLimit + neededTime))) self._logUser.warning('Disabling job submission') return False return True
def setupJobParameters(self, config, pm): config = config.addSections(['dataset']).addTags([self]) self.dataSplitter = None self.dataRefresh = None self.dataset = config.get('dataset', '').strip() if self.dataset == '': return config.set('se output pattern', '@NICK@_job_@MY_JOBID@_@X@', override = False) config.set('default lookup', 'DATASETNICK', override = False) defaultProvider = config.get('dataset provider', 'ListProvider') dataProvider = DataProvider.create(config, self.dataset, defaultProvider) splitterName = config.get('dataset splitter', 'FileBoundarySplitter') splitterClass = dataProvider.checkSplitter(DataSplitter.getClass(splitterName)) self.dataSplitter = splitterClass(config) self.checkSE = config.getBool('dataset storage check', True, onChange = None) # Create and register dataset parameter plugin paramSource = DataParameterSource(config.getWorkPath(), 'data', dataProvider, self.dataSplitter, self.initDataProcessor()) DataParameterSource.datasetsAvailable['data'] = paramSource # Select dataset refresh rate self.dataRefresh = config.getTime('dataset refresh', -1, onChange = None) if self.dataRefresh > 0: paramSource.resyncSetup(interval = max(self.dataRefresh, dataProvider.queryLimit())) utils.vprint('Dataset source will be queried every %s' % utils.strTime(self.dataRefresh), -1) else: paramSource.resyncSetup(interval = 0) def externalRefresh(sig, frame): paramSource.resyncSetup(force = True) signal.signal(signal.SIGUSR2, externalRefresh) if self.dataSplitter.getMaxJobs() == 0: raise UserError('There are no events to process')
def display(self): cpuTime = 0 for jobNum in self._jobs: jobObj = self._jobDB.get(jobNum) if jobObj: cpuTime += jobObj.get('runtime', 0) sys.stdout.write('Consumed wall time: %-20s' % utils.strTime(cpuTime)) sys.stdout.write('Estimated cost: $%.2f\n' % ((cpuTime / 60 / 60) * 0.1))
def _checkTimeleft(self, neededTime): # check for time left delta = time.time() - self._lastUpdate timeleft = max(0, self._getTimeleft(cached = True) - delta) # recheck proxy => after > 30min have passed or when time is running out (max every 5 minutes) if (delta > self._minQueryTime) or (timeleft < neededTime and delta > self._maxQueryTime): self._lastUpdate = time.time() timeleft = self._getTimeleft(cached = False) verbosity = QM(timeleft < neededTime, -1, 0) utils.vprint('The proxy now has %s left' % utils.strTime(timeleft), verbosity, printTime = True) return timeleft >= neededTime
def _checkTimeleft(self, neededTime): # check for time left delta = time.time() - self._lastUpdate timeleft = max(0, self._getTimeleft(cached = True) - delta) # recheck token => after > 30min have passed or when time is running out (max every 5 minutes) if (delta > self._minQueryTime) or (timeleft < neededTime and delta > self._maxQueryTime): self._lastUpdate = time.time() timeleft = self._getTimeleft(cached = False) verbosity = utils.QM(timeleft < neededTime, -1, 0) self._logUser.info('Time left for access token "%s": %s' % (self.getObjectName(), utils.strTime(timeleft))) return timeleft >= neededTime
def setupJobParameters(self, config, pm): config = config.changeView(viewClass = TaggedConfigView, addSections = ['dataset'], addTags = [self]) self.dataSplitter = None self.dataRefresh = None self._forceRefresh = config.getState('resync', detail = 'dataset', default = False) def userRefresh(config, old_obj, cur_obj, cur_entry, obj2str): if ((old_obj == '') and (cur_obj != '')): raise UserError('It is currently not possible to attach a dataset to a non-dataset task!') self._forceRefresh = True return cur_obj self.dataset = config.get('dataset', '', onChange = userRefresh).strip() if self.dataset == '': return config.set('se output pattern', '@NICK@_job_@GC_JOB_ID@_@X@') config.set('default lookup', 'DATASETNICK') defaultProvider = config.get('dataset provider', 'ListProvider') dataProvider = DataProvider.create(config, self.dataset, defaultProvider) splitterName = config.get('dataset splitter', 'FileBoundarySplitter') splitterClass = dataProvider.checkSplitter(DataSplitter.getClass(splitterName)) self.dataSplitter = splitterClass(config) # Create and register dataset parameter source paramSplitProcessor = config.getCompositePlugin('dataset processor', 'BasicDataSplitProcessor SECheckSplitProcessor', 'MultiDataSplitProcessor', cls = DataSplitProcessor).getInstance(config) paramSource = DataParameterSource(config.getWorkPath(), 'data', dataProvider, self.dataSplitter, paramSplitProcessor) DataParameterSource.datasetsAvailable['data'] = paramSource # Select dataset refresh rate self.dataRefresh = config.getTime('dataset refresh', -1, onChange = None) if self.dataRefresh > 0: paramSource.resyncSetup(interval = max(self.dataRefresh, dataProvider.queryLimit())) utils.vprint('Dataset source will be queried every %s' % utils.strTime(self.dataRefresh), -1) else: paramSource.resyncSetup(interval = 0) if self._forceRefresh: paramSource.resyncSetup(force = True) def externalRefresh(sig, frame): paramSource.resyncSetup(force = True) signal.signal(signal.SIGUSR2, externalRefresh) if self.dataSplitter.getMaxJobs() == 0: raise UserError('There are no events to process')
def _update(self, jobObj, jobNum, state, showWMS = False): if jobObj.state == state: return oldState = jobObj.state jobObj.update(state) self.jobDB.commit(jobNum, jobObj) jobNumLen = int(math.log10(max(1, len(self.jobDB))) + 1) utils.vprint('Job %s state changed from %s to %s ' % (str(jobNum).ljust(jobNumLen), Job.enum2str(oldState), Job.enum2str(state)), -1, True, False) if showWMS and jobObj.wmsId: print '(WMS:%s)' % jobObj.wmsId.split('.')[1], if (state == Job.SUBMITTED) and (jobObj.attempt > 1): print '(retry #%s)' % (jobObj.attempt - 1) elif (state == Job.QUEUED) and jobObj.get('dest') != 'N/A': print '(%s)' % jobObj.get('dest') elif (state in [Job.WAITING, Job.ABORTED, Job.DISABLED]) and jobObj.get('reason'): print '(%s)' % jobObj.get('reason') elif (state == Job.SUCCESS) and jobObj.get('runtime', None) != None: print '(runtime %s)' % utils.strTime(utils.QM(jobObj.get('runtime') != '', jobObj.get('runtime'), 0)) elif (state == Job.FAILED): msg = [] if jobObj.get('retcode'): msg.append('error code: %d' % jobObj.get('retcode')) try: if utils.verbosity() > 0: msg.append(self._task.errorDict[jobObj.get('retcode')]) except Exception: pass if jobObj.get('dest'): msg.append(jobObj.get('dest')) if len(msg): print '(%s)' % str.join(' - ', msg), print else: print