Search in sources :

Example 21 with Range

use of org.apache.commons.lang3.Range in project presto by prestodb.

the class ColumnCardinalityCache method getColumnCardinality.

/**
 * Gets the column cardinality for all of the given range values. May reach out to the
 * metrics table in Accumulo to retrieve new cache elements.
 *
 * @param schema Table schema
 * @param table Table name
 * @param auths Scan authorizations
 * @param family Accumulo column family
 * @param qualifier Accumulo column qualifier
 * @param colValues All range values to summarize for the cardinality
 * @return The cardinality of the column
 */
public long getColumnCardinality(String schema, String table, Authorizations auths, String family, String qualifier, Collection<Range> colValues) throws ExecutionException {
    LOG.debug("Getting cardinality for %s:%s", family, qualifier);
    // Collect all exact Accumulo Ranges, i.e. single value entries vs. a full scan
    Collection<CacheKey> exactRanges = colValues.stream().filter(ColumnCardinalityCache::isExact).map(range -> new CacheKey(schema, table, family, qualifier, range, auths)).collect(Collectors.toList());
    LOG.debug("Column values contain %s exact ranges of %s", exactRanges.size(), colValues.size());
    // Sum the cardinalities for the exact-value Ranges
    // This is where the reach-out to Accumulo occurs for all Ranges that have not
    // previously been fetched
    long sum = cache.getAll(exactRanges).values().stream().mapToLong(Long::longValue).sum();
    // then there is at least one non-exact range
    if (exactRanges.size() != colValues.size()) {
        // for each range in the column value
        for (Range range : colValues) {
            // if this range is not exact
            if (!isExact(range)) {
                // Then get the value for this range using the single-value cache lookup
                sum += cache.get(new CacheKey(schema, table, family, qualifier, range, auths));
            }
        }
    }
    return sum;
}
Also used : LoadingCache(com.google.common.cache.LoadingCache) ListMultimap(com.google.common.collect.ListMultimap) MultimapBuilder(com.google.common.collect.MultimapBuilder) Text(org.apache.hadoop.io.Text) TableNotFoundException(org.apache.accumulo.core.client.TableNotFoundException) CompletionService(java.util.concurrent.CompletionService) Duration(io.airlift.units.Duration) BatchScanner(org.apache.accumulo.core.client.BatchScanner) PreDestroy(javax.annotation.PreDestroy) Future(java.util.concurrent.Future) Pair(org.apache.commons.lang3.tuple.Pair) Indexer.getMetricsTableName(com.facebook.presto.accumulo.index.Indexer.getMetricsTableName) Map(java.util.Map) Value(org.apache.accumulo.core.data.Value) FUNCTION_IMPLEMENTATION_ERROR(com.facebook.presto.spi.StandardErrorCode.FUNCTION_IMPLEMENTATION_ERROR) ImmutableMap(com.google.common.collect.ImmutableMap) Collection(java.util.Collection) MILLISECONDS(java.util.concurrent.TimeUnit.MILLISECONDS) Collectors(java.util.stream.Collectors) CacheLoader(com.google.common.cache.CacheLoader) Objects(java.util.Objects) Threads.daemonThreadsNamed(com.facebook.airlift.concurrent.Threads.daemonThreadsNamed) Indexer.getIndexColumnFamily(com.facebook.presto.accumulo.index.Indexer.getIndexColumnFamily) AccumuloConfig(com.facebook.presto.accumulo.conf.AccumuloConfig) Entry(java.util.Map.Entry) Optional(java.util.Optional) CacheBuilder(com.google.common.cache.CacheBuilder) ExecutorCompletionService(java.util.concurrent.ExecutorCompletionService) MoreObjects.toStringHelper(com.google.common.base.MoreObjects.toStringHelper) CARDINALITY_CQ_AS_TEXT(com.facebook.presto.accumulo.index.Indexer.CARDINALITY_CQ_AS_TEXT) Iterables(com.google.common.collect.Iterables) Logger(com.facebook.airlift.log.Logger) HashMap(java.util.HashMap) PrestoException(com.facebook.presto.spi.PrestoException) Multimap(com.google.common.collect.Multimap) Function(java.util.function.Function) Connector(org.apache.accumulo.core.client.Connector) Inject(javax.inject.Inject) BoundedExecutor(com.facebook.airlift.concurrent.BoundedExecutor) Key(org.apache.accumulo.core.data.Key) Objects.requireNonNull(java.util.Objects.requireNonNull) ImmutableMultimap(com.google.common.collect.ImmutableMultimap) ExecutorService(java.util.concurrent.ExecutorService) UTF_8(java.nio.charset.StandardCharsets.UTF_8) AccumuloColumnConstraint(com.facebook.presto.accumulo.model.AccumuloColumnConstraint) Authorizations(org.apache.accumulo.core.security.Authorizations) Range(org.apache.accumulo.core.data.Range) ExecutionException(java.util.concurrent.ExecutionException) Streams.stream(com.google.common.collect.Streams.stream) Executors.newCachedThreadPool(java.util.concurrent.Executors.newCachedThreadPool) PartialKey(org.apache.accumulo.core.data.PartialKey) UNEXPECTED_ACCUMULO_ERROR(com.facebook.presto.accumulo.AccumuloErrorCode.UNEXPECTED_ACCUMULO_ERROR) Long.parseLong(java.lang.Long.parseLong) Range(org.apache.accumulo.core.data.Range)

