Search in sources :

Example 16 with IAE

use of org.apache.druid.java.util.common.IAE in project druid by druid-io.

the class SqlParameterizerShuttle method visit.

@Override
public SqlNode visit(SqlDynamicParam param) {
    try {
        if (plannerContext.getParameters().size() > param.getIndex()) {
            TypedValue paramBinding = plannerContext.getParameters().get(param.getIndex());
            if (paramBinding == null) {
                throw new IAE("Parameter at position[%s] is not bound", param.getIndex());
            }
            if (paramBinding.value == null) {
                return SqlLiteral.createNull(param.getParserPosition());
            }
            SqlTypeName typeName = SqlTypeName.getNameForJdbcType(paramBinding.type.typeId);
            if (SqlTypeName.APPROX_TYPES.contains(typeName)) {
                return SqlLiteral.createApproxNumeric(paramBinding.value.toString(), param.getParserPosition());
            }
            if (SqlTypeName.TIMESTAMP.equals(typeName) && paramBinding.value instanceof Long) {
                return SqlLiteral.createTimestamp(TimestampString.fromMillisSinceEpoch((Long) paramBinding.value), 0, param.getParserPosition());
            }
            return typeName.createLiteral(paramBinding.value, param.getParserPosition());
        } else {
            throw new IAE("Parameter at position[%s] is not bound", param.getIndex());
        }
    } catch (ClassCastException ignored) {
    // suppress
    }
    return param;
}
Also used : SqlTypeName(org.apache.calcite.sql.type.SqlTypeName) IAE(org.apache.druid.java.util.common.IAE) TypedValue(org.apache.calcite.avatica.remote.TypedValue)

Example 17 with IAE

use of org.apache.druid.java.util.common.IAE in project druid by druid-io.

the class ChangeRequestHistory method getRequestsSince.

/**
 * Returns a Future that, on completion, returns list of segment updates and associated counter.
 * If there are no update since given counter then Future completion waits till an updates is provided.
 *
 * If counter is older than max number of changes maintained then {@link ChangeRequestsSnapshot} is returned
 * with {@link ChangeRequestsSnapshot#resetCounter} set to True.
 *
 * If there were no updates to provide immediately then a future is created and returned to caller. This future
 * is added to the "waitingFutures" list and all the futures in the list get resolved as soon as a segment
 * update is provided.
 */
public synchronized ListenableFuture<ChangeRequestsSnapshot<T>> getRequestsSince(final Counter counter) {
    final CustomSettableFuture<T> future = new CustomSettableFuture<>(waitingFutures);
    if (counter.counter < 0) {
        future.setException(new IAE("counter[%s] must be >= 0", counter));
        return future;
    }
    Counter lastCounter = getLastCounter();
    if (counter.counter == lastCounter.counter) {
        if (!counter.matches(lastCounter)) {
            ChangeRequestsSnapshot<T> reset = ChangeRequestsSnapshot.fail(StringUtils.format("counter[%s] failed to match with [%s]", counter, lastCounter));
            future.set(reset);
        } else {
            synchronized (waitingFutures) {
                waitingFutures.put(future, counter);
            }
        }
    } else {
        try {
            future.set(getRequestsSinceWithoutWait(counter));
        } catch (Exception ex) {
            future.setException(ex);
        }
    }
    return future;
}
Also used : IAE(org.apache.druid.java.util.common.IAE)

Example 18 with IAE

use of org.apache.druid.java.util.common.IAE in project druid by druid-io.

the class DruidCoordinator method moveSegment.

