Search in sources :

Example 21 with Future

use of org.apache.cassandra.utils.concurrent.Future in project cassandra by apache.

the class RepairJob method sendSequentialValidationRequest.

/**
 * Creates {@link ValidationTask} and submit them to task executor so that tasks run sequentially.
 */
private Future<List<TreeResponse>> sendSequentialValidationRequest(Collection<InetAddressAndPort> endpoints) {
    state.phase.validationSubmitted();
    String message = String.format("Requesting merkle trees for %s (to %s)", desc.columnFamily, endpoints);
    logger.info("{} {}", session.previewKind.logPrefix(desc.sessionId), message);
    Tracing.traceRepair(message);
    int nowInSec = getNowInSeconds();
    List<Future<TreeResponse>> tasks = new ArrayList<>(endpoints.size());
    Queue<InetAddressAndPort> requests = new LinkedList<>(endpoints);
    InetAddressAndPort address = requests.poll();
    ValidationTask firstTask = newValidationTask(address, nowInSec);
    logger.info("{} Validating {}", session.previewKind.logPrefix(desc.sessionId), address);
    session.trackValidationCompletion(Pair.create(desc, address), firstTask);
    tasks.add(firstTask);
    ValidationTask currentTask = firstTask;
    while (requests.size() > 0) {
        final InetAddressAndPort nextAddress = requests.poll();
        final ValidationTask nextTask = newValidationTask(nextAddress, nowInSec);
        tasks.add(nextTask);
        currentTask.addCallback(new FutureCallback<TreeResponse>() {

            public void onSuccess(TreeResponse result) {
                logger.info("{} Validating {}", session.previewKind.logPrefix(desc.sessionId), nextAddress);
                session.trackValidationCompletion(Pair.create(desc, nextAddress), nextTask);
                taskExecutor.execute(nextTask);
            }

            // failure is handled at root of job chain
            public void onFailure(Throwable t) {
            }
        });
        currentTask = nextTask;
    }
    // start running tasks
    taskExecutor.execute(firstTask);
    return FutureCombiner.allOf(tasks);
}
Also used : InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) AsyncFuture(org.apache.cassandra.utils.concurrent.AsyncFuture) Future(org.apache.cassandra.utils.concurrent.Future) ImmediateFuture(org.apache.cassandra.utils.concurrent.ImmediateFuture)

Example 22 with Future

use of org.apache.cassandra.utils.concurrent.Future in project cassandra by apache.

the class ActiveRepairService method repairPaxosForTopologyChange.