Example 22 with Range

use of org.apache.commons.lang3.Range in project cassandra by apache.

the class StorageService method restoreReplicaCount.

/**
 * Called when an endpoint is removed from the ring. This function checks
 * whether this node becomes responsible for new ranges as a
 * consequence and streams data if needed.
 *
 * This is rather ineffective, but it does not matter so much
 * since this is called very seldom
 *
 * @param endpoint the node that left
 */
private void restoreReplicaCount(InetAddressAndPort endpoint, final InetAddressAndPort notifyEndpoint) {
    Map<String, Multimap<InetAddressAndPort, FetchReplica>> replicasToFetch = new HashMap<>();
    InetAddressAndPort myAddress = FBUtilities.getBroadcastAddressAndPort();
    for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces()) {
        logger.debug("Restoring replica count for keyspace {}", keyspaceName);
        EndpointsByReplica changedReplicas = getChangedReplicasForLeaving(keyspaceName, endpoint, tokenMetadata, Keyspace.open(keyspaceName).getReplicationStrategy());
        Set<LeavingReplica> myNewReplicas = new HashSet<>();
        for (Map.Entry<Replica, Replica> entry : changedReplicas.flattenEntries()) {
            Replica replica = entry.getValue();
            if (replica.endpoint().equals(myAddress)) {
                // Maybe we don't technically need to fetch transient data from somewhere
                // but it's probably not a lot and it probably makes things a hair more resilient to people
                // not running repair when they should.
                myNewReplicas.add(new LeavingReplica(entry.getKey(), entry.getValue()));
            }
        }
        logger.debug("Changed replicas for leaving {}, myNewReplicas {}", changedReplicas, myNewReplicas);
        replicasToFetch.put(keyspaceName, getNewSourceReplicas(keyspaceName, myNewReplicas));
    }
    StreamPlan stream = new StreamPlan(StreamOperation.RESTORE_REPLICA_COUNT);
    replicasToFetch.forEach((keyspaceName, sources) -> {
        logger.debug("Requesting keyspace {} sources", keyspaceName);
        sources.asMap().forEach((sourceAddress, fetchReplicas) -> {
            logger.debug("Source and our replicas are {}", fetchReplicas);
            // Remember whether this node is providing the full or transient replicas for this range. We are going
            // to pass streaming the local instance of Replica for the range which doesn't tell us anything about the source
            // By encoding it as two separate sets we retain this information about the source.
            RangesAtEndpoint full = fetchReplicas.stream().filter(f -> f.remote.isFull()).map(f -> f.local).collect(RangesAtEndpoint.collector(myAddress));
            RangesAtEndpoint transientReplicas = fetchReplicas.stream().filter(f -> f.remote.isTransient()).map(f -> f.local).collect(RangesAtEndpoint.collector(myAddress));
            if (logger.isDebugEnabled())
                logger.debug("Requesting from {} full replicas {} transient replicas {}", sourceAddress, StringUtils.join(full, ", "), StringUtils.join(transientReplicas, ", "));
            stream.requestRanges(sourceAddress, keyspaceName, full, transientReplicas);
        });
    });
    StreamResultFuture future = stream.execute();
    future.addCallback(new FutureCallback<StreamState>() {

        public void onSuccess(StreamState finalState) {
            sendReplicationNotification(notifyEndpoint);
        }

        public void onFailure(Throwable t) {
            logger.warn("Streaming to restore replica count failed", t);
            // We still want to send the notification
            sendReplicationNotification(notifyEndpoint);
        }
    });
}
Also used : TraceKeyspace(org.apache.cassandra.tracing.TraceKeyspace) StorageMetrics(org.apache.cassandra.metrics.StorageMetrics) File(org.apache.cassandra.io.util.File) CommitLog(org.apache.cassandra.db.commitlog.CommitLog) AuthKeyspace(org.apache.cassandra.auth.AuthKeyspace) org.apache.cassandra.utils(org.apache.cassandra.utils) Global.nanoTime(org.apache.cassandra.utils.Clock.Global.nanoTime) StringUtils(org.apache.commons.lang3.StringUtils) TokenFactory(org.apache.cassandra.dht.Token.TokenFactory) VersionAndType(org.apache.cassandra.io.sstable.format.VersionAndType) InetAddress(java.net.InetAddress) SystemDistributedKeyspace(org.apache.cassandra.schema.SystemDistributedKeyspace) SecondaryIndexManager.isIndexColumnFamily(org.apache.cassandra.index.SecondaryIndexManager.isIndexColumnFamily) SecondaryIndexManager.getIndexName(org.apache.cassandra.index.SecondaryIndexManager.getIndexName) Arrays.asList(java.util.Arrays.asList) HintsService(org.apache.cassandra.hints.HintsService) JMXBroadcastExecutor(org.apache.cassandra.utils.progress.jmx.JMXBroadcastExecutor) MILLISECONDS(java.util.concurrent.TimeUnit.MILLISECONDS) FullQueryLoggerOptions(org.apache.cassandra.fql.FullQueryLoggerOptions) ViewMetadata(org.apache.cassandra.schema.ViewMetadata) Stream(java.util.stream.Stream) Predicate(com.google.common.base.Predicate) CassandraRelevantProperties(org.apache.cassandra.config.CassandraRelevantProperties) FullQueryLogger(org.apache.cassandra.fql.FullQueryLogger) Conflict(org.apache.cassandra.locator.ReplicaCollection.Builder.Conflict) KeyspaceMetadata(org.apache.cassandra.schema.KeyspaceMetadata) LoggingSupportFactory(org.apache.cassandra.utils.logging.LoggingSupportFactory) NoPayload.noPayload(org.apache.cassandra.net.NoPayload.noPayload) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ProgressEvent(org.apache.cassandra.utils.progress.ProgressEvent) java.util(java.util) OpenDataException(javax.management.openmbean.OpenDataException) CompactionManager(org.apache.cassandra.db.compaction.CompactionManager) SSTableLoader(org.apache.cassandra.io.sstable.SSTableLoader) ClientResourceLimits(org.apache.cassandra.transport.ClientResourceLimits) Global.currentTimeMillis(org.apache.cassandra.utils.Clock.Global.currentTimeMillis) Range(org.apache.cassandra.dht.Range) MINUTES(java.util.concurrent.TimeUnit.MINUTES) QueryProcessor(org.apache.cassandra.cql3.QueryProcessor) Supplier(java.util.function.Supplier) REPLICATION_DONE_REQ(org.apache.cassandra.net.Verb.REPLICATION_DONE_REQ) Schema(org.apache.cassandra.schema.Schema) ActiveRepairService(org.apache.cassandra.service.ActiveRepairService) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) FullQueryLoggerOptionsCompositeData(org.apache.cassandra.fql.FullQueryLoggerOptionsCompositeData) Predicates(com.google.common.base.Predicates) BatchlogManager(org.apache.cassandra.batchlog.BatchlogManager) StreamSupport(java.util.stream.StreamSupport) ProgressEventType(org.apache.cassandra.utils.progress.ProgressEventType) Nullable(javax.annotation.Nullable) CompositeData(javax.management.openmbean.CompositeData) IOException(java.io.IOException) UnknownHostException(java.net.UnknownHostException) IOError(java.io.IOError) ExecutionException(java.util.concurrent.ExecutionException) Paths(java.nio.file.Paths) ImmediateFuture(org.apache.cassandra.utils.concurrent.ImmediateFuture) org.apache.cassandra.net(org.apache.cassandra.net) SnapshotManager(org.apache.cassandra.service.snapshot.SnapshotManager) Preconditions(com.google.common.base.Preconditions) org.apache.cassandra.locator(org.apache.cassandra.locator) AuditLogManager(org.apache.cassandra.audit.AuditLogManager) Verifier(org.apache.cassandra.db.compaction.Verifier) org.apache.cassandra.repair(org.apache.cassandra.repair) org.apache.cassandra.streaming(org.apache.cassandra.streaming) Iterables.transform(com.google.common.collect.Iterables.transform) Iterables.tryFind(com.google.common.collect.Iterables.tryFind) MatchResult(java.util.regex.MatchResult) LoggerFactory(org.slf4j.LoggerFactory) org.apache.cassandra.db(org.apache.cassandra.db) ReplicationParams(org.apache.cassandra.schema.ReplicationParams) TimeoutException(java.util.concurrent.TimeoutException) org.apache.cassandra.gms(org.apache.cassandra.gms) com.google.common.util.concurrent(com.google.common.util.concurrent) TabularData(javax.management.openmbean.TabularData) ByteBuffer(java.nio.ByteBuffer) MigrationManager(org.apache.cassandra.schema.MigrationManager) ByteArrayInputStream(java.io.ByteArrayInputStream) Collectors.toMap(java.util.stream.Collectors.toMap) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) SSTableFormat(org.apache.cassandra.io.sstable.format.SSTableFormat) AuthSchemaChangeListener(org.apache.cassandra.auth.AuthSchemaChangeListener) PathUtils(org.apache.cassandra.io.util.PathUtils) com.google.common.collect(com.google.common.collect) DatabaseDescriptor(org.apache.cassandra.config.DatabaseDescriptor) AuditLogOptions(org.apache.cassandra.audit.AuditLogOptions) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) TombstoneOption(org.apache.cassandra.schema.CompactionParams.TombstoneOption) JMXProgressSupport(org.apache.cassandra.utils.progress.jmx.JMXProgressSupport) Instant(java.time.Instant) org.apache.cassandra.dht(org.apache.cassandra.dht) InetSocketAddress(java.net.InetSocketAddress) Collectors(java.util.stream.Collectors) UncheckedInterruptedException(org.apache.cassandra.utils.concurrent.UncheckedInterruptedException) ProgressListener(org.apache.cassandra.utils.progress.ProgressListener) AuthCacheService(org.apache.cassandra.auth.AuthCacheService) DurationSpec(org.apache.cassandra.config.DurationSpec) MigrationManager.evolveSystemKeyspace(org.apache.cassandra.schema.MigrationManager.evolveSystemKeyspace) ParameterizedClass(org.apache.cassandra.config.ParameterizedClass) LifecycleTransaction(org.apache.cassandra.db.lifecycle.LifecycleTransaction) Future(org.apache.cassandra.utils.concurrent.Future) org.apache.cassandra.exceptions(org.apache.cassandra.exceptions) FileUtils(org.apache.cassandra.io.util.FileUtils) TableMetadataRef(org.apache.cassandra.schema.TableMetadataRef) TabularDataSupport(javax.management.openmbean.TabularDataSupport) Entry(java.util.Map.Entry) org.apache.cassandra.concurrent(org.apache.cassandra.concurrent) TableMetadata(org.apache.cassandra.schema.TableMetadata) VirtualKeyspaceRegistry(org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry) Pattern(java.util.regex.Pattern) MigrationCoordinator(org.apache.cassandra.schema.MigrationCoordinator) SchemaConstants(org.apache.cassandra.schema.SchemaConstants) Arrays.stream(java.util.Arrays.stream) DataInputStream(java.io.DataInputStream) RepairOption(org.apache.cassandra.repair.messages.RepairOption) NANOSECONDS(java.util.concurrent.TimeUnit.NANOSECONDS) Config(org.apache.cassandra.config.Config) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) QueryHandler(org.apache.cassandra.cql3.QueryHandler) BOOTSTRAP_SKIP_SCHEMA_CHECK(org.apache.cassandra.config.CassandraRelevantProperties.BOOTSTRAP_SKIP_SCHEMA_CHECK) FetchReplica(org.apache.cassandra.dht.RangeStreamer.FetchReplica) ProtocolVersion(org.apache.cassandra.transport.ProtocolVersion) ExecutorService(java.util.concurrent.ExecutorService) Logger(org.slf4j.Logger) javax.management(javax.management) REPLACEMENT_ALLOW_EMPTY(org.apache.cassandra.config.CassandraRelevantProperties.REPLACEMENT_ALLOW_EMPTY) TimeUnit(java.util.concurrent.TimeUnit) Collectors.toList(java.util.stream.Collectors.toList) VisibleForTesting(com.google.common.annotations.VisibleForTesting) BOOTSTRAP_SCHEMA_DELAY_MS(org.apache.cassandra.config.CassandraRelevantProperties.BOOTSTRAP_SCHEMA_DELAY_MS) TableSnapshot(org.apache.cassandra.service.snapshot.TableSnapshot) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) FetchReplica(org.apache.cassandra.dht.RangeStreamer.FetchReplica) Collectors.toMap(java.util.stream.Collectors.toMap) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap)

