Search in sources :

Example 6 with RequestFailureReason

use of org.apache.cassandra.exceptions.RequestFailureReason in project cassandra by apache.

the class ActiveRepairService method prepareForRepair.

public UUID prepareForRepair(UUID parentRepairSession, InetAddressAndPort coordinator, Set<InetAddressAndPort> endpoints, RepairOption options, boolean isForcedRepair, List<ColumnFamilyStore> columnFamilyStores) {
    if (!verifyCompactionsPendingThreshold(parentRepairSession, options.getPreviewKind()))
        // failRepair throws exception
        failRepair(parentRepairSession, "Rejecting incoming repair, pending compactions above threshold");
    long repairedAt = getRepairedAt(options, isForcedRepair);
    registerParentRepairSession(parentRepairSession, coordinator, columnFamilyStores, options.getRanges(), options.isIncremental(), repairedAt, options.isGlobal(), options.getPreviewKind());
    final CountDownLatch prepareLatch = newCountDownLatch(endpoints.size());
    final AtomicBoolean status = new AtomicBoolean(true);
    final Set<String> failedNodes = synchronizedSet(new HashSet<String>());
    final AtomicInteger timeouts = new AtomicInteger(0);
    RequestCallback callback = new RequestCallback() {

        @Override
        public void onResponse(Message msg) {
            prepareLatch.decrement();
        }

        @Override
        public void onFailure(InetAddressAndPort from, RequestFailureReason failureReason) {
            status.set(false);
            failedNodes.add(from.toString());
            if (failureReason == RequestFailureReason.TIMEOUT)
                timeouts.incrementAndGet();
            prepareLatch.decrement();
        }

        @Override
        public boolean invokeOnFailure() {
            return true;
        }
    };
    List<TableId> tableIds = new ArrayList<>(columnFamilyStores.size());
    for (ColumnFamilyStore cfs : columnFamilyStores) tableIds.add(cfs.metadata.id);
    for (InetAddressAndPort neighbour : endpoints) {
        if (FailureDetector.instance.isAlive(neighbour)) {
            PrepareMessage message = new PrepareMessage(parentRepairSession, tableIds, options.getRanges(), options.isIncremental(), repairedAt, options.isGlobal(), options.getPreviewKind());
            Message<RepairMessage> msg = out(PREPARE_MSG, message);
            MessagingService.instance().sendWithCallback(msg, neighbour, callback);
        } else {
            // remaining ones go down, we still want to fail so we don't create repair sessions that can't complete
            if (isForcedRepair && !options.isIncremental()) {
                prepareLatch.decrement();
            } else {
                // bailout early to avoid potentially waiting for a long time.
                failRepair(parentRepairSession, "Endpoint not alive: " + neighbour);
            }
        }
    }
    try {
        if (!prepareLatch.await(getRpcTimeout(MILLISECONDS), MILLISECONDS) || timeouts.get() > 0)
            failRepair(parentRepairSession, "Did not get replies from all endpoints.");
    } catch (InterruptedException e) {
        failRepair(parentRepairSession, "Interrupted while waiting for prepare repair response.");
    }
    if (!status.get()) {
        failRepair(parentRepairSession, "Got negative replies from endpoints " + failedNodes);
    }
    return parentRepairSession;
}
Also used : TableId(org.apache.cassandra.schema.TableId) InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) PrepareMessage(org.apache.cassandra.repair.messages.PrepareMessage) Message(org.apache.cassandra.net.Message) CleanupMessage(org.apache.cassandra.repair.messages.CleanupMessage) RepairMessage(org.apache.cassandra.repair.messages.RepairMessage) CountDownLatch(org.apache.cassandra.utils.concurrent.CountDownLatch) CountDownLatch.newCountDownLatch(org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) RepairMessage(org.apache.cassandra.repair.messages.RepairMessage) RequestFailureReason(org.apache.cassandra.exceptions.RequestFailureReason) PrepareMessage(org.apache.cassandra.repair.messages.PrepareMessage) RequestCallback(org.apache.cassandra.net.RequestCallback) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) ColumnFamilyStore(org.apache.cassandra.db.ColumnFamilyStore)

Example 7 with RequestFailureReason

use of org.apache.cassandra.exceptions.RequestFailureReason in project cassandra by apache.

the class InboundSink method fail.

public void fail(Message.Header header, Throwable failure) {
    if (header.callBackOnFailure()) {
        InetAddressAndPort to = header.respondTo() != null ? header.respondTo() : header.from;
        Message<RequestFailureReason> response = Message.failureResponse(header.id, header.expiresAtNanos, RequestFailureReason.forException(failure));
        messaging.send(response, to);
    }
}
Also used : InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) RequestFailureReason(org.apache.cassandra.exceptions.RequestFailureReason)

