@Inject private CallbackScheduler(@Named("scheduler.id") String id, @Named("callback.executor.service") ListeningExecutorService executorService, TaskService taskService, ClusterCallback clusterCallback, Configuration conf, ClusterStoreService clusterStoreService, UserStore userStore, Gson gson, QueueService queueService) { this.id = id; this.executorService = executorService; this.taskService = taskService; this.clusterCallback = clusterCallback; this.clusterCallback.initialize(conf); this.gson = gson; this.callbackQueues = queueService.getQueueGroup(QueueType.CALLBACK); this.jobQueues = queueService.getQueueGroup(QueueType.JOB); this.clusterStoreService = clusterStoreService; this.userStore = userStore; }
@Override public void run() { CallbackData callbackData = gson.fromJson(gElement.getElement().getValue(), CallbackData.class); CallbackContext callbackContext = new CallbackContext(clusterStoreService, userStore, callbackData.getCluster().getAccount()); switch (callbackData.getType()) { case START: onStart(callbackData, callbackContext); break; case SUCCESS: clusterCallback.onSuccess(callbackData, callbackContext); break; case FAILURE: clusterCallback.onFailure(callbackData, callbackContext); break; default: LOG.error("Unknown callback type {}", callbackData.getType()); } }
private void onStart(CallbackData callbackData, CallbackContext callbackContext) { ClusterJob job = callbackData.getJob(); Cluster cluster = callbackData.getCluster(); try { if (clusterCallback.onStart(callbackData, callbackContext)) { String jobId = callbackData.getJob().getJobId(); jobQueues.add(gElement.getQueueName(), new Element(jobId)); LOG.debug("added job {} to job queue", jobId); } else { switch (job.getClusterAction()) { case CLUSTER_CREATE: taskService.failJobAndTerminateCluster(job, cluster, "Cluster creation stopped by failed start callback."); break; default: // failed to plan means the job should fail, but state has already been changed so the cluster // state in the db is inconsistent with reality. // TODO: Should revert it here but need versioning or cluster history or something to that effect. taskService.failJobAndSetClusterStatus( job, cluster, Cluster.Status.INCONSISTENT, "Failed to schedule the " + job.getClusterAction() + " operation."); break; } } } catch (Exception e) { LOG.error("Exception failing job {} for cluster {}", job.getJobId(), cluster.getId(), e); } } }