Example 23 with Range

use of org.apache.commons.lang3.Range in project cassandra by apache.

the class StorageService method getChangedReplicasForLeaving.

/**
 * This is used in three contexts, graceful decomission, and restoreReplicaCount/removeNode.
 * Graceful decomission should never lose data and it's going to be important that transient data
 * is streamed to at least one other node from this one for each range.
 *
 * For ranges this node replicates its removal should cause a new replica to be selected either as transient or full
 * for every range. So I believe the current code doesn't have to do anything special because it will engage in streaming
 * for every range it replicates to at least one other node and that should propagate the transient data that was here.
 * When I graphed this out on paper the result of removal looked correct and there are no issues such as
 * this node needing to create a full replica for a range it transiently replicates because what is created is just another
 * transient replica to replace this node.
 * @param keyspaceName
 * @param endpoint
 * @return
 */
// needs to be modified to accept either a keyspace or ARS.
static EndpointsByReplica getChangedReplicasForLeaving(String keyspaceName, InetAddressAndPort endpoint, TokenMetadata tokenMetadata, AbstractReplicationStrategy strat) {
    // First get all ranges the leaving endpoint is responsible for
    RangesAtEndpoint replicas = strat.getAddressReplicas(endpoint);
    if (logger.isDebugEnabled())
        logger.debug("Node {} replicas [{}]", endpoint, StringUtils.join(replicas, ", "));
    Map<Replica, EndpointsForRange> currentReplicaEndpoints = Maps.newHashMapWithExpectedSize(replicas.size());
    // Find (for each range) all nodes that store replicas for these ranges as well
    // don't do this in the loop! #7758
    TokenMetadata metadata = tokenMetadata.cloneOnlyTokenMap();
    for (Replica replica : replicas) currentReplicaEndpoints.put(replica, strat.calculateNaturalReplicas(replica.range().right, metadata));
    TokenMetadata temp = tokenMetadata.cloneAfterAllLeft();
    // command was used), it is still present in temp and must be removed.
    if (temp.isMember(endpoint))
        temp.removeEndpoint(endpoint);
    EndpointsByReplica.Builder changedRanges = new EndpointsByReplica.Builder();
    // range.
    for (Replica replica : replicas) {
        EndpointsForRange newReplicaEndpoints = strat.calculateNaturalReplicas(replica.range().right, temp);
        newReplicaEndpoints = newReplicaEndpoints.filter(newReplica -> {
            Optional<Replica> currentReplicaOptional = tryFind(currentReplicaEndpoints.get(replica), currentReplica -> newReplica.endpoint().equals(currentReplica.endpoint())).toJavaUtil();
            // If it is newly replicating then yes we must do something to get the data there
            if (!currentReplicaOptional.isPresent())
                return true;
            Replica currentReplica = currentReplicaOptional.get();
            // transient -> transient and full -> full don't require any action
            if (currentReplica.isTransient() && newReplica.isFull())
                return true;
            return false;
        });
        if (logger.isDebugEnabled())
            if (newReplicaEndpoints.isEmpty())
                logger.debug("Replica {} already in all replicas", replica);
            else
                logger.debug("Replica {} will be responsibility of {}", replica, StringUtils.join(newReplicaEndpoints, ", "));
        changedRanges.putAll(replica, newReplicaEndpoints, Conflict.NONE);
    }
    return changedRanges.build();
}
Also used : TraceKeyspace(org.apache.cassandra.tracing.TraceKeyspace) StorageMetrics(org.apache.cassandra.metrics.StorageMetrics) File(org.apache.cassandra.io.util.File) CommitLog(org.apache.cassandra.db.commitlog.CommitLog) AuthKeyspace(org.apache.cassandra.auth.AuthKeyspace) org.apache.cassandra.utils(org.apache.cassandra.utils) Global.nanoTime(org.apache.cassandra.utils.Clock.Global.nanoTime) StringUtils(org.apache.commons.lang3.StringUtils) TokenFactory(org.apache.cassandra.dht.Token.TokenFactory) VersionAndType(org.apache.cassandra.io.sstable.format.VersionAndType) InetAddress(java.net.InetAddress) SystemDistributedKeyspace(org.apache.cassandra.schema.SystemDistributedKeyspace) SecondaryIndexManager.isIndexColumnFamily(org.apache.cassandra.index.SecondaryIndexManager.isIndexColumnFamily) SecondaryIndexManager.getIndexName(org.apache.cassandra.index.SecondaryIndexManager.getIndexName) Arrays.asList(java.util.Arrays.asList) HintsService(org.apache.cassandra.hints.HintsService) JMXBroadcastExecutor(org.apache.cassandra.utils.progress.jmx.JMXBroadcastExecutor) MILLISECONDS(java.util.concurrent.TimeUnit.MILLISECONDS) FullQueryLoggerOptions(org.apache.cassandra.fql.FullQueryLoggerOptions) ViewMetadata(org.apache.cassandra.schema.ViewMetadata) Stream(java.util.stream.Stream) Predicate(com.google.common.base.Predicate) CassandraRelevantProperties(org.apache.cassandra.config.CassandraRelevantProperties) FullQueryLogger(org.apache.cassandra.fql.FullQueryLogger) Conflict(org.apache.cassandra.locator.ReplicaCollection.Builder.Conflict) KeyspaceMetadata(org.apache.cassandra.schema.KeyspaceMetadata) LoggingSupportFactory(org.apache.cassandra.utils.logging.LoggingSupportFactory) NoPayload.noPayload(org.apache.cassandra.net.NoPayload.noPayload) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ProgressEvent(org.apache.cassandra.utils.progress.ProgressEvent) java.util(java.util) OpenDataException(javax.management.openmbean.OpenDataException) CompactionManager(org.apache.cassandra.db.compaction.CompactionManager) SSTableLoader(org.apache.cassandra.io.sstable.SSTableLoader) ClientResourceLimits(org.apache.cassandra.transport.ClientResourceLimits) Global.currentTimeMillis(org.apache.cassandra.utils.Clock.Global.currentTimeMillis) Range(org.apache.cassandra.dht.Range) MINUTES(java.util.concurrent.TimeUnit.MINUTES) QueryProcessor(org.apache.cassandra.cql3.QueryProcessor) Supplier(java.util.function.Supplier) REPLICATION_DONE_REQ(org.apache.cassandra.net.Verb.REPLICATION_DONE_REQ) Schema(org.apache.cassandra.schema.Schema) ActiveRepairService(org.apache.cassandra.service.ActiveRepairService) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) FullQueryLoggerOptionsCompositeData(org.apache.cassandra.fql.FullQueryLoggerOptionsCompositeData) Predicates(com.google.common.base.Predicates) BatchlogManager(org.apache.cassandra.batchlog.BatchlogManager) StreamSupport(java.util.stream.StreamSupport) ProgressEventType(org.apache.cassandra.utils.progress.ProgressEventType) Nullable(javax.annotation.Nullable) CompositeData(javax.management.openmbean.CompositeData) IOException(java.io.IOException) UnknownHostException(java.net.UnknownHostException) IOError(java.io.IOError) ExecutionException(java.util.concurrent.ExecutionException) Paths(java.nio.file.Paths) ImmediateFuture(org.apache.cassandra.utils.concurrent.ImmediateFuture) org.apache.cassandra.net(org.apache.cassandra.net) SnapshotManager(org.apache.cassandra.service.snapshot.SnapshotManager) Preconditions(com.google.common.base.Preconditions) org.apache.cassandra.locator(org.apache.cassandra.locator) AuditLogManager(org.apache.cassandra.audit.AuditLogManager) Verifier(org.apache.cassandra.db.compaction.Verifier) org.apache.cassandra.repair(org.apache.cassandra.repair) org.apache.cassandra.streaming(org.apache.cassandra.streaming) Iterables.transform(com.google.common.collect.Iterables.transform) Iterables.tryFind(com.google.common.collect.Iterables.tryFind) MatchResult(java.util.regex.MatchResult) LoggerFactory(org.slf4j.LoggerFactory) org.apache.cassandra.db(org.apache.cassandra.db) ReplicationParams(org.apache.cassandra.schema.ReplicationParams) TimeoutException(java.util.concurrent.TimeoutException) org.apache.cassandra.gms(org.apache.cassandra.gms) com.google.common.util.concurrent(com.google.common.util.concurrent) TabularData(javax.management.openmbean.TabularData) ByteBuffer(java.nio.ByteBuffer) MigrationManager(org.apache.cassandra.schema.MigrationManager) ByteArrayInputStream(java.io.ByteArrayInputStream) Collectors.toMap(java.util.stream.Collectors.toMap) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) SSTableFormat(org.apache.cassandra.io.sstable.format.SSTableFormat) AuthSchemaChangeListener(org.apache.cassandra.auth.AuthSchemaChangeListener) PathUtils(org.apache.cassandra.io.util.PathUtils) com.google.common.collect(com.google.common.collect) DatabaseDescriptor(org.apache.cassandra.config.DatabaseDescriptor) AuditLogOptions(org.apache.cassandra.audit.AuditLogOptions) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) TombstoneOption(org.apache.cassandra.schema.CompactionParams.TombstoneOption) JMXProgressSupport(org.apache.cassandra.utils.progress.jmx.JMXProgressSupport) Instant(java.time.Instant) org.apache.cassandra.dht(org.apache.cassandra.dht) InetSocketAddress(java.net.InetSocketAddress) Collectors(java.util.stream.Collectors) UncheckedInterruptedException(org.apache.cassandra.utils.concurrent.UncheckedInterruptedException) ProgressListener(org.apache.cassandra.utils.progress.ProgressListener) AuthCacheService(org.apache.cassandra.auth.AuthCacheService) DurationSpec(org.apache.cassandra.config.DurationSpec) MigrationManager.evolveSystemKeyspace(org.apache.cassandra.schema.MigrationManager.evolveSystemKeyspace) ParameterizedClass(org.apache.cassandra.config.ParameterizedClass) LifecycleTransaction(org.apache.cassandra.db.lifecycle.LifecycleTransaction) Future(org.apache.cassandra.utils.concurrent.Future) org.apache.cassandra.exceptions(org.apache.cassandra.exceptions) FileUtils(org.apache.cassandra.io.util.FileUtils) TableMetadataRef(org.apache.cassandra.schema.TableMetadataRef) TabularDataSupport(javax.management.openmbean.TabularDataSupport) Entry(java.util.Map.Entry) org.apache.cassandra.concurrent(org.apache.cassandra.concurrent) TableMetadata(org.apache.cassandra.schema.TableMetadata) VirtualKeyspaceRegistry(org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry) Pattern(java.util.regex.Pattern) MigrationCoordinator(org.apache.cassandra.schema.MigrationCoordinator) SchemaConstants(org.apache.cassandra.schema.SchemaConstants) Arrays.stream(java.util.Arrays.stream) DataInputStream(java.io.DataInputStream) RepairOption(org.apache.cassandra.repair.messages.RepairOption) NANOSECONDS(java.util.concurrent.TimeUnit.NANOSECONDS) Config(org.apache.cassandra.config.Config) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) QueryHandler(org.apache.cassandra.cql3.QueryHandler) BOOTSTRAP_SKIP_SCHEMA_CHECK(org.apache.cassandra.config.CassandraRelevantProperties.BOOTSTRAP_SKIP_SCHEMA_CHECK) FetchReplica(org.apache.cassandra.dht.RangeStreamer.FetchReplica) ProtocolVersion(org.apache.cassandra.transport.ProtocolVersion) ExecutorService(java.util.concurrent.ExecutorService) Logger(org.slf4j.Logger) javax.management(javax.management) REPLACEMENT_ALLOW_EMPTY(org.apache.cassandra.config.CassandraRelevantProperties.REPLACEMENT_ALLOW_EMPTY) TimeUnit(java.util.concurrent.TimeUnit) Collectors.toList(java.util.stream.Collectors.toList) VisibleForTesting(com.google.common.annotations.VisibleForTesting) BOOTSTRAP_SCHEMA_DELAY_MS(org.apache.cassandra.config.CassandraRelevantProperties.BOOTSTRAP_SCHEMA_DELAY_MS) TableSnapshot(org.apache.cassandra.service.snapshot.TableSnapshot) FetchReplica(org.apache.cassandra.dht.RangeStreamer.FetchReplica)

