Search in sources :

Example 1 with PrepareConsistentRequest

use of org.apache.cassandra.repair.messages.PrepareConsistentRequest in project cassandra by apache.

the class CoordinatorSession method prepare.

public ListenableFuture<Boolean> prepare(Executor executor) {
    Preconditions.checkArgument(allStates(State.PREPARING));
    logger.debug("Sending PrepareConsistentRequest message to {}", participants);
    PrepareConsistentRequest message = new PrepareConsistentRequest(sessionID, coordinator, participants);
    for (final InetAddress participant : participants) {
        executor.execute(() -> sendMessage(participant, message));
    }
    return prepareFuture;
}
Also used : PrepareConsistentRequest(org.apache.cassandra.repair.messages.PrepareConsistentRequest) InetAddress(java.net.InetAddress)

Example 2 with PrepareConsistentRequest

use of org.apache.cassandra.repair.messages.PrepareConsistentRequest in project cassandra by apache.

the class LocalSessions method handlePrepareMessage.

/**
 * The PrepareConsistentRequest promotes the parent repair session to a consistent incremental
 * session, and isolates the data to be repaired from the rest of the table's data
 *
 * No response is sent to the repair coordinator until the data preparation / isolation has completed
 * successfully. If the data preparation fails, a failure message is sent to the coordinator,
 * cancelling the session.
 */
