@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; } }
/** * 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); } }
/** * 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(); } }