private List<QueryQueue> getOrCreateQueues( Session session, Executor executor, List<QueryQueueDefinition> definitions) { ImmutableList.Builder<QueryQueue> queues = ImmutableList.builder(); for (QueryQueueDefinition definition : definitions) { String expandedName = definition.getExpandedTemplate(session); QueueKey key = new QueueKey(definition, expandedName); if (!queryQueues.containsKey(key)) { QueryQueue queue = new QueryQueue(executor, definition.getMaxQueued(), definition.getMaxConcurrent()); if (queryQueues.putIfAbsent(key, queue) == null) { // Export the mbean, after checking for races String objectName = ObjectNames.builder(QueryQueue.class, definition.getTemplate()) .withProperty("expansion", expandedName) .build(); mbeanExporter.export(objectName, queue); } } queues.add(queryQueues.get(key)); } return queues.build(); }
private static void checkIsDAG(List<QueryQueueRule> rules) { DirectedPseudograph<String, DefaultEdge> graph = new DirectedPseudograph<>(DefaultEdge.class); for (QueryQueueRule rule : rules) { String lastQueueName = null; for (QueryQueueDefinition queue : rule.getQueues()) { String currentQueueName = queue.getTemplate(); graph.addVertex(currentQueueName); if (lastQueueName != null) { graph.addEdge(lastQueueName, currentQueueName); } lastQueueName = currentQueueName; } } List<String> shortestCycle = shortestCycle(graph); if (shortestCycle != null) { String s = Joiner.on(", ").join(shortestCycle); throw new IllegalArgumentException( format("Queues must not contain a cycle. The shortest cycle found is [%s]", s)); } }
@Override public boolean equals(Object other) { if (this == other) { return true; } if (other == null || getClass() != other.getClass()) { return false; } QueueKey queueKey = (QueueKey) other; return Objects.equals(name, queueKey.name) && Objects.equals(queue.getTemplate(), queueKey.queue.getTemplate()); }
@Override public int hashCode() { return Objects.hash(queue.getTemplate(), name); }