public Future<?> repairPaxosForTopologyChange(String ksName, Collection<Range<Token>> ranges, String reason) {
    if (!paxosRepairEnabled()) {
        logger.warn("Not running paxos repair for topology change because paxos repair has been disabled");
        return ImmediateFuture.success(null);
    }
    if (ranges.isEmpty()) {
        logger.warn("Not running paxos repair for topology change because there are no ranges to repair");
        return ImmediateFuture.success(null);
    }
    List<TableMetadata> tables = Lists.newArrayList(Schema.instance.getKeyspaceMetadata(ksName).tables);
    List<Future<Void>> futures = new ArrayList<>(ranges.size() * tables.size());
    Keyspace keyspace = Keyspace.open(ksName);
    AbstractReplicationStrategy replication = keyspace.getReplicationStrategy();
    for (Range<Token> range : ranges) {
        for (TableMetadata table : tables) {
            Set<InetAddressAndPort> endpoints = replication.getNaturalReplicas(range.right).filter(FailureDetector.isReplicaAlive).endpoints();
            if (!PaxosRepair.hasSufficientLiveNodesForTopologyChange(keyspace, range, endpoints)) {
                Set<InetAddressAndPort> downEndpoints = replication.getNaturalReplicas(range.right).filter(e -> !endpoints.contains(e)).endpoints();
                downEndpoints.removeAll(endpoints);
                throw new RuntimeException(String.format("Insufficient live nodes to repair paxos for %s in %s for %s.\n" + "There must be enough live nodes to satisfy EACH_QUORUM, but the following nodes are down: %s\n" + "This check can be skipped by setting either the yaml property skip_paxos_repair_on_topology_change or " + "the system property cassandra.skip_paxos_repair_on_topology_change to false. The jmx property " + "StorageService.SkipPaxosRepairOnTopologyChange can also be set to false to temporarily disable without " + "restarting the node\n" + "Individual keyspaces can be skipped with the yaml property skip_paxos_repair_on_topology_change_keyspaces, the" + "system property cassandra.skip_paxos_repair_on_topology_change_keyspaces, or temporarily with the jmx" + "property StorageService.SkipPaxosRepairOnTopologyChangeKeyspaces\n" + "Skipping this check can lead to paxos correctness issues", range, ksName, reason, downEndpoints));
            }
            EndpointsForToken pending = StorageService.instance.getTokenMetadata().pendingEndpointsForToken(range.right, ksName);
            if (pending.size() > 1 && !Boolean.getBoolean("cassandra.paxos_repair_allow_multiple_pending_unsafe")) {
                throw new RuntimeException(String.format("Cannot begin paxos auto repair for %s in %s.%s, multiple pending endpoints exist for range (%s). " + "Set -Dcassandra.paxos_repair_allow_multiple_pending_unsafe=true to skip this check", range, table.keyspace, table.name, pending));
            }
            Future<Void> future = PaxosCleanup.cleanup(endpoints, table, Collections.singleton(range), false, repairCommandExecutor());
            futures.add(future);
        }
    }
    return FutureCombiner.allOf(futures);
}
Also used : TableMetadata(org.apache.cassandra.schema.TableMetadata) VersionedValue(org.apache.cassandra.gms.VersionedValue) NoSuchRepairSessionException(org.apache.cassandra.repair.NoSuchRepairSessionException) IEndpointStateChangeSubscriber(org.apache.cassandra.gms.IEndpointStateChangeSubscriber) EndpointsForToken(org.apache.cassandra.locator.EndpointsForToken) LocalSessions(org.apache.cassandra.repair.consistent.LocalSessions) CoordinatorState(org.apache.cassandra.repair.state.CoordinatorState) Global.nanoTime(org.apache.cassandra.utils.Clock.Global.nanoTime) PrepareMessage(org.apache.cassandra.repair.messages.PrepareMessage) CoordinatorSessions(org.apache.cassandra.repair.consistent.CoordinatorSessions) Simulate(org.apache.cassandra.utils.Simulate) Pair(org.apache.cassandra.utils.Pair) RepairedState(org.apache.cassandra.repair.consistent.RepairedState) Generator.nextTimeUUID(org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID) RepairMetrics(org.apache.cassandra.metrics.RepairMetrics) EndpointsByRange(org.apache.cassandra.locator.EndpointsByRange) IFailureDetectionEventListener(org.apache.cassandra.gms.IFailureDetectionEventListener) Keyspace(org.apache.cassandra.db.Keyspace) PendingStats(org.apache.cassandra.repair.consistent.admin.PendingStats) FBUtilities(org.apache.cassandra.utils.FBUtilities) RepairSession(org.apache.cassandra.repair.RepairSession) Verb(org.apache.cassandra.net.Verb) MILLISECONDS(java.util.concurrent.TimeUnit.MILLISECONDS) CommonRange(org.apache.cassandra.repair.CommonRange) ObjectSizes(org.apache.cassandra.utils.ObjectSizes) InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) java.util(java.util) Iterables(com.google.common.collect.Iterables) CompactionManager(org.apache.cassandra.db.compaction.CompactionManager) MerkleTrees(org.apache.cassandra.utils.MerkleTrees) TableId(org.apache.cassandra.schema.TableId) PaxosRepair(org.apache.cassandra.service.paxos.PaxosRepair) Global.currentTimeMillis(org.apache.cassandra.utils.Clock.Global.currentTimeMillis) Range(org.apache.cassandra.dht.Range) Message(org.apache.cassandra.net.Message) RepairParallelism(org.apache.cassandra.repair.RepairParallelism) Schema(org.apache.cassandra.schema.Schema) SchemaArgsParser(org.apache.cassandra.repair.consistent.admin.SchemaArgsParser) Token(org.apache.cassandra.dht.Token) Lists(com.google.common.collect.Lists) CountDownLatch.newCountDownLatch(org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch) CleanupSummary(org.apache.cassandra.repair.consistent.admin.CleanupSummary) MessagingService(org.apache.cassandra.net.MessagingService) PaxosCleanup(org.apache.cassandra.service.paxos.cleanup.PaxosCleanup) ApplicationState(org.apache.cassandra.gms.ApplicationState) FutureCombiner(org.apache.cassandra.utils.concurrent.FutureCombiner) CompositeData(javax.management.openmbean.CompositeData) IOException(java.io.IOException) RequestFailureReason(org.apache.cassandra.exceptions.RequestFailureReason) UnknownHostException(java.net.UnknownHostException) CleanupMessage(org.apache.cassandra.repair.messages.CleanupMessage) ExecutorPlus(org.apache.cassandra.concurrent.ExecutorPlus) PreviewKind(org.apache.cassandra.streaming.PreviewKind) RepairMessage(org.apache.cassandra.repair.messages.RepairMessage) ImmediateFuture(org.apache.cassandra.utils.concurrent.ImmediateFuture) Global.executorFactory(org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory) Preconditions(com.google.common.base.Preconditions) TimeUUID(org.apache.cassandra.utils.TimeUUID) RepairJobDesc(org.apache.cassandra.repair.RepairJobDesc) EndpointState(org.apache.cassandra.gms.EndpointState) ScheduledExecutors(org.apache.cassandra.concurrent.ScheduledExecutors) MONITORS(org.apache.cassandra.utils.Simulate.With.MONITORS) ScheduledFuture(java.util.concurrent.ScheduledFuture) Iterables.transform(com.google.common.collect.Iterables.transform) LoggerFactory(org.slf4j.LoggerFactory) TimeoutException(java.util.concurrent.TimeoutException) CountDownLatch(org.apache.cassandra.utils.concurrent.CountDownLatch) Collections.synchronizedSet(java.util.Collections.synchronizedSet) Message.out(org.apache.cassandra.net.Message.out) Gossiper(org.apache.cassandra.gms.Gossiper) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Iterables.concat(com.google.common.collect.Iterables.concat) DatabaseDescriptor(org.apache.cassandra.config.DatabaseDescriptor) EndpointsForRange(org.apache.cassandra.locator.EndpointsForRange) ImmutableSet(com.google.common.collect.ImmutableSet) Predicate(java.util.function.Predicate) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) RequestCallback(org.apache.cassandra.net.RequestCallback) Collectors(java.util.stream.Collectors) DurationSpec(org.apache.cassandra.config.DurationSpec) ParticipateState(org.apache.cassandra.repair.state.ParticipateState) ColumnFamilyStore(org.apache.cassandra.db.ColumnFamilyStore) Future(org.apache.cassandra.utils.concurrent.Future) TableMetadata(org.apache.cassandra.schema.TableMetadata) CacheBuilder(com.google.common.cache.CacheBuilder) FailureDetector(org.apache.cassandra.gms.FailureDetector) MoreExecutors(com.google.common.util.concurrent.MoreExecutors) RepairOption(org.apache.cassandra.repair.messages.RepairOption) ThreadPoolExecutor(java.util.concurrent.ThreadPoolExecutor) RepairCommandPoolFullStrategy.reject(org.apache.cassandra.config.Config.RepairCommandPoolFullStrategy.reject) Config(org.apache.cassandra.config.Config) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Multimap(com.google.common.collect.Multimap) ConcurrentMap(java.util.concurrent.ConcurrentMap) RepairStats(org.apache.cassandra.repair.consistent.admin.RepairStats) TokenMetadata(org.apache.cassandra.locator.TokenMetadata) SyncResponse(org.apache.cassandra.repair.messages.SyncResponse) Nullable(org.checkerframework.checker.nullness.qual.Nullable) Logger(org.slf4j.Logger) TimeUnit(java.util.concurrent.TimeUnit) IFailureDetector(org.apache.cassandra.gms.IFailureDetector) AbstractReplicationStrategy(org.apache.cassandra.locator.AbstractReplicationStrategy) PREPARE_MSG(org.apache.cassandra.net.Verb.PREPARE_MSG) ValidationResponse(org.apache.cassandra.repair.messages.ValidationResponse) MBeanWrapper(org.apache.cassandra.utils.MBeanWrapper) VisibleForTesting(com.google.common.annotations.VisibleForTesting) ValidationState(org.apache.cassandra.repair.state.ValidationState) Cache(com.google.common.cache.Cache) ExecutorUtils(org.apache.cassandra.utils.ExecutorUtils) InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) EndpointsForToken(org.apache.cassandra.locator.EndpointsForToken) EndpointsForToken(org.apache.cassandra.locator.EndpointsForToken) Token(org.apache.cassandra.dht.Token) Keyspace(org.apache.cassandra.db.Keyspace) ImmediateFuture(org.apache.cassandra.utils.concurrent.ImmediateFuture) ScheduledFuture(java.util.concurrent.ScheduledFuture) Future(org.apache.cassandra.utils.concurrent.Future) AbstractReplicationStrategy(org.apache.cassandra.locator.AbstractReplicationStrategy)