Example 8 with RequestFailureReason

use of org.apache.cassandra.exceptions.RequestFailureReason in project cassandra by apache.

the class ErrorMessageTest method testRequestFailureExceptionMakesCopy.

/**
 * Make sure that the map passed in to create a Read/WriteFailureException is copied
 * so later modifications to the map passed in don't affect the map in the exception.
 *
 * This is to prevent potential issues in serialization if the map created in
 * ReadCallback/AbstractWriteResponseHandler is modified due to a delayed failure
 * response after the exception is created.
 */
@Test
public void testRequestFailureExceptionMakesCopy() throws UnknownHostException {
    Map<InetAddressAndPort, RequestFailureReason> modifiableFailureReasons = new HashMap<>(failureReasonMap1);
    ReadFailureException rfe = new ReadFailureException(ConsistencyLevel.ALL, 3, 3, false, modifiableFailureReasons);
    WriteFailureException wfe = new WriteFailureException(ConsistencyLevel.ALL, 3, 3, WriteType.SIMPLE, modifiableFailureReasons);
    modifiableFailureReasons.put(InetAddressAndPort.getByName("127.0.0.4"), RequestFailureReason.UNKNOWN);
    assertEquals(failureReasonMap1, rfe.failureReasonByEndpoint);
    assertEquals(failureReasonMap1, wfe.failureReasonByEndpoint);
}
Also used : InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) WriteFailureException(org.apache.cassandra.exceptions.WriteFailureException) RequestFailureReason(org.apache.cassandra.exceptions.RequestFailureReason) ReadFailureException(org.apache.cassandra.exceptions.ReadFailureException) HashMap(java.util.HashMap) Test(org.junit.Test)

Example 9 with RequestFailureReason

use of org.apache.cassandra.exceptions.RequestFailureReason in project cassandra by apache.

the class ConnectionTest method testInsufficientSpace.

