/** * Fail the request. * * @param format Format string for the failure message. Expects to take an interval * @param druidQuery Druid query that failed * @param interval Interval of the failing druid query */ private void fail(String format, DruidAggregationQuery<?> druidQuery, Interval interval) { String message = String.format(format, interval); Exception e = new IllegalStateException(message); LOG.error(message, e); getFailureCallback(druidQuery).invoke(e); }
@Override public void processResponse(JsonNode json, DruidAggregationQuery<?> druidQuery, LoggingContext metadata) { if (failed.get()) { return; } AtomicInteger sharedIndex; Interval interval = druidQuery.getIntervals().get(0); if (interval == null || (sharedIndex = expectedIntervals.get(interval)) == null) { fail(UNEXPECTED_INTERVAL_FORMAT, druidQuery, interval); return; } int index; if ((index = sharedIndex.getAndSet(-1)) < 0 || completedIntervals.get(index) != null) { fail(EXTRA_RETURN_FORMAT, druidQuery, interval); return; } completedIntervals.set(index, new Pair<>(json, metadata)); if (completed.decrementAndGet() == 0) { Pair<JsonNode, LoggingContext> mergedResponse = mergeResponses(completedIntervals); RequestLog.restore(mergedResponse.getValue().getRequestLog()); next.processResponse(mergedResponse.getKey(), queryBeforeSplit, mergedResponse.getValue()); } }
new SplitQueryResponseProcessor(response, request, druidQuery, expectedIntervals, logCtx);