Example 23 with Future

use of org.apache.cassandra.utils.concurrent.Future in project cassandra by apache.

the class StorageService method drain.

protected synchronized void drain(boolean isFinalShutdown) throws IOException, InterruptedException, ExecutionException {
    if (Stage.areMutationExecutorsTerminated()) {
        if (!isFinalShutdown)
            logger.warn("Cannot drain node (did it already happen?)");
        return;
    }
    assert !isShutdown;
    isShutdown = true;
    Throwable preShutdownHookThrowable = Throwables.perform(null, preShutdownHooks.stream().map(h -> h::run));
    if (preShutdownHookThrowable != null)
        logger.error("Attempting to continue draining after pre-shutdown hooks returned exception", preShutdownHookThrowable);
    try {
        setMode(Mode.DRAINING, "starting drain process", !isFinalShutdown);
        try {
            /* not clear this is reasonable time, but propagated from prior embedded behaviour */
            BatchlogManager.instance.shutdownAndWait(1L, MINUTES);
        } catch (TimeoutException t) {
            logger.error("Batchlog manager timed out shutting down", t);
        }
        snapshotManager.stop();
        HintsService.instance.pauseDispatch();
        if (daemon != null)
            shutdownClientServers();
        ScheduledExecutors.optionalTasks.shutdown();
        Gossiper.instance.stop();
        ActiveRepairService.instance.stop();
        if (!isFinalShutdown)
            setMode(Mode.DRAINING, "shutting down MessageService", false);
        // before mutation stage, so we can get all the hints saved before shutting down.
        try {
            MessagingService.instance().shutdown();
        } catch (Throwable t) {
            // prevent messaging service timing out shutdown from aborting
            // drain process; otherwise drain and/or shutdown might throw
            logger.error("Messaging service timed out shutting down", t);
        }
        if (!isFinalShutdown)
            setMode(Mode.DRAINING, "clearing mutation stage", false);
        Stage.shutdownAndAwaitMutatingExecutors(false, DRAIN_EXECUTOR_TIMEOUT_MS.getInt(), TimeUnit.MILLISECONDS);
        StorageProxy.instance.verifyNoHintsInProgress();
        if (!isFinalShutdown)
            setMode(Mode.DRAINING, "flushing column families", false);
        // we don't want to start any new compactions while we are draining
        disableAutoCompaction();
        // count CFs first, since forceFlush could block for the flushWriter to get a queue slot empty
        totalCFs = 0;
        for (Keyspace keyspace : Keyspace.nonSystem()) totalCFs += keyspace.getColumnFamilyStores().size();
        remainingCFs = totalCFs;
        // flush
        List<Future<?>> flushes = new ArrayList<>();
        for (Keyspace keyspace : Keyspace.nonSystem()) {
            for (ColumnFamilyStore cfs : keyspace.getColumnFamilyStores()) flushes.add(cfs.forceFlush(ColumnFamilyStore.FlushReason.DRAIN));
        }
        // thus make several short ones "instant" if we wait for them later.
        for (Future f : flushes) {
            try {
                FBUtilities.waitOnFuture(f);
            } catch (Throwable t) {
                JVMStabilityInspector.inspectThrowable(t);
                // don't let this stop us from shutting down the commitlog and other thread pools
                logger.warn("Caught exception while waiting for memtable flushes during shutdown hook", t);
            }
            remainingCFs--;
        }
        // Interrupt ongoing compactions and shutdown CM to prevent further compactions.
        CompactionManager.instance.forceShutdown();
        // Flush the system tables after all other tables are flushed, just in case flushing modifies any system state
        // like CASSANDRA-5151. Don't bother with progress tracking since system data is tiny.
        // Flush system tables after stopping compactions since they modify
        // system tables (for example compactions can obsolete sstables and the tidiers in SSTableReader update
        // system tables, see SSTableReader.GlobalTidy)
        flushes.clear();
        for (Keyspace keyspace : Keyspace.system()) {
            for (ColumnFamilyStore cfs : keyspace.getColumnFamilyStores()) flushes.add(cfs.forceFlush(ColumnFamilyStore.FlushReason.DRAIN));
        }
        FBUtilities.waitOnFutures(flushes);
        SnapshotManager.shutdownAndWait(1L, MINUTES);
        HintsService.instance.shutdownBlocking();
        // Interrupt ongoing compactions and shutdown CM to prevent further compactions.
        CompactionManager.instance.forceShutdown();
        // whilst we've flushed all the CFs, which will have recycled all completed segments, we want to ensure
        // there are no segments to replay, so we force the recycling of any remaining (should be at most one)
        CommitLog.instance.forceRecycleAllSegments();
        CommitLog.instance.shutdownBlocking();
        // wait for miscellaneous tasks like sstable and commitlog segment deletion
        ColumnFamilyStore.shutdownPostFlushExecutor();
        try {
            // we are not shutting down ScheduledExecutors#scheduledFastTasks to be still able to progress time
            // fast-tasks executor is shut down in StorageService's shutdown hook added to Runtime
            ExecutorUtils.shutdownNowAndWait(1, MINUTES, ScheduledExecutors.nonPeriodicTasks, ScheduledExecutors.scheduledTasks, ScheduledExecutors.optionalTasks);
        } finally {
            setMode(Mode.DRAINED, !isFinalShutdown);
        }
    } catch (Throwable t) {
        logger.error("Caught an exception while draining ", t);
    } finally {
        Throwable postShutdownHookThrowable = Throwables.perform(null, postShutdownHooks.stream().map(h -> h::run));
        if (postShutdownHookThrowable != null)
            logger.error("Post-shutdown hooks returned exception", postShutdownHookThrowable);
    }
}
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) SnapshotLoader(org.apache.cassandra.service.snapshot.SnapshotLoader) Keyspaces(org.apache.cassandra.schema.Keyspaces) JMXBroadcastExecutor(org.apache.cassandra.utils.progress.jmx.JMXBroadcastExecutor) DataStorageSpec(org.apache.cassandra.config.DataStorageSpec) MILLISECONDS(java.util.concurrent.TimeUnit.MILLISECONDS) FullQueryLoggerOptions(org.apache.cassandra.fql.FullQueryLoggerOptions) PaxosStatePurging(org.apache.cassandra.config.Config.PaxosStatePurging) 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) Joiner(com.google.common.base.Joiner) 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) TableId(org.apache.cassandra.schema.TableId) 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) DRAIN_EXECUTOR_TIMEOUT_MS(org.apache.cassandra.config.CassandraRelevantProperties.DRAIN_EXECUTOR_TIMEOUT_MS) MessagingService(org.apache.cassandra.net.MessagingService) FutureCombiner(org.apache.cassandra.utils.concurrent.FutureCombiner) 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) DiskUsageBroadcaster(org.apache.cassandra.service.disk.usage.DiskUsageBroadcaster) 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) AsyncOneResponse(org.apache.cassandra.net.AsyncOneResponse) org.apache.cassandra.service.paxos.cleanup(org.apache.cassandra.service.paxos.cleanup) 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) ByteArrayInputStream(java.io.ByteArrayInputStream) Collectors.toMap(java.util.stream.Collectors.toMap) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) FBUtilities.now(org.apache.cassandra.utils.FBUtilities.now) 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) ProgressListener(org.apache.cassandra.utils.progress.ProgressListener) UncheckedInterruptedException(org.apache.cassandra.utils.concurrent.UncheckedInterruptedException) AuthCacheService(org.apache.cassandra.auth.AuthCacheService) DurationSpec(org.apache.cassandra.config.DurationSpec) 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) SchemaConstants(org.apache.cassandra.schema.SchemaConstants) Arrays.stream(java.util.Arrays.stream) org.apache.cassandra.service.paxos(org.apache.cassandra.service.paxos) 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) SchemaTransformations(org.apache.cassandra.schema.SchemaTransformations) 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) SECONDS(java.util.concurrent.TimeUnit.SECONDS) TraceKeyspace(org.apache.cassandra.tracing.TraceKeyspace) AuthKeyspace(org.apache.cassandra.auth.AuthKeyspace) SystemDistributedKeyspace(org.apache.cassandra.schema.SystemDistributedKeyspace) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ImmediateFuture(org.apache.cassandra.utils.concurrent.ImmediateFuture) Future(org.apache.cassandra.utils.concurrent.Future) TimeoutException(java.util.concurrent.TimeoutException)

