Exemple #1
0
  def submitJob(self, executableFile, proxy, **kwargs):
    """ Method to submit job.

    :param str executableFile: location of the executable file
    :param str proxy: payload proxy

    :return: S_OK/S_ERROR of the result of the job submission
    """

    if self.pPool is None:
      self.pPool = ProcessPool(minSize=self.processors,
                               maxSize=self.processors,
                               poolCallback=self.finalizeJob)

    self.pPool.processResults()

    processorsForJob = self._getProcessorsForJobs(kwargs)
    if not processorsForJob:
      return S_ERROR('Not enough processors for the job')

    # Now persisiting the job limits for later use in pilot.cfg file (pilot 3 default)
    cd = ConfigurationData(loadDefaultCFG=False)
    res = cd.loadFile('pilot.cfg')
    if not res['OK']:
      self.log.error("Could not load pilot.cfg", res['Message'])
    # only NumberOfProcessors for now, but RAM (or other stuff) can also be added
    jobID = int(kwargs.get('jobDesc', {}).get('jobID', 0))
    cd.setOptionInCFG('/Resources/Computing/JobLimits/%d/NumberOfProcessors' % jobID, processorsForJob)
    res = cd.dumpLocalCFGToFile('pilot.cfg')
    if not res['OK']:
      self.log.error("Could not dump cfg to pilot.cfg", res['Message'])

    ret = getProxyInfo()
    if not ret['OK']:
      pilotProxy = None
    else:
      pilotProxy = ret['Value']['path']
    self.log.notice('Pilot Proxy:', pilotProxy)

    kwargs = {'UseSudo': False}
    if self.useSudo:
      for nUser in range(MAX_NUMBER_OF_SUDO_UNIX_USERS):
        if nUser not in self.userNumberPerTask.values():
          break
      kwargs['NUser'] = nUser
      kwargs['PayloadUser'] = os.environ['USER'] + 'p%s' % str(nUser).zfill(2)
      kwargs['UseSudo'] = True

    result = self.pPool.createAndQueueTask(executeJob,
                                           args=(executableFile, proxy, self.taskID),
                                           kwargs=kwargs,
                                           taskID=self.taskID,
                                           usePoolCallbacks=True)
    self.processorsPerTask[self.taskID] = processorsForJob
    self.taskID += 1

    self.pPool.processResults()

    return result
    def submitJob(self, executableFile, proxy=None, inputs=None, **kwargs):
        """Method to submit job.
        This method will submit to a ProcessPoolExecutor, which returns Future objects.

        :param str executableFile: location of the executable file
        :param str proxy: payload proxy
        :param list inputs: dependencies of executableFile

        :return: S_OK/S_ERROR of the result of the job submission
        """

        if self.pPool is None:
            self.pPool = concurrent.futures.ProcessPoolExecutor(
                max_workers=self.processors)

        processorsForJob = self._getProcessorsForJobs(kwargs)
        if not processorsForJob:
            return S_ERROR("Not enough processors for the job")

        # Now persisting the job limits for later use in pilot.cfg file (pilot 3 default)
        cd = ConfigurationData(loadDefaultCFG=False)
        res = cd.loadFile("pilot.cfg")
        if not res["OK"]:
            self.log.error("Could not load pilot.cfg", res["Message"])
        else:
            # only NumberOfProcessors for now, but RAM (or other stuff) can also be added
            jobID = int(kwargs.get("jobDesc", {}).get("jobID", 0))
            cd.setOptionInCFG(
                "/Resources/Computing/JobLimits/%d/NumberOfProcessors" % jobID,
                processorsForJob)
            res = cd.dumpLocalCFGToFile("pilot.cfg")
            if not res["OK"]:
                self.log.error("Could not dump cfg to pilot.cfg",
                               res["Message"])

        # Here we define task kwargs: adding complex objects like thread.Lock can trigger errors in the task
        taskKwargs = {"InnerCESubmissionType": self.innerCESubmissionType}
        if self.innerCESubmissionType == "Sudo":
            for nUser in range(MAX_NUMBER_OF_SUDO_UNIX_USERS):
                if nUser not in self.userNumberPerTask.values():
                    break
            taskKwargs["NUser"] = nUser
            if "USER" in os.environ:
                taskKwargs["PayloadUser"] = os.environ["USER"] + "p%s" % str(
                    nUser).zfill(2)

        future = self.pPool.submit(executeJob, executableFile, proxy,
                                   self.taskID, inputs, **taskKwargs)
        self.processorsPerTask[future] = processorsForJob
        self.taskID += 1
        future.add_done_callback(self.finalizeJob)

        return S_OK()  # returning S_OK as callback will do the rest