private SolverRunner(GroupElement gElement) { this.solveElement = gElement.getElement(); this.queueName = gElement.getQueueName(); this.clusterId = solveElement.getId(); this.solverJob = null; this.plannerJob = null; }
private GroupElement getNextElement() { while (currentBatch.hasNext()) { Map.Entry<String, TrackingQueue> currentQueueEntry = currentBatch.next(); TrackingQueue queue = currentQueueEntry.getValue(); String queueName = currentQueueEntry.getKey(); Element element = queue.take(consumerId); if (element != null) { return new GroupElement(queueName, element); } } return null; }
@Override public void run() { try { callbackQueues.recordProgress(id, gElement.getQueueName(), element.getId(), TrackingQueue.ConsumingStatus.FINISHED_SUCCESSFULLY, "Executed"); } catch (Exception e) { LOG.error("Exception processing callback", e); } } }, executorService);
@Override public void run() { try { Iterator<GroupElement> solveIter = solverQueues.takeIterator(id); while (solveIter.hasNext()) { final GroupElement gElement = solveIter.next(); final Element solveElement = gElement.getElement(); final ListenableFuture<String> future = executorService.submit(new SolverRunner(gElement)); future.addListener(new Runnable() { @Override public void run() { try { solverQueues.recordProgress(id, gElement.getQueueName(), solveElement.getId(), TrackingQueue.ConsumingStatus.FINISHED_SUCCESSFULLY, future.get()); } catch (Exception e) { LOG.error("Unable to record progress for cluster {}", solveElement.getId()); } } }, executorService); } } catch (Exception e) { LOG.error("Got exception:", e); } }
@Override public void run() { try { solverQueues.recordProgress(id, gElement.getQueueName(), solveElement.getId(), TrackingQueue.ConsumingStatus.FINISHED_SUCCESSFULLY, future.get()); } catch (Exception e) { LOG.error("Unable to record progress for cluster {}", solveElement.getId()); } } }, executorService);
@Override public void run() { try { Iterator<GroupElement> callbackIter = callbackQueues.takeIterator(id); while (callbackIter.hasNext()) { final GroupElement gElement = callbackIter.next(); final Element element = gElement.getElement(); final ListenableFuture future = executorService.submit(new CallbackRunner(gElement)); future.addListener(new Runnable() { @Override public void run() { try { callbackQueues.recordProgress(id, gElement.getQueueName(), element.getId(), TrackingQueue.ConsumingStatus.FINISHED_SUCCESSFULLY, "Executed"); } catch (Exception e) { LOG.error("Exception processing callback", e); } } }, executorService); } } catch (Exception e) { LOG.error("Got exception:", e); } }
@Override public void run() { try { barrier.await(); } catch (Exception e) { Throwables.propagate(e); } while (numTaken.get() < expectedNumElements) { Iterator<GroupElement> iter = queues.takeIterator(consumerId); while (iter.hasNext()) { GroupElement taken = iter.next(); numTaken.getAndIncrement(); elements.put(Integer.valueOf(taken.getElement().getValue()), Integer.valueOf(taken.getQueueName())); } try { TimeUnit.MILLISECONDS.sleep(10); } catch (InterruptedException e) { Throwables.propagate(e); } } latch.countDown(); } });
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); } } }
@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()); } }
while (clusterIter.hasNext()) { GroupElement gElement = clusterIter.next(); Element clusterElement = gElement.getElement(); Cluster cluster = clusterStore.getCluster(clusterElement.getId()); ClusterJob job = clusterStore.getClusterJob(JobId.fromString(cluster.getLatestJobId())); if (actionOrder == null) { LOG.error("Cluster action {} does not have any provisioner actions defined", clusterAction); clusterQueues.recordProgress(id, gElement.getQueueName(), clusterElement.getId(), TrackingQueue.ConsumingStatus.FINISHED_SUCCESSFULLY, "No actions defined"); continue; if (clusterNodes == null || clusterNodes.isEmpty()) { LOG.error("Cluster {} has no nodes defined", cluster.getId()); clusterQueues.recordProgress(id, gElement.getQueueName(), clusterElement.getId(), TrackingQueue.ConsumingStatus.FINISHED_SUCCESSFULLY, "No nodes defined"); continue; clusterQueues.recordProgress(id, gElement.getQueueName(), clusterElement.getId(), TrackingQueue.ConsumingStatus.FINISHED_SUCCESSFULLY, "Scheduled"); } catch (Throwable e) { clusterQueues.recordProgress(id, gElement.getQueueName(), clusterElement.getId(), TrackingQueue.ConsumingStatus.FINISHED_SUCCESSFULLY, "Exception during scheduling");
@Test public void testOneQueueAddTakeWithoutQueueName() { QueueGroup queues = getQueueGroup(QueueType.PROVISIONER); String queueName = "tenant1"; String consumerId = "worker.0"; queues.add(queueName, new Element("id", "val")); GroupElement taken = queues.takeIterator(consumerId).next(); Assert.assertEquals(queueName, taken.getQueueName()); Assert.assertEquals("id", taken.getElement().getId()); Assert.assertEquals("val", taken.getElement().getValue()); }
while (jobIter.hasNext()) { GroupElement gElement = jobIter.next(); String queueName = gElement.getQueueName(); Element element = gElement.getElement(); String jobIdStr = element.getValue();
String firstTenant = taken.getQueueName(); Assert.assertEquals("id" + i, taken.getElement().getId()); taken = iter.next(); String secondTenant = taken.getQueueName(); Assert.assertEquals("id" + i, taken.getElement().getId()); Assert.assertEquals(Sets.newHashSet("tenant1", "tenant2"), Sets.newHashSet(firstTenant, secondTenant)); Assert.assertEquals("tenant2", taken.getQueueName()); Assert.assertEquals("id4", taken.getElement().getId()); Assert.assertEquals("tenant2", taken.getQueueName()); Assert.assertEquals("id5", taken.getElement().getId());
@Test public void testChangesSeenAcrossInstances() throws Exception { QueueGroup instance1 = new ZKQueueGroup(zkClient, QueueType.PROVISIONER); QueueGroup instance2 = new ZKQueueGroup(zkClient, QueueType.PROVISIONER); instance1.startAndWait(); instance2.startAndWait(); // add a queue for tenant3 with 2 elements String tenant = "tenantX"; Set<String> expectedQueueNames = Sets.newHashSet(tenant); instance1.add(tenant, new Element("id3-1", "val1")); instance1.add(tenant, new Element("id3-2", "val2")); // check both instances see tenant3 Assert.assertEquals(expectedQueueNames, instance1.getQueueNames()); waitForQueueNames(expectedQueueNames, instance2); // make sure each instance gets an accurate picture of the queue Iterator<GroupElement> queuesIter1 = instance1.takeIterator("consumer1"); Iterator<GroupElement> queuesIter2 = instance1.takeIterator("consumer2"); GroupElement gelement = queuesIter1.next(); Assert.assertEquals(tenant, gelement.getQueueName()); Assert.assertEquals("id3-1", gelement.getElement().getId()); Assert.assertEquals("val1", gelement.getElement().getValue()); gelement = queuesIter2.next(); Assert.assertEquals(tenant, gelement.getQueueName()); Assert.assertEquals("id3-2", gelement.getElement().getId()); Assert.assertEquals("val2", gelement.getElement().getValue()); Assert.assertFalse(queuesIter1.hasNext()); Assert.assertFalse(queuesIter2.hasNext()); instance1.stop(); instance2.stop(); }