public void handlePrepareMessage(InetAddressAndPort from, PrepareConsistentRequest request) {
    logger.trace("received {} from {}", request, from);
    UUID sessionID = request.parentSession;
    InetAddressAndPort coordinator = request.coordinator;
    Set<InetAddressAndPort> peers = request.participants;
    ActiveRepairService.ParentRepairSession parentSession;
    try {
        parentSession = getParentRepairSession(sessionID);
    } catch (Throwable e) {
        logger.error("Error retrieving ParentRepairSession for session {}, responding with failure", sessionID);
        sendMessage(coordinator, Message.out(PREPARE_CONSISTENT_RSP, new PrepareConsistentResponse(sessionID, getBroadcastAddressAndPort(), false)));
        return;
    }
    LocalSession session = createSessionUnsafe(sessionID, parentSession, peers);
    putSessionUnsafe(session);
    logger.info("Beginning local incremental repair session {}", session);
    ExecutorService executor = executorFactory().pooled("Repair-" + sessionID, parentSession.getColumnFamilyStores().size());
    KeyspaceRepairManager repairManager = parentSession.getKeyspace().getRepairManager();
    RangesAtEndpoint tokenRanges = filterLocalRanges(parentSession.getKeyspace().getName(), parentSession.getRanges());
    Future<List<Void>> repairPreparation = prepareSession(repairManager, sessionID, parentSession.getColumnFamilyStores(), tokenRanges, executor, () -> session.getState() != PREPARING);
    repairPreparation.addCallback(new FutureCallback<List<Void>>() {

        public void onSuccess(@Nullable List<Void> result) {
            try {
                logger.info("Prepare phase for incremental repair session {} completed", sessionID);
                if (session.getState() != FAILED)
                    setStateAndSave(session, PREPARED);
                else
                    logger.info("Session {} failed before anticompaction completed", sessionID);
                Message<PrepareConsistentResponse> message = Message.out(PREPARE_CONSISTENT_RSP, new PrepareConsistentResponse(sessionID, getBroadcastAddressAndPort(), session.getState() != FAILED));
                sendMessage(coordinator, message);
            } finally {
                executor.shutdown();
            }
        }

        public void onFailure(Throwable t) {
            try {
                if (Throwables.anyCauseMatches(t, (throwable) -> throwable instanceof CompactionInterruptedException))
                    logger.info("Anticompaction interrupted for session {}: {}", sessionID, t.getMessage());
                else if (Throwables.anyCauseMatches(t, (throwable) -> throwable instanceof NoSuchRepairSessionException))
                    logger.warn("No such repair session: {}", sessionID);
                else
                    logger.error("Prepare phase for incremental repair session {} failed", sessionID, t);
                sendMessage(coordinator, Message.out(PREPARE_CONSISTENT_RSP, new PrepareConsistentResponse(sessionID, getBroadcastAddressAndPort(), false)));
                failSession(sessionID, false);
            } finally {
                executor.shutdown();
            }
        }
    });
}
Also used : NoSuchRepairSessionException(org.apache.cassandra.repair.NoSuchRepairSessionException) KeyspaceRepairManager(org.apache.cassandra.repair.KeyspaceRepairManager) Date(java.util.Date) LoggerFactory(org.slf4j.LoggerFactory) STATUS_REQ(org.apache.cassandra.net.Verb.STATUS_REQ) CompactionInterruptedException(org.apache.cassandra.db.compaction.CompactionInterruptedException) ByteBuffer(java.nio.ByteBuffer) BooleanSupplier(java.util.function.BooleanSupplier) Map(java.util.Map) DatabaseDescriptor(org.apache.cassandra.config.DatabaseDescriptor) PendingStats(org.apache.cassandra.repair.consistent.admin.PendingStats) Verify(com.google.common.base.Verify) ImmutableSet(com.google.common.collect.ImmutableSet) FBUtilities(org.apache.cassandra.utils.FBUtilities) ImmutableMap(com.google.common.collect.ImmutableMap) Predicate(java.util.function.Predicate) Collection(java.util.Collection) FinalizeCommit(org.apache.cassandra.repair.messages.FinalizeCommit) Set(java.util.Set) UUID(java.util.UUID) Instant(java.time.Instant) CopyOnWriteArraySet(java.util.concurrent.CopyOnWriteArraySet) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) RangesAtEndpoint(org.apache.cassandra.locator.RangesAtEndpoint) FinalizePropose(org.apache.cassandra.repair.messages.FinalizePropose) State(org.apache.cassandra.repair.consistent.ConsistentSession.State) List(java.util.List) FAILED_SESSION_MSG(org.apache.cassandra.net.Verb.FAILED_SESSION_MSG) ColumnFamilyStore(org.apache.cassandra.db.ColumnFamilyStore) Future(org.apache.cassandra.utils.concurrent.Future) Throwables(org.apache.cassandra.utils.Throwables) FINALIZE_PROMISE_MSG(org.apache.cassandra.net.Verb.FINALIZE_PROMISE_MSG) FailureDetector(org.apache.cassandra.gms.FailureDetector) SchemaConstants(org.apache.cassandra.schema.SchemaConstants) DataInputBuffer(org.apache.cassandra.io.util.DataInputBuffer) InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) Iterables(com.google.common.collect.Iterables) PendingStat(org.apache.cassandra.repair.consistent.admin.PendingStat) PrepareConsistentResponse(org.apache.cassandra.repair.messages.PrepareConsistentResponse) DataOutputBuffer(org.apache.cassandra.io.util.DataOutputBuffer) TableId(org.apache.cassandra.schema.TableId) PREPARE_CONSISTENT_RSP(org.apache.cassandra.net.Verb.PREPARE_CONSISTENT_RSP) Range(org.apache.cassandra.dht.Range) HashMap(java.util.HashMap) Message(org.apache.cassandra.net.Message) QueryProcessor(org.apache.cassandra.cql3.QueryProcessor) FinalizePromise(org.apache.cassandra.repair.messages.FinalizePromise) SystemKeyspace(org.apache.cassandra.db.SystemKeyspace) ArrayList(java.util.ArrayList) Schema(org.apache.cassandra.schema.Schema) HashSet(java.util.HashSet) UTF8Type(org.apache.cassandra.db.marshal.UTF8Type) Token(org.apache.cassandra.dht.Token) ActiveRepairService(org.apache.cassandra.service.ActiveRepairService) Lists(com.google.common.collect.Lists) CleanupSummary(org.apache.cassandra.repair.consistent.admin.CleanupSummary) STATUS_RSP(org.apache.cassandra.net.Verb.STATUS_RSP) ExecutorService(java.util.concurrent.ExecutorService) Nullable(javax.annotation.Nullable) MessagingService(org.apache.cassandra.net.MessagingService) Logger(org.slf4j.Logger) BytesType(org.apache.cassandra.db.marshal.BytesType) StatusResponse(org.apache.cassandra.repair.messages.StatusResponse) StorageService(org.apache.cassandra.service.StorageService) IOException(java.io.IOException) PrepareConsistentRequest(org.apache.cassandra.repair.messages.PrepareConsistentRequest) UnknownHostException(java.net.UnknownHostException) Ints(com.google.common.primitives.Ints) FutureCallback(com.google.common.util.concurrent.FutureCallback) Replica(org.apache.cassandra.locator.Replica) FailSession(org.apache.cassandra.repair.messages.FailSession) TimeUnit(java.util.concurrent.TimeUnit) RepairMessage(org.apache.cassandra.repair.messages.RepairMessage) UUIDType(org.apache.cassandra.db.marshal.UUIDType) IPartitioner(org.apache.cassandra.dht.IPartitioner) Global.executorFactory(org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory) UntypedResultSet(org.apache.cassandra.cql3.UntypedResultSet) Preconditions(com.google.common.base.Preconditions) VisibleForTesting(com.google.common.annotations.VisibleForTesting) StatusRequest(org.apache.cassandra.repair.messages.StatusRequest) InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) RangesAtEndpoint(org.apache.cassandra.locator.RangesAtEndpoint) ActiveRepairService(org.apache.cassandra.service.ActiveRepairService) PrepareConsistentResponse(org.apache.cassandra.repair.messages.PrepareConsistentResponse) Message(org.apache.cassandra.net.Message) RepairMessage(org.apache.cassandra.repair.messages.RepairMessage) CompactionInterruptedException(org.apache.cassandra.db.compaction.CompactionInterruptedException) KeyspaceRepairManager(org.apache.cassandra.repair.KeyspaceRepairManager) ExecutorService(java.util.concurrent.ExecutorService) NoSuchRepairSessionException(org.apache.cassandra.repair.NoSuchRepairSessionException) List(java.util.List) ArrayList(java.util.ArrayList) UUID(java.util.UUID)