Example 24 with Future

use of org.apache.cassandra.utils.concurrent.Future in project cassandra by apache.

the class StorageService method startRepairPaxosForTopologyChange.

@VisibleForTesting
public Future<?> startRepairPaxosForTopologyChange(String reason) {
    logger.info("repairing paxos for {}", reason);
    List<Future<?>> futures = new ArrayList<>();
    Keyspaces keyspaces = Schema.instance.getNonLocalStrategyKeyspaces();
    for (String ksName : keyspaces.names()) {
        if (SchemaConstants.REPLICATED_SYSTEM_KEYSPACE_NAMES.contains(ksName))
            continue;
        if (DatabaseDescriptor.skipPaxosRepairOnTopologyChangeKeyspaces().contains(ksName))
            continue;
        List<Range<Token>> ranges = getLocalAndPendingRanges(ksName);
        futures.add(ActiveRepairService.instance.repairPaxosForTopologyChange(ksName, ranges, reason));
    }
    return FutureCombiner.allOf(futures);
}
Also used : Keyspaces(org.apache.cassandra.schema.Keyspaces) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) ImmediateFuture(org.apache.cassandra.utils.concurrent.ImmediateFuture) Future(org.apache.cassandra.utils.concurrent.Future) Range(org.apache.cassandra.dht.Range) VisibleForTesting(com.google.common.annotations.VisibleForTesting)

