Ejemplo n.º 1
0
  @Override
  protected void processRequest(final DaemonRequest request) {
    final GridWorkPacket gridWorkPacket =
        getBaseGridWorkPacket(gridScriptFactory.getApplicationName(wrapperScript));
    final File sgePacketFile =
        new File(getSharedTempDirectory(), queueName + "_" + uniqueId.incrementAndGet());

    try {
      final SgeMessageListener allocatorListener = new SgeMessageListener(request);
      final SgePacket sgePacket =
          new SgePacket(
              serviceFactory.serializeRequest(
                  request.getWorkPacket(), getDaemon().getResponseDispatcher(), allocatorListener),
              daemonConnection.getConnectionName(),
              fileTokenFactory.getDaemonConfigInfo(),
              getDaemonLoggerFactory().getLogFolder());

      writeWorkerAllocatorInputObject(sgePacketFile, sgePacket);

      final List<String> parameters = gridScriptFactory.getParameters(wrapperScript, sgePacketFile);
      gridWorkPacket.setParameters(parameters);

      // Set our own listener to the work packet progress. When the packet returns, the execution
      // will be resumed
      final MyWorkPacketStateListener listener =
          new MyWorkPacketStateListener(request, sgePacketFile, allocatorListener);
      gridWorkPacket.setListener(listener);
      gridWorkPacket.setPriority(request.getWorkPacket().getPriority());
      // Run the job
      final String requestId = manager.passToGridEngine(gridWorkPacket);

      // Report the information about the running task to the caller, making sure they get the task
      // id and the logs
      final AssignedTaskData data = new AssignedTaskData(requestId);

      final RunnerProgressReporter reporter = new RunnerProgressReporter(this, request);

      // Report the assigned ID
      reporter.reportProgress(data);

      final ParentLog log =
          getDaemonLoggerFactory().createLog(request.getWorkPacket().getTaskId(), reporter);

      // Report that we spawned a child with its own SGE log, we use the SGE-based log paths for
      // this
      log.createChildLog(
          gridWorkPacket.getOutputLogFilePath(), gridWorkPacket.getErrorLogFilePath());

      // We are not done yet! The grid work packet's progress listener will get called when the
      // state of the task changes,
      // and either mark the task failed or successful.
    } catch (Exception t) {
      final DaemonException daemonException = processFailedJob(gridWorkPacket, sgePacketFile, t);
      sendResponse(request, daemonException, true);
      throw daemonException;
    }
  }
Ejemplo n.º 2
0
  /**
   * Send response to the client. Ignore exceptions.
   *
   * @param response Response to be sent.
   */
  protected void sendResponse(
      final DaemonRequest request, final Serializable response, final boolean isLast) {
    try {
      if (isLast) {
        requestCount.decrementAndGet();

        synchronized (requestCount) {
          requestCount.notifyAll();
        }
      }

      if (response instanceof DaemonProgressMessage) {
        final DaemonProgressMessage daemonProgressMessage = (DaemonProgressMessage) response;
        // If response if a FileTokenHolder, set FileTokenFactory and force regenerating FileTokens.
        if (daemonProgressMessage.getProgressData() instanceof FileTokenHolder) {
          ((FileTokenHolder) daemonProgressMessage.getProgressData())
              .translateOnSender(getDaemonConnection().getFileTokenFactory());
        }
      }

      // This is the last response we will send - error occurred
      request.sendResponse(response, isLast);
    } catch (MprcException e1) {
      // SWALLOWED: We try to keep running even if we cannot report we failed translating the
      // message.
      LOGGER.error(
          "Ignored error: failed following response to client: '" + response.toString() + "'", e1);
    }
  }
Ejemplo n.º 3
0
  /**
   * Called synchronously when the daemon receives a new request.
   *
   * @param request
   */
  private void requestReceived(final DaemonRequest request) {
    if (!isEnabled()) {
      return;
    }
    try {
      NDC.push(request.getWorkPacket().getTaskId().toString());
      requestCount.incrementAndGet();

      sendResponse(request, new DaemonProgressMessage(DaemonProgress.RequestEnqueued), false);
      processRequest(request);
    } finally {
      NDC.pop();
    }
  }