Example 3 with PrepareConsistentRequest

use of org.apache.cassandra.repair.messages.PrepareConsistentRequest in project cassandra by apache.

the class CoordinatorSession method prepare.

public Future<Void> prepare() {
    Preconditions.checkArgument(allStates(State.PREPARING));
    logger.info("Beginning prepare phase of incremental repair session {}", sessionID);
    Message<RepairMessage> message = Message.out(Verb.PREPARE_CONSISTENT_REQ, new PrepareConsistentRequest(sessionID, coordinator, participants));
    for (final InetAddressAndPort participant : participants) {
        sendMessage(participant, message);
    }
    return prepareFuture;
}
Also used : RepairMessage(org.apache.cassandra.repair.messages.RepairMessage) InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) PrepareConsistentRequest(org.apache.cassandra.repair.messages.PrepareConsistentRequest)

Example 4 with PrepareConsistentRequest

use of org.apache.cassandra.repair.messages.PrepareConsistentRequest in project cassandra by apache.

the class LocalSessionTest method prepareCancellation.

/**
 * If the session is cancelled mid-prepare, the isCancelled boolean supplier should start returning true
 */
@Test
public void prepareCancellation() {
    UUID sessionID = registerSession();
    AtomicReference<BooleanSupplier> isCancelledRef = new AtomicReference<>();
    Promise<List<Void>> future = new AsyncPromise<>();
    InstrumentedLocalSessions sessions = new InstrumentedLocalSessions() {

        Future<List<Void>> prepareSession(KeyspaceRepairManager repairManager, UUID sessionID, Collection<ColumnFamilyStore> tables, RangesAtEndpoint ranges, ExecutorService executor, BooleanSupplier isCancelled) {
            isCancelledRef.set(isCancelled);
            return future;
        }
    };
    sessions.start();
    sessions.handlePrepareMessage(PARTICIPANT1, new PrepareConsistentRequest(sessionID, COORDINATOR, PARTICIPANTS));
    BooleanSupplier isCancelled = isCancelledRef.get();
    Assert.assertNotNull(isCancelled);
    Assert.assertFalse(isCancelled.getAsBoolean());
    Assert.assertTrue(sessions.sentMessages.isEmpty());
    sessions.failSession(sessionID, false);
    Assert.assertTrue(isCancelled.getAsBoolean());
    // now that the session has failed, it send a negative response to the coordinator (even if the anti-compaction completed successfully)
    future.trySuccess(null);
    assertMessagesSent(sessions, COORDINATOR, new PrepareConsistentResponse(sessionID, PARTICIPANT1, false));
}
Also used : RangesAtEndpoint(org.apache.cassandra.locator.RangesAtEndpoint) PrepareConsistentResponse(org.apache.cassandra.repair.messages.PrepareConsistentResponse) AtomicReference(java.util.concurrent.atomic.AtomicReference) AsyncPromise(org.apache.cassandra.utils.concurrent.AsyncPromise) KeyspaceRepairManager(org.apache.cassandra.repair.KeyspaceRepairManager) PrepareConsistentRequest(org.apache.cassandra.repair.messages.PrepareConsistentRequest) ExecutorService(java.util.concurrent.ExecutorService) Collection(java.util.Collection) List(java.util.List) ArrayList(java.util.ArrayList) UUID(java.util.UUID) BooleanSupplier(java.util.function.BooleanSupplier) AbstractRepairTest(org.apache.cassandra.repair.AbstractRepairTest) Test(org.junit.Test)