Example 25 with Future

use of org.apache.cassandra.utils.concurrent.Future in project cassandra by apache.

the class OnClusterLeave method performSimple.

public ActionList performSimple() {
    IInvokableInstance leaveInstance = actions.cluster.get(leaving);
    before(leaveInstance);
    AtomicReference<Supplier<? extends Future<?>>> preparedUnbootstrap = new AtomicReference<>();
    return ActionList.of(// setup the node's own gossip state for pending ownership, and return gossip actions to disseminate
    new OnClusterUpdateGossip(actions, leaving, new OnInstanceSetLeaving(actions, leaving)), new SimulatedActionConsumer<>("Prepare unbootstrap on " + leaving, RELIABLE_NO_TIMEOUTS, RELIABLE_NO_TIMEOUTS, actions, leaveInstance, ref -> ref.set(StorageService.instance.prepareUnbootstrapStreaming()), preparedUnbootstrap), new OnInstanceTopologyChangePaxosRepair(actions, leaving, "Leave"), new SimulatedActionConsumer<>("Execute unbootstrap on " + leaving, RELIABLE_NO_TIMEOUTS, RELIABLE_NO_TIMEOUTS, actions, leaveInstance, ref -> ref.get().get().syncThrowUncheckedOnInterrupt(), preparedUnbootstrap), // setup the node's own gossip state for natural ownership, and return gossip actions to disseminate
    new OnClusterUpdateGossip(actions, leaving, new OnInstanceSetLeft(actions, leaving)));
}
Also used : SimulatedActionConsumer(org.apache.cassandra.simulator.systems.SimulatedActionConsumer) RELIABLE_NO_TIMEOUTS(org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS) LazyToString.lazy(org.apache.cassandra.utils.LazyToString.lazy) IInvokableInstance(org.apache.cassandra.distributed.api.IInvokableInstance) Future(org.apache.cassandra.utils.concurrent.Future) StorageService(org.apache.cassandra.service.StorageService) ActionList(org.apache.cassandra.simulator.ActionList) AtomicReference(java.util.concurrent.atomic.AtomicReference) Supplier(java.util.function.Supplier) IInvokableInstance(org.apache.cassandra.distributed.api.IInvokableInstance) Future(org.apache.cassandra.utils.concurrent.Future) Supplier(java.util.function.Supplier) AtomicReference(java.util.concurrent.atomic.AtomicReference)

Aggregations

Future (org.apache.cassandra.utils.concurrent.Future)31 ImmediateFuture (org.apache.cassandra.utils.concurrent.ImmediateFuture)14 InetAddressAndPort (org.apache.cassandra.locator.InetAddressAndPort)12 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)8 DatabaseDescriptor (org.apache.cassandra.config.DatabaseDescriptor)8 Test (org.junit.Test)8 VisibleForTesting (com.google.common.annotations.VisibleForTesting)7 CopyOnWriteArrayList (java.util.concurrent.CopyOnWriteArrayList)7 Collectors (java.util.stream.Collectors)7 Range (org.apache.cassandra.dht.Range)7 Logger (org.slf4j.Logger)7 LoggerFactory (org.slf4j.LoggerFactory)7 TimeUnit (java.util.concurrent.TimeUnit)6 ColumnFamilyStore (org.apache.cassandra.db.ColumnFamilyStore)6 CoordinatedRepairResult (org.apache.cassandra.repair.CoordinatedRepairResult)6 Schema (org.apache.cassandra.schema.Schema)6 FutureCombiner (org.apache.cassandra.utils.concurrent.FutureCombiner)6 Preconditions (com.google.common.base.Preconditions)5 IOException (java.io.IOException)5 java.util (java.util)5