Example 24 with Range

use of org.apache.commons.lang3.Range in project cassandra by apache.

the class SelectStatement method asCQL.

private String asCQL(QueryOptions options) {
    ColumnFilter columnFilter = selection.newSelectors(options).getColumnFilter();
    StringBuilder sb = new StringBuilder();
    sb.append("SELECT ").append(queriedColumns().toCQLString());
    sb.append(" FROM ").append(table.keyspace).append('.').append(table.name);
    if (restrictions.isKeyRange() || restrictions.usesSecondaryIndexing()) {
        // partition range
        ClusteringIndexFilter clusteringIndexFilter = makeClusteringIndexFilter(options, columnFilter);
        if (clusteringIndexFilter == null)
            return "EMPTY";
        RowFilter rowFilter = getRowFilter(options);
        // The LIMIT provided by the user is the number of CQL row he wants returned.
        // We want to have getRangeSlice to count the number of columns, not the number of keys.
        AbstractBounds<PartitionPosition> keyBounds = restrictions.getPartitionKeyBounds(options);
        if (keyBounds == null)
            return "EMPTY";
        DataRange dataRange = new DataRange(keyBounds, clusteringIndexFilter);
        if (!dataRange.isUnrestricted(table) || !rowFilter.isEmpty()) {
            sb.append(" WHERE ");
            // We put the row filter first because the data range can end by "ORDER BY"
            if (!rowFilter.isEmpty()) {
                sb.append(rowFilter);
                if (!dataRange.isUnrestricted(table))
                    sb.append(" AND ");
            }
            if (!dataRange.isUnrestricted(table))
                sb.append(dataRange.toCQLString(table, rowFilter));
        }
    } else {
        // single partition
        Collection<ByteBuffer> keys = restrictions.getPartitionKeys(options);
        if (keys.isEmpty())
            return "EMPTY";
        ClusteringIndexFilter filter = makeClusteringIndexFilter(options, columnFilter);
        if (filter == null)
            return "EMPTY";
        sb.append(" WHERE ");
        boolean compoundPk = table.partitionKeyColumns().size() > 1;
        if (compoundPk)
            sb.append('(');
        sb.append(ColumnMetadata.toCQLString(table.partitionKeyColumns()));
        if (compoundPk)
            sb.append(')');
        if (keys.size() == 1) {
            sb.append(" = ");
            if (compoundPk)
                sb.append('(');
            DataRange.appendKeyString(sb, table.partitionKeyType, Iterables.getOnlyElement(keys));
            if (compoundPk)
                sb.append(')');
        } else {
            sb.append(" IN (");
            boolean first = true;
            for (ByteBuffer key : keys) {
                if (!first)
                    sb.append(", ");
                if (compoundPk)
                    sb.append('(');
                DataRange.appendKeyString(sb, table.partitionKeyType, key);
                if (compoundPk)
                    sb.append(')');
                first = false;
            }
            sb.append(')');
        }
        RowFilter rowFilter = getRowFilter(options);
        if (!rowFilter.isEmpty())
            sb.append(" AND ").append(rowFilter);
        String filterString = filter.toCQLString(table, rowFilter);
        if (!filterString.isEmpty())
            sb.append(" AND ").append(filterString);
    }
    DataLimits limits = getDataLimits(getLimit(options), getPerPartitionLimit(options), options.getPageSize());
    if (limits != DataLimits.NONE)
        sb.append(' ').append(limits);
    return sb.toString();
}
Also used : ToStringBuilder(org.apache.commons.lang3.builder.ToStringBuilder) ByteBuffer(java.nio.ByteBuffer)