Example 5 with PrepareConsistentRequest

use of org.apache.cassandra.repair.messages.PrepareConsistentRequest in project cassandra by apache.

the class LocalSessionTest method prepareAntiCompactFailure.

/**
 * If anti compactionn fails, we should fail the session locally,
 * and send a failure message back to the coordinator
 */
@Test
public void prepareAntiCompactFailure() {
    UUID sessionID = registerSession();
    InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
    sessions.start();
    // replacing future so we can inspect state before and after anti compaction callback
    sessions.prepareSessionFuture = new AsyncPromise<>();
    Assert.assertFalse(sessions.prepareSessionCalled);
    sessions.handlePrepareMessage(PARTICIPANT1, new PrepareConsistentRequest(sessionID, COORDINATOR, PARTICIPANTS));
    Assert.assertTrue(sessions.prepareSessionCalled);
    Assert.assertTrue(sessions.sentMessages.isEmpty());
    // anti compaction hasn't finished yet, so state in memory and on disk should be PREPARING
    LocalSession session = sessions.getSession(sessionID);
    Assert.assertNotNull(session);
    Assert.assertEquals(PREPARING, session.getState());
    Assert.assertEquals(session, sessions.loadUnsafe(sessionID));
    // anti compaction has now finished, so state in memory and on disk should be PREPARED
    sessions.prepareSessionFuture.tryFailure(new RuntimeException());
    session = sessions.getSession(sessionID);
    Assert.assertNotNull(session);
    Assert.assertEquals(FAILED, session.getState());
    Assert.assertEquals(session, sessions.loadUnsafe(sessionID));
    // ...and we should have sent a success message back to the coordinator
    assertMessagesSent(sessions, COORDINATOR, new PrepareConsistentResponse(sessionID, PARTICIPANT1, false));
}
Also used : PrepareConsistentResponse(org.apache.cassandra.repair.messages.PrepareConsistentResponse) UUID(java.util.UUID) PrepareConsistentRequest(org.apache.cassandra.repair.messages.PrepareConsistentRequest) AbstractRepairTest(org.apache.cassandra.repair.AbstractRepairTest) Test(org.junit.Test)

Aggregations

PrepareConsistentRequest (org.apache.cassandra.repair.messages.PrepareConsistentRequest)13 AbstractRepairTest (org.apache.cassandra.repair.AbstractRepairTest)10 Test (org.junit.Test)10 UUID (java.util.UUID)7 InetAddressAndPort (org.apache.cassandra.locator.InetAddressAndPort)6 RepairMessage (org.apache.cassandra.repair.messages.RepairMessage)6 PrepareConsistentResponse (org.apache.cassandra.repair.messages.PrepareConsistentResponse)5 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)4 CoordinatedRepairResult (org.apache.cassandra.repair.CoordinatedRepairResult)4 Future (org.apache.cassandra.utils.concurrent.Future)4 Collection (java.util.Collection)3 RepairSessionResult (org.apache.cassandra.repair.RepairSessionResult)3 FailSession (org.apache.cassandra.repair.messages.FailSession)3 ArrayList (java.util.ArrayList)2 List (java.util.List)2 ExecutorService (java.util.concurrent.ExecutorService)2 BooleanSupplier (java.util.function.BooleanSupplier)2 RangesAtEndpoint (org.apache.cassandra.locator.RangesAtEndpoint)2 KeyspaceRepairManager (org.apache.cassandra.repair.KeyspaceRepairManager)2 FinalizePropose (org.apache.cassandra.repair.messages.FinalizePropose)2