@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);
private SolverRunner(GroupElement gElement) { this.solveElement = gElement.getElement(); this.queueName = gElement.getQueueName(); this.clusterId = solveElement.getId(); this.solverJob = null; this.plannerJob = null; }
@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 { 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(); } });
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");
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); } } }
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 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()); }
@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(); }