Example 25 with Range

use of org.apache.commons.lang3.Range in project cassandra by apache.

the class RangeStreamer method fetchAsync.

public StreamResultFuture fetchAsync() {
    toFetch.forEach((keyspace, sources) -> {
        logger.debug("Keyspace {} Sources {}", keyspace, sources);
        sources.asMap().forEach((source, fetchReplicas) -> {
            // filter out already streamed ranges
            SystemKeyspace.AvailableRanges available = stateStore.getAvailableRanges(keyspace, metadata.partitioner);
            Predicate<FetchReplica> isAvailable = fetch -> {
                boolean isInFull = available.full.contains(fetch.local.range());
                boolean isInTrans = available.trans.contains(fetch.local.range());
                if (!isInFull && !isInTrans)
                    // Range is unavailable
                    return false;
                if (fetch.local.isFull())
                    // For full, pick only replicas with matching transientness
                    return isInFull == fetch.remote.isFull();
                // Any transient or full will do
                return true;
            };
            List<FetchReplica> remaining = fetchReplicas.stream().filter(not(isAvailable)).collect(Collectors.toList());
            if (remaining.size() < available.full.size() + available.trans.size()) {
                List<FetchReplica> skipped = fetchReplicas.stream().filter(isAvailable).collect(Collectors.toList());
                logger.info("Some ranges of {} are already available. Skipping streaming those ranges. Skipping {}. Fully available {} Transiently available {}", fetchReplicas, skipped, available.full, available.trans);
            }
            if (logger.isTraceEnabled())
                logger.trace("{}ing from {} ranges {}", description, source, StringUtils.join(remaining, ", "));
            InetAddressAndPort self = FBUtilities.getBroadcastAddressAndPort();
            RangesAtEndpoint full = remaining.stream().filter(pair -> pair.remote.isFull()).map(pair -> pair.local).collect(RangesAtEndpoint.collector(self));
            RangesAtEndpoint transientReplicas = remaining.stream().filter(pair -> pair.remote.isTransient()).map(pair -> pair.local).collect(RangesAtEndpoint.collector(self));
            logger.debug("Source and our replicas {}", fetchReplicas);
            logger.debug("Source {} Keyspace {}  streaming full {} transient {}", source, keyspace, full, transientReplicas);
            /* Send messages to respective folks to stream data over to me */
            streamPlan.requestRanges(source, keyspace, full, transientReplicas);
        });
    });
    return streamPlan.execute();
}
Also used : BiFunction(java.util.function.BiFunction) LoggerFactory(org.slf4j.LoggerFactory) Iterables.all(com.google.common.collect.Iterables.all) StringUtils(org.apache.commons.lang3.StringUtils) Gossiper(org.apache.cassandra.gms.Gossiper) NetworkTopologyStrategy(org.apache.cassandra.locator.NetworkTopologyStrategy) Predicates.and(com.google.common.base.Predicates.and) StreamResultFuture(org.apache.cassandra.streaming.StreamResultFuture) Replica.fullReplica(org.apache.cassandra.locator.Replica.fullReplica) HashMultimap(com.google.common.collect.HashMultimap) Replicas(org.apache.cassandra.locator.Replicas) Endpoints(org.apache.cassandra.locator.Endpoints) Predicates.not(com.google.common.base.Predicates.not) ReplicaCollection(org.apache.cassandra.locator.ReplicaCollection) Map(java.util.Map) EndpointsByRange(org.apache.cassandra.locator.EndpointsByRange) Keyspace(org.apache.cassandra.db.Keyspace) EndpointsForRange(org.apache.cassandra.locator.EndpointsForRange) FBUtilities(org.apache.cassandra.utils.FBUtilities) Collection(java.util.Collection) Set(java.util.Set) Collectors(java.util.stream.Collectors) RangesAtEndpoint(org.apache.cassandra.locator.RangesAtEndpoint) List(java.util.List) Predicate(com.google.common.base.Predicate) Conflict(org.apache.cassandra.locator.ReplicaCollection.Builder.Conflict) Optional(java.util.Optional) FailureDetector(org.apache.cassandra.gms.FailureDetector) Iterables.any(com.google.common.collect.Iterables.any) InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) Iterables(com.google.common.collect.Iterables) HashMap(java.util.HashMap) Multimap(com.google.common.collect.Multimap) Function(java.util.function.Function) SystemKeyspace(org.apache.cassandra.db.SystemKeyspace) ArrayList(java.util.ArrayList) IEndpointSnitch(org.apache.cassandra.locator.IEndpointSnitch) TokenMetadata(org.apache.cassandra.locator.TokenMetadata) ImmutableMultimap(com.google.common.collect.ImmutableMultimap) StreamOperation(org.apache.cassandra.streaming.StreamOperation) Logger(org.slf4j.Logger) Replica(org.apache.cassandra.locator.Replica) IFailureDetector(org.apache.cassandra.gms.IFailureDetector) PreviewKind(org.apache.cassandra.streaming.PreviewKind) AbstractReplicationStrategy(org.apache.cassandra.locator.AbstractReplicationStrategy) StreamPlan(org.apache.cassandra.streaming.StreamPlan) EndpointsByReplica(org.apache.cassandra.locator.EndpointsByReplica) Preconditions(com.google.common.base.Preconditions) VisibleForTesting(com.google.common.annotations.VisibleForTesting) LocalStrategy(org.apache.cassandra.locator.LocalStrategy) InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) RangesAtEndpoint(org.apache.cassandra.locator.RangesAtEndpoint) SystemKeyspace(org.apache.cassandra.db.SystemKeyspace)

Aggregations

List (java.util.List)30 HashMap (java.util.HashMap)24 Map (java.util.Map)24 ArrayList (java.util.ArrayList)23 Collectors (java.util.stream.Collectors)21 StringUtils (org.apache.commons.lang3.StringUtils)20 LoggerFactory (org.slf4j.LoggerFactory)17 Pair (org.apache.commons.lang3.tuple.Pair)16 Logger (org.slf4j.Logger)16 Set (java.util.Set)15 IOException (java.io.IOException)14 Optional (java.util.Optional)12 Range (org.apache.commons.lang3.Range)11 Test (org.junit.jupiter.api.Test)11 java.util (java.util)10 Date (java.util.Date)10 Lists (com.google.common.collect.Lists)9 HashSet (java.util.HashSet)9 ExecutorService (java.util.concurrent.ExecutorService)9 Collection (java.util.Collection)8