public void moveSegment(DruidCoordinatorRuntimeParams params, ImmutableDruidServer fromServer, ImmutableDruidServer toServer, DataSegment segment, final LoadPeonCallback callback) {
    if (segment == null) {
        log.makeAlert(new IAE("Can not move null DataSegment"), "Exception moving null segment").emit();
        if (callback != null) {
            callback.execute();
        }
        throw new ISE("Cannot move null DataSegment");
    }
    SegmentId segmentId = segment.getId();
    try {
        if (fromServer.getMetadata().equals(toServer.getMetadata())) {
            throw new IAE("Cannot move [%s] to and from the same server [%s]", segmentId, fromServer.getName());
        }
        ImmutableDruidDataSource dataSource = params.getDataSourcesSnapshot().getDataSource(segment.getDataSource());
        if (dataSource == null) {
            throw new IAE("Unable to find dataSource for segment [%s] in metadata", segmentId);
        }
        // get segment information from SegmentsMetadataManager instead of getting it from fromServer's.
        // This is useful when SegmentsMetadataManager and fromServer DataSegment's are different for same
        // identifier (say loadSpec differs because of deep storage migration).
        final DataSegment segmentToLoad = dataSource.getSegment(segment.getId());
        if (segmentToLoad == null) {
            throw new IAE("No segment metadata found for segment Id [%s]", segment.getId());
        }
        final LoadQueuePeon loadPeon = loadManagementPeons.get(toServer.getName());
        if (loadPeon == null) {
            throw new IAE("LoadQueuePeon hasn't been created yet for path [%s]", toServer.getName());
        }
        final LoadQueuePeon dropPeon = loadManagementPeons.get(fromServer.getName());
        if (dropPeon == null) {
            throw new IAE("LoadQueuePeon hasn't been created yet for path [%s]", fromServer.getName());
        }
        final ServerHolder toHolder = new ServerHolder(toServer, loadPeon);
        if (toHolder.getAvailableSize() < segmentToLoad.getSize()) {
            throw new IAE("Not enough capacity on server [%s] for segment [%s]. Required: %,d, available: %,d.", toServer.getName(), segmentToLoad, segmentToLoad.getSize(), toHolder.getAvailableSize());
        }
        final String toLoadQueueSegPath = ZKPaths.makePath(zkPaths.getLoadQueuePath(), toServer.getName(), segmentId.toString());
        final LoadPeonCallback loadPeonCallback = () -> {
            dropPeon.unmarkSegmentToDrop(segmentToLoad);
            if (callback != null) {
                callback.execute();
            }
        };
        // mark segment to drop before it is actually loaded on server
        // to be able to account this information in DruidBalancerStrategy immediately
        dropPeon.markSegmentToDrop(segmentToLoad);
        try {
            loadPeon.loadSegment(segmentToLoad, () -> {
                try {
                    if (serverInventoryView.isSegmentLoadedByServer(toServer.getName(), segment) && (curator == null || curator.checkExists().forPath(toLoadQueueSegPath) == null) && !dropPeon.getSegmentsToDrop().contains(segment)) {
                        dropPeon.dropSegment(segment, loadPeonCallback);
                    } else {
                        loadPeonCallback.execute();
                    }
                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
        } catch (Exception e) {
            dropPeon.unmarkSegmentToDrop(segmentToLoad);
            throw new RuntimeException(e);
        }
    } catch (Exception e) {
        log.makeAlert(e, "Exception moving segment %s", segmentId).emit();
        if (callback != null) {
            callback.execute();
        }
    }
}
Also used : ImmutableDruidDataSource(org.apache.druid.client.ImmutableDruidDataSource) SegmentId(org.apache.druid.timeline.SegmentId) ISE(org.apache.druid.java.util.common.ISE) IAE(org.apache.druid.java.util.common.IAE) DataSegment(org.apache.druid.timeline.DataSegment) ServiceUnavailableException(org.apache.druid.server.initialization.jetty.ServiceUnavailableException)

Example 19 with IAE

use of org.apache.druid.java.util.common.IAE in project druid by druid-io.

the class OperatorConversions method toPostAggregator.

/**
 * Translate a Calcite {@code RexNode} to a Druid PostAggregator
 *
 * @param plannerContext        SQL planner context
 * @param rowSignature          signature of the rows to be extracted from
 * @param rexNode               expression meant to be applied on top of the rows
 * @param postAggregatorVisitor visitor that manages postagg names and tracks postaggs that were created
 *                              by the translation
 *
 * @return rexNode referring to fields in rowOrder, or null if not possible
 */
@Nullable
public static PostAggregator toPostAggregator(final PlannerContext plannerContext, final RowSignature rowSignature, final RexNode rexNode, final PostAggregatorVisitor postAggregatorVisitor) {
    final SqlKind kind = rexNode.getKind();
    if (kind == SqlKind.INPUT_REF) {
        // Translate field references.
        final RexInputRef ref = (RexInputRef) rexNode;
        final String columnName = rowSignature.getColumnName(ref.getIndex());
        if (columnName == null) {
            throw new ISE("PostAggregator referred to nonexistent index[%d]", ref.getIndex());
        }
        return new FieldAccessPostAggregator(postAggregatorVisitor.getOutputNamePrefix() + postAggregatorVisitor.getAndIncrementCounter(), columnName);
    } else if (rexNode instanceof RexCall) {
        final SqlOperator operator = ((RexCall) rexNode).getOperator();
        final SqlOperatorConversion conversion = plannerContext.getOperatorTable().lookupOperatorConversion(operator);
        if (conversion == null) {
            return null;
        } else {
            return conversion.toPostAggregator(plannerContext, rowSignature, rexNode, postAggregatorVisitor);
        }
    } else if (kind == SqlKind.LITERAL) {
        return null;
    } else {
        throw new IAE("Unknown rexnode kind: " + kind);
    }
}
Also used : RexCall(org.apache.calcite.rex.RexCall) FieldAccessPostAggregator(org.apache.druid.query.aggregation.post.FieldAccessPostAggregator) SqlOperator(org.apache.calcite.sql.SqlOperator) RexInputRef(org.apache.calcite.rex.RexInputRef) ISE(org.apache.druid.java.util.common.ISE) SqlKind(org.apache.calcite.sql.SqlKind) IAE(org.apache.druid.java.util.common.IAE) Nullable(javax.annotation.Nullable)

Example 20 with IAE

use of org.apache.druid.java.util.common.IAE in project druid by druid-io.

the class IndexMergerV9 method merge.

private File merge(List<IndexableAdapter> indexes, final boolean rollup, final AggregatorFactory[] metricAggs, @Nullable DimensionsSpec dimensionsSpec, File outDir, IndexSpec indexSpec, ProgressIndicator progress, @Nullable SegmentWriteOutMediumFactory segmentWriteOutMediumFactory) throws IOException {
    final List<String> mergedDimensions = IndexMerger.getMergedDimensions(indexes, dimensionsSpec);
    final List<String> mergedMetrics = IndexMerger.mergeIndexed(indexes.stream().map(IndexableAdapter::getMetricNames).collect(Collectors.toList()));
    final AggregatorFactory[] sortedMetricAggs = new AggregatorFactory[mergedMetrics.size()];
    for (AggregatorFactory metricAgg : metricAggs) {
        int metricIndex = mergedMetrics.indexOf(metricAgg.getName());
        /*
        If metricIndex is negative, one of the metricAggs was not present in the union of metrics from the indices
        we are merging
       */
        if (metricIndex > -1) {
            sortedMetricAggs[metricIndex] = metricAgg;
        }
    }
    /*
      If there is nothing at sortedMetricAggs[i], then we did not have a metricAgg whose name matched the name
      of the ith element of mergedMetrics. I.e. There was a metric in the indices to merge that we did not ask for.
     */
    for (int i = 0; i < sortedMetricAggs.length; i++) {
        if (sortedMetricAggs[i] == null) {
            throw new IAE("Indices to merge contained metric[%s], but requested metrics did not", mergedMetrics.get(i));
        }
    }
    for (int i = 0; i < mergedMetrics.size(); i++) {
        if (!sortedMetricAggs[i].getName().equals(mergedMetrics.get(i))) {
            throw new IAE("Metric mismatch, index[%d] [%s] != [%s]", i, sortedMetricAggs[i].getName(), mergedMetrics.get(i));
        }
    }
    Function<List<TransformableRowIterator>, TimeAndDimsIterator> rowMergerFn;
    if (rollup) {
        rowMergerFn = rowIterators -> new RowCombiningTimeAndDimsIterator(rowIterators, sortedMetricAggs, mergedMetrics);
    } else {
        rowMergerFn = MergingRowIterator::new;
    }
    return makeIndexFiles(indexes, sortedMetricAggs, outDir, progress, mergedDimensions, mergedMetrics, rowMergerFn, true, indexSpec, segmentWriteOutMediumFactory);
}
Also used : List(java.util.List) ArrayList(java.util.ArrayList) AggregatorFactory(org.apache.druid.query.aggregation.AggregatorFactory) IAE(org.apache.druid.java.util.common.IAE)

Aggregations

IAE (org.apache.druid.java.util.common.IAE)115 ISE (org.apache.druid.java.util.common.ISE)23 IOException (java.io.IOException)20 ByteBuffer (java.nio.ByteBuffer)19 ArrayList (java.util.ArrayList)16 List (java.util.List)14 Expr (org.apache.druid.math.expr.Expr)14 Nullable (javax.annotation.Nullable)12 ColumnType (org.apache.druid.segment.column.ColumnType)10 HashSet (java.util.HashSet)8 Map (java.util.Map)8 Interval (org.joda.time.Interval)8 VisibleForTesting (com.google.common.annotations.VisibleForTesting)7 HashMap (java.util.HashMap)7 AggregatorFactory (org.apache.druid.query.aggregation.AggregatorFactory)7 File (java.io.File)6 Iterables (com.google.common.collect.Iterables)5 Arrays (java.util.Arrays)5 Test (org.junit.Test)5 ImmutableMap (com.google.common.collect.ImmutableMap)4