@SuppressFBWarnings("DM_EXIT") public void sendStatusUpdate(ExecutorDriver driver, Protos.TaskID taskID, Protos.TaskState taskState, String message, Logger logger) { logger.info("Sending status update \"{}\" ({})", message, taskState.name()); message = message.substring(0, Math.min(configuration.getMaxTaskMessageLength(), message.length())); try { final Protos.TaskStatus.Builder builder = Protos.TaskStatus.newBuilder() .setTaskId(taskID) .setState(taskState) .setMessage(message); driver.sendStatusUpdate(builder.build()); } catch (Throwable t) { try { logger.error("Exception while sending status updates, exiting", t); } finally { System.exit(4); } } }
private void onRuntimeError() { // Shutdown REEF Evaluator if (this.evaluatorProcess != null) { this.evaluatorProcess.destroy(); } mesosExecutorDriver.sendStatusUpdate(TaskStatus.newBuilder() .setTaskId(TaskID.newBuilder() .setValue(mesosExecutorId) .build()) .setState(TaskState.TASK_FAILED) .setMessage("Evaluator Process exited with status " + String.valueOf(evaluatorProcessExitValue)) .build()); // Shutdown Mesos Executor this.executorService.shutdown(); this.mesosExecutorDriver.stop(); }
@Override public CassandraTaskStatus createStatus(Protos.TaskState state, Optional<String> message) { Protos.TaskStatus.Builder builder = getStatusBuilder(); if (message.isPresent()) { builder.setMessage(message.get()); } return TemplateTaskStatus.create(builder .setData(CassandraData.createTemplateData().getBytes()) .setState(state) .build()); }
@Override public void launchTask(ExecutorDriver driver, TaskInfo task) { try { int port = _taskAssignments.register(task.getTaskId()); LOG.info("Executor {} received task assignment for port {}. Mesos TaskID: {}", _executorId, port, task.getTaskId().getValue()); } catch (IllegalArgumentException e) { String msg = String.format("launchTask: failed to register task. " + "Exception: %s Halting supervisor process.", e.getMessage()); LOG.error(msg); TaskStatus status = TaskStatus.newBuilder() .setState(TaskState.TASK_FAILED) .setTaskId(task.getTaskId()) .setMessage(msg) .build(); driver.sendStatusUpdate(status); Runtime.getRuntime().halt(1); } LOG.info("Received task assignment for TaskID: {} ", task.getTaskId().getValue()); TaskStatus status = TaskStatus.newBuilder() .setState(TaskState.TASK_RUNNING) .setTaskId(task.getTaskId()) .build(); driver.sendStatusUpdate(status); }
@Override public void run() { Thread.currentThread().setContextClassLoader(TaskThread.class.getClassLoader()); executorDriver.sendStatusUpdate(Protos.TaskStatus.newBuilder().setTaskId(taskInfo.getTaskId()).setState(Protos.TaskState.TASK_RUNNING).build()); Map<String, Object> data = SerializationUtils.deserialize(taskInfo.getData().toByteArray()); ShardingContexts shardingContexts = (ShardingContexts) data.get("shardingContext"); @SuppressWarnings("unchecked") JobConfigurationContext jobConfig = new JobConfigurationContext((Map<String, String>) data.get("jobConfigContext")); try { ElasticJob elasticJob = getElasticJobInstance(jobConfig); final CloudJobFacade jobFacade = new CloudJobFacade(shardingContexts, jobConfig, jobEventBus); if (jobConfig.isTransient()) { JobExecutorFactory.getJobExecutor(elasticJob, jobFacade).execute(); executorDriver.sendStatusUpdate(Protos.TaskStatus.newBuilder().setTaskId(taskInfo.getTaskId()).setState(Protos.TaskState.TASK_FINISHED).build()); } else { new DaemonTaskScheduler(elasticJob, jobConfig, jobFacade, executorDriver, taskInfo.getTaskId()).init(); } // CHECKSTYLE:OFF } catch (final Throwable ex) { // CHECKSTYLE:ON log.error("Elastic-Job-Cloud-Executor error", ex); executorDriver.sendStatusUpdate(Protos.TaskStatus.newBuilder().setTaskId(taskInfo.getTaskId()).setState(Protos.TaskState.TASK_ERROR).setMessage(ExceptionUtil.transform(ex)).build()); executorDriver.stop(); throw ex; } }
private void onStop() { // Shutdown REEF Evaluator if (this.evaluatorProcess != null) { this.evaluatorProcess.destroy(); mesosExecutorDriver.sendStatusUpdate(TaskStatus.newBuilder() .setTaskId(TaskID.newBuilder() .setValue(mesosExecutorId) .build()) .setState(TaskState.TASK_FINISHED) .setMessage("Evaluator Process exited with status " + String.valueOf(evaluatorProcessExitValue)) .build()); } else { mesosExecutorDriver.sendStatusUpdate(TaskStatus.newBuilder() .setTaskId(TaskID.newBuilder() .setValue(mesosExecutorId) .build()) .setState(TaskState.TASK_FINISHED) .setData(ByteString.copyFromUtf8("eval_not_run")) // TODO[JIRA REEF-102]: a hack to pass closeEvaluator test, replace this with a better interface .setMessage("Evaluator Process exited with status " + String.valueOf(evaluatorProcessExitValue)) .build()); } // Shutdown Mesos Executor this.executorService.shutdown(); this.mesosExecutorDriver.stop(); }
@Override public void run() { executorDriver.sendStatusUpdate(Protos.TaskStatus.newBuilder().setTaskId(taskInfo.getTaskId()).setState(Protos.TaskState.TASK_RUNNING).build()); Map<String, Object> data = SerializationUtils.deserialize(taskInfo.getData().toByteArray()); ShardingContexts shardingContexts = (ShardingContexts) data.get("shardingContext"); @SuppressWarnings("unchecked") JobConfigurationContext jobConfig = new JobConfigurationContext((Map<String, String>) data.get("jobConfigContext")); try { ElasticJob elasticJob = getElasticJobInstance(jobConfig); final CloudJobFacade jobFacade = new CloudJobFacade(shardingContexts, jobConfig, jobEventBus); if (jobConfig.isTransient()) { JobExecutorFactory.getJobExecutor(elasticJob, jobFacade).execute(); executorDriver.sendStatusUpdate(Protos.TaskStatus.newBuilder().setTaskId(taskInfo.getTaskId()).setState(Protos.TaskState.TASK_FINISHED).build()); } else { new DaemonTaskScheduler(elasticJob, jobConfig, jobFacade, executorDriver, taskInfo.getTaskId()).init(); } // CHECKSTYLE:OFF } catch (final Throwable ex) { // CHECKSTYLE:ON log.error("Elastic-Job-Cloud-Executor error", ex); executorDriver.sendStatusUpdate(Protos.TaskStatus.newBuilder().setTaskId(taskInfo.getTaskId()).setState(Protos.TaskState.TASK_ERROR).setMessage(ExceptionUtil.transform(ex)).build()); executorDriver.stop(); throw ex; } }
@Override public void execute(final JobExecutionContext context) throws JobExecutionException { ShardingContexts shardingContexts = jobFacade.getShardingContexts(); int jobEventSamplingCount = shardingContexts.getJobEventSamplingCount(); int currentJobEventSamplingCount = shardingContexts.getCurrentJobEventSamplingCount(); if (jobEventSamplingCount > 0 && ++currentJobEventSamplingCount < jobEventSamplingCount) { shardingContexts.setCurrentJobEventSamplingCount(currentJobEventSamplingCount); jobFacade.getShardingContexts().setAllowSendJobEvent(false); JobExecutorFactory.getJobExecutor(elasticJob, jobFacade).execute(); } else { jobFacade.getShardingContexts().setAllowSendJobEvent(true); executorDriver.sendStatusUpdate(Protos.TaskStatus.newBuilder().setTaskId(taskId).setState(Protos.TaskState.TASK_RUNNING).setMessage("BEGIN").build()); JobExecutorFactory.getJobExecutor(elasticJob, jobFacade).execute(); executorDriver.sendStatusUpdate(Protos.TaskStatus.newBuilder().setTaskId(taskId).setState(Protos.TaskState.TASK_RUNNING).setMessage("COMPLETE").build()); shardingContexts.setCurrentJobEventSamplingCount(0); } } }
@Override public void execute(final JobExecutionContext context) throws JobExecutionException { ShardingContexts shardingContexts = jobFacade.getShardingContexts(); int jobEventSamplingCount = shardingContexts.getJobEventSamplingCount(); int currentJobEventSamplingCount = shardingContexts.getCurrentJobEventSamplingCount(); if (jobEventSamplingCount > 0 && ++currentJobEventSamplingCount < jobEventSamplingCount) { shardingContexts.setCurrentJobEventSamplingCount(currentJobEventSamplingCount); jobFacade.getShardingContexts().setAllowSendJobEvent(false); JobExecutorFactory.getJobExecutor(elasticJob, jobFacade).execute(); } else { jobFacade.getShardingContexts().setAllowSendJobEvent(true); executorDriver.sendStatusUpdate(Protos.TaskStatus.newBuilder().setTaskId(taskId).setState(Protos.TaskState.TASK_RUNNING).setMessage("BEGIN").build()); JobExecutorFactory.getJobExecutor(elasticJob, jobFacade).execute(); executorDriver.sendStatusUpdate(Protos.TaskStatus.newBuilder().setTaskId(taskId).setState(Protos.TaskState.TASK_RUNNING).setMessage("COMPLETE").build()); shardingContexts.setCurrentJobEventSamplingCount(0); } } }
@Override public void send(ClusterState state, SchedulerDriver mockDriver, Scheduler scheduler) { Protos.TaskID taskId = builder.taskId == null ? state.getTaskId(builder.taskName) : Protos.TaskID.newBuilder().setValue(builder.taskId).build(); Protos.TaskStatus.Builder taskStatusBuilder = Protos.TaskStatus.newBuilder() .setTaskId(taskId) .setState(builder.taskState) .setMessage("This is a test status"); if (builder.readinessCheckExitCode.isPresent()) { taskStatusBuilder .getCheckStatusBuilder() .getCommandBuilder() .setExitCode(builder.readinessCheckExitCode.get()); } scheduler.statusUpdate(mockDriver, taskStatusBuilder.build()); }
@Override public RestoreSchemaStatus createStatus( Protos.TaskState state, Optional<String> message) { Protos.TaskStatus.Builder builder = getStatusBuilder(); if (message.isPresent()) { builder.setMessage(message.get()); } return RestoreSchemaStatus.create(builder .setData(CassandraData.createRestoreSchemaStatusData().getBytes()) .setState(state) .build()); }
@Override public BackupSnapshotStatus createStatus( Protos.TaskState state, Optional<String> message) { Protos.TaskStatus.Builder builder = getStatusBuilder(); if (message.isPresent()) { builder.setMessage(message.get()); } return BackupSnapshotStatus.create(builder .setData(CassandraData.createBackupSnapshotStatusData().getBytes()) .setState(state) .build()); }
@Override public RestoreSnapshotStatus createStatus( Protos.TaskState state, Optional<String> message) { Protos.TaskStatus.Builder builder = getStatusBuilder(); if (message.isPresent()) { builder.setMessage(message.get()); } return RestoreSnapshotStatus.create(builder .setData(CassandraData.createRestoreSnapshotStatusData().getBytes()) .setState(state) .build()); }
@Override public BackupSchemaStatus createStatus( Protos.TaskState state, Optional<String> message) { Protos.TaskStatus.Builder builder = getStatusBuilder(); if (message.isPresent()) { builder.setMessage(message.get()); } return BackupSchemaStatus.create(builder .setData(CassandraData.createBackupSchemaStatusData().getBytes()) .setState(state) .build()); }
@Override public DownloadSnapshotStatus createStatus( Protos.TaskState state, Optional<String> message) { Protos.TaskStatus.Builder builder = getStatusBuilder(); if (message.isPresent()) { builder.setMessage(message.get()); } return DownloadSnapshotStatus.create(builder .setData(CassandraData.createSnapshotDownloadStatusData().getBytes()) .setState(state) .build()); }
@Override public RepairStatus createStatus( Protos.TaskState state, Optional<String> message) { Protos.TaskStatus.Builder builder = getStatusBuilder(); if (message.isPresent()) { builder.setMessage(message.get()); } return RepairStatus.create(builder .setData(CassandraData.createRepairStatusData().getBytes()) .setState(state) .build()); }
@Override public CleanupStatus createStatus( Protos.TaskState state, Optional<String> message) { Protos.TaskStatus.Builder builder = getStatusBuilder(); if (message.isPresent()) { builder.setMessage(message.get()); } return CleanupStatus.create(builder .setData(CassandraData.createCleanupStatusData().getBytes()) .setState(state) .build()); }
@Override public UpgradeSSTableStatus createStatus( Protos.TaskState state, Optional<String> message) { Protos.TaskStatus.Builder builder = getStatusBuilder(); if (message.isPresent()) { builder.setMessage(message.get()); } return UpgradeSSTableStatus.create(builder .setData(CassandraData.createUpgradeSSTableStatusData().getBytes()) .setState(state) .build()); }
@Override public BackupUploadStatus createStatus( Protos.TaskState state, Optional<String> message) { Protos.TaskStatus.Builder builder = getStatusBuilder(); if (message.isPresent()) { builder.setMessage(message.get()); } return BackupUploadStatus.create(builder .setData(CassandraData.createBackupUploadStatusData().getBytes()) .setState(state) .build()); }
/** * We assume a long-running Mesos Task that manages a REEF Evaluator process, leveraging Mesos Executor's interface. */ @Override public void launchTask(final ExecutorDriver driver, final TaskInfo task) { driver.sendStatusUpdate(TaskStatus.newBuilder() .setTaskId(TaskID.newBuilder().setValue(this.mesosExecutorId).build()) .setState(TaskState.TASK_STARTING) .setSlaveId(task.getSlaveId()) .setMessage(this.mesosRemoteManager.getMyIdentifier()) .build()); }