def initializeHandler( cls, serviceInfoDict ):
   try:
     from DIRAC.WorkloadManagementSystem.DB.JobDB import JobDB
     cls.__jobDB = JobDB()
   except Exception as excp:
     return S_ERROR( "Could not connect to JobDB: %s" % str( excp ) )
   cls.setFailedOnTooFrozen( False )
   cls.setFreezeOnFailedDispatch( False )
   cls.setFreezeOnUnknownExecutor( False )
   cls.setAllowedClients( "JobManager" )
   JobState.checkDBAccess()
   JobState.cleanTaskQueues()
   period = cls.srv_getCSOption( "LoadJobPeriod", 60 )
   result = ThreadScheduler.gThreadScheduler.addPeriodicTask( period, cls.__loadJobs )
   if not result[ 'OK' ]:
     return result
   cls.__loadTaskId = result[ 'Value' ]
   return cls.__loadJobs()
Example #2
0
 def initializeHandler(cls, serviceInfoDict):
     try:
         from DIRAC.WorkloadManagementSystem.DB.JobDB import JobDB
         cls.__jobDB = JobDB()
     except Exception as excp:
         return S_ERROR("Could not connect to JobDB: %s" % str(excp))
     cls.setFailedOnTooFrozen(False)
     cls.setFreezeOnFailedDispatch(False)
     cls.setFreezeOnUnknownExecutor(False)
     cls.setAllowedClients("JobManager")
     JobState.checkDBAccess()
     JobState.cleanTaskQueues()
     period = cls.srv_getCSOption("LoadJobPeriod", 60)
     result = ThreadScheduler.gThreadScheduler.addPeriodicTask(
         period, cls.__loadJobs)
     if not result['OK']:
         return result
     cls.__loadTaskId = result['Value']
     return cls.__loadJobs()
Example #3
0
class OptimizationMindHandler( ExecutorMindHandler ):

  __jobDB = False
  __optimizationStates = [ 'Received', 'Checking' ]
  __loadTaskId = False

  MSG_DEFINITIONS = { 'OptimizeJobs' : { 'jids' : ( types.ListType, types.TupleType ) } }

  auth_msg_OptimizeJobs = [ 'all' ]
  def msg_OptimizeJobs( self, msgObj ):
    jids = msgObj.jids
    for jid in jids:
      try:
        jid = int( jid )
      except ValueError:
        self.log.error( "Job ID %s has to be an integer" % jid )
        continue
      #Forget and add task to ensure state is reset
      self.forgetTask( jid )
      result = self.executeTask( jid, CachedJobState( jid ) )
      if not result[ 'OK' ]:
        self.log.error( "Could not add job %s to optimization: %s" % ( jid, result[ 'Value' ] ) )
      else:
        self.log.info( "Received new job %s" % jid )
    return S_OK()

  @classmethod
  def __loadJobs( cls, eTypes = None ):
    log = cls.log
    if cls.__loadTaskId:
      period = cls.srv_getCSOption( "LoadJobPeriod", 300 )
      ThreadScheduler.gThreadScheduler.setTaskPeriod( cls.__loadTaskId, period )
    if not eTypes:
      eConn = cls.getExecutorsConnected()
      eTypes = [ eType for eType in eConn if eConn[ eType ] > 0 ]
    if not eTypes:
      log.info( "No optimizer connected. Skipping load" )
      return S_OK()
    log.info( "Getting jobs for %s" % ",".join( eTypes ) )
    checkingMinors = [ eType.split("/")[1] for eType in eTypes if eType != "WorkloadManagement/JobPath" ]
    for opState in cls.__optimizationStates:
      #For Received states
      if opState == "Received":
        if 'WorkloadManagement/JobPath' not in eTypes:
          continue
        jobCond = { 'Status' : opState }
      #For checking states
      if opState == "Checking":
        if not checkingMinors:
          continue
        jobCond = { 'Status': opState, 'MinorStatus' : checkingMinors }
      #Do the magic
      jobTypeCondition = cls.srv_getCSOption( "JobTypeRestriction", [] )
      if jobTypeCondition:
        jobCond[ 'JobType' ] = jobTypeCondition
      result = cls.__jobDB.selectJobs( jobCond, limit = cls.srv_getCSOption( "JobQueryLimit", 10000 ) )
      if not result[ 'OK' ]:
        return result
      jidList = result[ 'Value' ]
      knownJids = cls.getTaskIds()
      added = 0
      for jid in jidList:
        jid = long( jid )
        if jid not in knownJids:
          #Same as before. Check that the state is ok.
          cls.executeTask( jid, CachedJobState( jid ) )
          added += 1
      log.info( "Added %s/%s jobs for %s state" % ( added, len( jidList ), opState ) )
    return S_OK()

  @classmethod
  def initializeHandler( cls, serviceInfoDict ):
    try:
      from DIRAC.WorkloadManagementSystem.DB.JobDB import JobDB
      cls.__jobDB = JobDB()
    except Exception, excp:
      return S_ERROR( "Could not connect to JobDB: %s" % str( excp ) )
    cls.setFailedOnTooFrozen( False )
    cls.setFreezeOnFailedDispatch( False )
    cls.setFreezeOnUnknownExecutor( False )
    cls.setAllowedClients( "JobManager" )
    JobState.checkDBAccess()
    JobState.cleanTaskQueues()
    period = cls.srv_getCSOption( "LoadJobPeriod", 60 )
    result = ThreadScheduler.gThreadScheduler.addPeriodicTask( period, cls.__loadJobs )
    if not result[ 'OK' ]:
      return result
    cls.__loadTaskId = result[ 'Value' ]
    return cls.__loadJobs()