@Test
public void testInsufficientSpace() throws Throwable {
    test(new Settings(null).outbound(settings -> settings.withApplicationReserveSendQueueCapacityInBytes(1 << 15, new ResourceLimits.Concurrent(1 << 16)).withApplicationSendQueueCapacityInBytes(1 << 16)), (inbound, outbound, endpoint) -> {
        CountDownLatch done = new CountDownLatch(1);
        Message<?> message = Message.out(Verb._TEST_1, new Object());
        MessagingService.instance().callbacks.addWithExpiration(new RequestCallback() {

            @Override
            public void onFailure(InetAddressAndPort from, RequestFailureReason failureReason) {
                done.countDown();
            }

            @Override
            public boolean invokeOnFailure() {
                return true;
            }

            @Override
            public void onResponse(Message msg) {
                throw new IllegalStateException();
            }
        }, message, endpoint);
        AtomicInteger delivered = new AtomicInteger();
        unsafeSetSerializer(Verb._TEST_1, () -> new IVersionedSerializer<Object>() {

            public void serialize(Object o, DataOutputPlus out, int version) throws IOException {
                for (int i = 0; i <= 4 << 16; i += 8L) out.writeLong(1L);
            }

            public Object deserialize(DataInputPlus in, int version) throws IOException {
                in.skipBytesFully(4 << 16);
                return null;
            }

            public long serializedSize(Object o, int version) {
                return 4 << 16;
            }
        });
        unsafeSetHandler(Verb._TEST_1, () -> msg -> delivered.incrementAndGet());
        outbound.enqueue(message);
        Assert.assertTrue(done.await(10, SECONDS));
        Assert.assertEquals(0, delivered.get());
        check(outbound).submitted(1).sent(0, 0).pending(0, 0).overload(1, message.serializedSize(current_version)).expired(0, 0).error(0, 0).check();
        check(inbound).received(0, 0).processed(0, 0).pending(0, 0).expired(0, 0).error(0, 0).check();
    });
}
Also used : LoggerFactory(org.slf4j.LoggerFactory) CommitLog(org.apache.cassandra.db.commitlog.CommitLog) Random(java.util.Random) EncryptionOptions(org.apache.cassandra.config.EncryptionOptions) Global.nanoTime(org.apache.cassandra.utils.Clock.Global.nanoTime) ChannelPromise(io.netty.channel.ChannelPromise) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) LARGE_MESSAGE_THRESHOLD(org.apache.cassandra.net.OutboundConnections.LARGE_MESSAGE_THRESHOLD) Map(java.util.Map) After(org.junit.After) IVersionedAsymmetricSerializer(org.apache.cassandra.io.IVersionedAsymmetricSerializer) DataOutputPlus(org.apache.cassandra.io.util.DataOutputPlus) UnknownColumnException(org.apache.cassandra.exceptions.UnknownColumnException) ToLongFunction(java.util.function.ToLongFunction) DatabaseDescriptor(org.apache.cassandra.config.DatabaseDescriptor) VERSION_40(org.apache.cassandra.net.MessagingService.VERSION_40) LZ4(org.apache.cassandra.net.OutboundConnectionSettings.Framing.LZ4) AfterClass(org.junit.AfterClass) Global.approxTime(org.apache.cassandra.utils.MonotonicClock.Global.approxTime) ChannelOutboundHandlerAdapter(io.netty.channel.ChannelOutboundHandlerAdapter) FBUtilities(org.apache.cassandra.utils.FBUtilities) Set(java.util.Set) MILLISECONDS(java.util.concurrent.TimeUnit.MILLISECONDS) SMALL_MESSAGES(org.apache.cassandra.net.ConnectionType.SMALL_MESSAGES) Executors(java.util.concurrent.Executors) Sets(com.google.common.collect.Sets) CountDownLatch(java.util.concurrent.CountDownLatch) List(java.util.List) ConnectionUtils(org.apache.cassandra.net.ConnectionUtils) VERSION_30(org.apache.cassandra.net.MessagingService.VERSION_30) DataInputPlus(org.apache.cassandra.io.util.DataInputPlus) NoPayload.noPayload(org.apache.cassandra.net.NoPayload.noPayload) InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) BeforeClass(org.junit.BeforeClass) Config(org.apache.cassandra.config.Config) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) MINUTES(java.util.concurrent.TimeUnit.MINUTES) Function(java.util.function.Function) Supplier(java.util.function.Supplier) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) ChannelHandlerContext(io.netty.channel.ChannelHandlerContext) ImmutableList(com.google.common.collect.ImmutableList) ByteBuf(io.netty.buffer.ByteBuf) ThreadLocalRandom(java.util.concurrent.ThreadLocalRandom) IVersionedSerializer(org.apache.cassandra.io.IVersionedSerializer) ExecutorService(java.util.concurrent.ExecutorService) VERSION_3014(org.apache.cassandra.net.MessagingService.VERSION_3014) Uninterruptibles(com.google.common.util.concurrent.Uninterruptibles) Logger(org.slf4j.Logger) LARGE_MESSAGES(org.apache.cassandra.net.ConnectionType.LARGE_MESSAGES) IOException(java.io.IOException) Test(org.junit.Test) MessagingService.current_version(org.apache.cassandra.net.MessagingService.current_version) RequestFailureReason(org.apache.cassandra.exceptions.RequestFailureReason) TimeUnit(java.util.concurrent.TimeUnit) AtomicLong(java.util.concurrent.atomic.AtomicLong) Assert(org.junit.Assert) Collections(java.util.Collections) SECONDS(java.util.concurrent.TimeUnit.SECONDS) InetAddressAndPort(org.apache.cassandra.locator.InetAddressAndPort) IOException(java.io.IOException) CountDownLatch(java.util.concurrent.CountDownLatch) RequestFailureReason(org.apache.cassandra.exceptions.RequestFailureReason) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) DataInputPlus(org.apache.cassandra.io.util.DataInputPlus) DataOutputPlus(org.apache.cassandra.io.util.DataOutputPlus) Test(org.junit.Test)

Aggregations

RequestFailureReason (org.apache.cassandra.exceptions.RequestFailureReason)9 InetAddressAndPort (org.apache.cassandra.locator.InetAddressAndPort)7 Map (java.util.Map)3 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 Collections (java.util.Collections)2 HashMap (java.util.HashMap)2 List (java.util.List)2 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)2 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 ColumnFamilyStore (org.apache.cassandra.db.ColumnFamilyStore)2 ParamType (org.apache.cassandra.net.ParamType)2 RequestCallback (org.apache.cassandra.net.RequestCallback)2 TableId (org.apache.cassandra.schema.TableId)2 Test (org.junit.Test)2 ImmutableList (com.google.common.collect.ImmutableList)1 Sets (com.google.common.collect.Sets)1 Uninterruptibles (com.google.common.util.concurrent.Uninterruptibles)1 ByteBuf (io.netty.buffer.ByteBuf)1 ChannelHandlerContext (io.netty.channel.ChannelHandlerContext)1