Search in sources :

Example 1 with ClientInvocationId

use of org.apache.ratis.protocol.ClientInvocationId in project incubator-ratis by apache.

the class NettyClientStreamRpc method streamAsync.

@Override
public CompletableFuture<DataStreamReply> streamAsync(DataStreamRequest request) {
    final CompletableFuture<DataStreamReply> f = new CompletableFuture<>();
    ClientInvocationId clientInvocationId = ClientInvocationId.valueOf(request.getClientId(), request.getStreamId());
    final ReplyQueue q = replies.computeIfAbsent(clientInvocationId, key -> new ReplyQueue());
    if (!q.offer(f)) {
        f.completeExceptionally(new IllegalStateException(this + ": Failed to offer a future for " + request));
        return f;
    }
    LOG.debug("{}: write {}", this, request);
    getChannel().writeAndFlush(request);
    return f;
}
Also used : CompletableFuture(java.util.concurrent.CompletableFuture) ClientInvocationId(org.apache.ratis.protocol.ClientInvocationId) DataStreamReply(org.apache.ratis.protocol.DataStreamReply)

Example 2 with ClientInvocationId

use of org.apache.ratis.protocol.ClientInvocationId in project incubator-ratis by apache.

the class DataStreamManagement method readImpl.

private void readImpl(DataStreamRequestByteBuf request, ChannelHandlerContext ctx, ByteBuf buf, CheckedBiFunction<RaftClientRequest, Set<RaftPeer>, Set<DataStreamOutputRpc>, IOException> getStreams) {
    boolean close = WriteOption.containsOption(request.getWriteOptions(), StandardWriteOption.CLOSE);
    ClientInvocationId key = ClientInvocationId.valueOf(request.getClientId(), request.getStreamId());
    final StreamInfo info;
    if (request.getType() == Type.STREAM_HEADER) {
        final MemoizedSupplier<StreamInfo> supplier = JavaUtils.memoize(() -> newStreamInfo(buf, getStreams));
        info = streams.computeIfAbsent(key, id -> supplier.get());
        if (!supplier.isInitialized()) {
            streams.remove(key);
            throw new IllegalStateException("Failed to create a new stream for " + request + " since a stream already exists Key: " + key + " StreamInfo:" + info);
        }
        getMetrics().onRequestCreate(RequestType.HEADER);
    } else if (close) {
        info = Optional.ofNullable(streams.remove(key)).orElseThrow(() -> new IllegalStateException("Failed to remove StreamInfo for " + request));
    } else {
        info = Optional.ofNullable(streams.get(key)).orElseThrow(() -> {
            streams.remove(key);
            return new IllegalStateException("Failed to get StreamInfo for " + request);
        });
    }
    final CompletableFuture<Long> localWrite;
    final List<CompletableFuture<DataStreamReply>> remoteWrites;
    if (request.getType() == Type.STREAM_HEADER) {
        localWrite = CompletableFuture.completedFuture(0L);
        remoteWrites = Collections.emptyList();
    } else if (request.getType() == Type.STREAM_DATA) {
        localWrite = info.getLocal().write(buf, request.getWriteOptions(), writeExecutor);
        remoteWrites = info.applyToRemotes(out -> out.write(request, requestExecutor));
    } else {
        throw new IllegalStateException(this + ": Unexpected type " + request.getType() + ", request=" + request);
    }
    composeAsync(info.getPrevious(), requestExecutor, n -> JavaUtils.allOf(remoteWrites).thenCombineAsync(localWrite, (v, bytesWritten) -> {
        if (request.getType() == Type.STREAM_HEADER || (request.getType() == Type.STREAM_DATA && !close)) {
            sendReply(remoteWrites, request, bytesWritten, info.getCommitInfos(), ctx);
        } else if (close) {
            if (info.isPrimary()) {
                // after all server close stream, primary server start transaction
                startTransaction(info, request, bytesWritten, ctx);
            } else {
                sendReply(remoteWrites, request, bytesWritten, info.getCommitInfos(), ctx);
            }
        } else {
            throw new IllegalStateException(this + ": Unexpected type " + request.getType() + ", request=" + request);
        }
        return null;
    }, requestExecutor)).whenComplete((v, exception) -> {
        try {
            if (exception != null) {
                streams.remove(key);
                replyDataStreamException(server, exception, info.getRequest(), request, ctx);
            }
        } finally {
            buf.release();
        }
    });
}
Also used : RoutingTable(org.apache.ratis.protocol.RoutingTable) RequestContext(org.apache.ratis.netty.metrics.NettyServerStreamRpcMetrics.RequestContext) LoggerFactory(org.slf4j.LoggerFactory) ByteBuffer(java.nio.ByteBuffer) RaftConfiguration(org.apache.ratis.server.RaftConfiguration) DataStreamReplyByteBuffer(org.apache.ratis.datastream.impl.DataStreamReplyByteBuffer) WriteOption(org.apache.ratis.io.WriteOption) JavaUtils(org.apache.ratis.util.JavaUtils) MemoizedSupplier(org.apache.ratis.util.MemoizedSupplier) RaftPeer(org.apache.ratis.protocol.RaftPeer) Collection(java.util.Collection) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Set(java.util.Set) CompletionException(java.util.concurrent.CompletionException) Collectors(java.util.stream.Collectors) AlreadyExistsException(org.apache.ratis.protocol.exceptions.AlreadyExistsException) DataChannel(org.apache.ratis.statemachine.StateMachine.DataChannel) ClientProtoUtils(org.apache.ratis.client.impl.ClientProtoUtils) List(java.util.List) ClientId(org.apache.ratis.protocol.ClientId) RaftClientReply(org.apache.ratis.protocol.RaftClientReply) RaftProperties(org.apache.ratis.conf.RaftProperties) NettyServerStreamRpcMetrics(org.apache.ratis.netty.metrics.NettyServerStreamRpcMetrics) Optional(java.util.Optional) ClientInvocationId(org.apache.ratis.protocol.ClientInvocationId) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings) DataStreamOutputRpc(org.apache.ratis.client.DataStreamOutputRpc) Preconditions(org.apache.ratis.util.Preconditions) ChannelHandlerContext(org.apache.ratis.thirdparty.io.netty.channel.ChannelHandlerContext) StandardWriteOption(org.apache.ratis.io.StandardWriteOption) RequestMetrics(org.apache.ratis.netty.metrics.NettyServerStreamRpcMetrics.RequestMetrics) CompletableFuture(java.util.concurrent.CompletableFuture) AtomicReference(java.util.concurrent.atomic.AtomicReference) Function(java.util.function.Function) DataStreamException(org.apache.ratis.protocol.exceptions.DataStreamException) ConcurrentMap(java.util.concurrent.ConcurrentMap) RaftGroupId(org.apache.ratis.protocol.RaftGroupId) RaftClientRequestProto(org.apache.ratis.proto.RaftProtos.RaftClientRequestProto) DataStreamReply(org.apache.ratis.protocol.DataStreamReply) AsyncRpcApi(org.apache.ratis.client.AsyncRpcApi) ConcurrentUtils(org.apache.ratis.util.ConcurrentUtils) ByteBuf(org.apache.ratis.thirdparty.io.netty.buffer.ByteBuf) DataStream(org.apache.ratis.statemachine.StateMachine.DataStream) Logger(org.slf4j.Logger) CheckedBiFunction(org.apache.ratis.util.function.CheckedBiFunction) Executor(java.util.concurrent.Executor) RaftPeerId(org.apache.ratis.protocol.RaftPeerId) RaftServerConfigKeys(org.apache.ratis.server.RaftServerConfigKeys) RaftClientRequest(org.apache.ratis.protocol.RaftClientRequest) IOException(java.io.IOException) Type(org.apache.ratis.proto.RaftProtos.DataStreamPacketHeaderProto.Type) Division(org.apache.ratis.server.RaftServer.Division) CommitInfoProto(org.apache.ratis.proto.RaftProtos.CommitInfoProto) RequestType(org.apache.ratis.netty.metrics.NettyServerStreamRpcMetrics.RequestType) RaftServer(org.apache.ratis.server.RaftServer) Collections(java.util.Collections) CompletableFuture(java.util.concurrent.CompletableFuture) ClientInvocationId(org.apache.ratis.protocol.ClientInvocationId)

Example 3 with ClientInvocationId

use of org.apache.ratis.protocol.ClientInvocationId in project incubator-ratis by apache.

the class RaftBasicTests method testRequestTimeout.

public static void testRequestTimeout(boolean async, MiniRaftCluster cluster, Logger LOG) throws Exception {
    waitForLeader(cluster);
    final Timestamp startTime = Timestamp.currentTime();
    try (final RaftClient client = cluster.createClient()) {
        // Get the next callId to be used by the client
        final ClientInvocationId invocationId = RaftClientTestUtil.getClientInvocationId(client);
        // Create an entry corresponding to the callId and clientId
        // in each server's retry cache.
        cluster.getServerAliveStream().forEach(raftServer -> RetryCacheTestUtil.getOrCreateEntry(raftServer, invocationId));
        // The retry is successful when the retry cache entry for the corresponding callId and clientId expires.
        if (async) {
            CompletableFuture<RaftClientReply> replyFuture = client.async().send(new SimpleMessage("abc"));
            replyFuture.get();
        } else {
            client.io().send(new SimpleMessage("abc"));
        }
        // Eventually the request would be accepted by the server
        // when the retry cache entry is invalidated.
        // The duration for which the client waits should be more than the retryCacheExpiryDuration.
        final TimeDuration duration = startTime.elapsedTime();
        TimeDuration retryCacheExpiryDuration = RaftServerConfigKeys.RetryCache.expiryTime(cluster.getProperties());
        Assert.assertTrue(duration.compareTo(retryCacheExpiryDuration) >= 0);
    }
}
Also used : RaftClientReply(org.apache.ratis.protocol.RaftClientReply) SimpleMessage(org.apache.ratis.RaftTestUtil.SimpleMessage) TimeDuration(org.apache.ratis.util.TimeDuration) ClientInvocationId(org.apache.ratis.protocol.ClientInvocationId) Timestamp(org.apache.ratis.util.Timestamp) RaftClient(org.apache.ratis.client.RaftClient)

Example 4 with ClientInvocationId

use of org.apache.ratis.protocol.ClientInvocationId in project incubator-ratis by apache.

the class MessageStreamRequests method streamEndOfRequestAsync.

CompletableFuture<ByteString> streamEndOfRequestAsync(RaftClientRequest request) {
    final MessageStreamRequestTypeProto stream = request.getType().getMessageStream();
    Preconditions.assertTrue(stream.getEndOfRequest());
    final ClientInvocationId key = ClientInvocationId.valueOf(request.getClientId(), stream.getStreamId());
    final PendingStream pending = streams.remove(key);
    if (pending == null) {
        return JavaUtils.completeExceptionally(new StreamException(name + ": " + key + " not found"));
    }
    return pending.getBytes(stream.getMessageId(), request.getMessage());
}
Also used : MessageStreamRequestTypeProto(org.apache.ratis.proto.RaftProtos.MessageStreamRequestTypeProto) ClientInvocationId(org.apache.ratis.protocol.ClientInvocationId) StreamException(org.apache.ratis.protocol.exceptions.StreamException)

Example 5 with ClientInvocationId

use of org.apache.ratis.protocol.ClientInvocationId in project incubator-ratis by apache.

the class MessageStreamRequests method streamAsync.

CompletableFuture<?> streamAsync(RaftClientRequest request) {
    final MessageStreamRequestTypeProto stream = request.getType().getMessageStream();
    Preconditions.assertTrue(!stream.getEndOfRequest());
    final ClientInvocationId key = ClientInvocationId.valueOf(request.getClientId(), stream.getStreamId());
    final PendingStream pending = streams.computeIfAbsent(key);
    return pending.append(stream.getMessageId(), request.getMessage());
}
Also used : MessageStreamRequestTypeProto(org.apache.ratis.proto.RaftProtos.MessageStreamRequestTypeProto) ClientInvocationId(org.apache.ratis.protocol.ClientInvocationId)

Aggregations

ClientInvocationId (org.apache.ratis.protocol.ClientInvocationId)11 CompletableFuture (java.util.concurrent.CompletableFuture)4 DataStreamReply (org.apache.ratis.protocol.DataStreamReply)3 List (java.util.List)2 Optional (java.util.Optional)2 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)2 ConcurrentMap (java.util.concurrent.ConcurrentMap)2 AtomicReference (java.util.concurrent.atomic.AtomicReference)2 RaftProperties (org.apache.ratis.conf.RaftProperties)2 RequestContext (org.apache.ratis.netty.metrics.NettyServerStreamRpcMetrics.RequestContext)2 RequestMetrics (org.apache.ratis.netty.metrics.NettyServerStreamRpcMetrics.RequestMetrics)2 MessageStreamRequestTypeProto (org.apache.ratis.proto.RaftProtos.MessageStreamRequestTypeProto)2 ClientId (org.apache.ratis.protocol.ClientId)2 RaftClientReply (org.apache.ratis.protocol.RaftClientReply)2 RaftPeer (org.apache.ratis.protocol.RaftPeer)2 Test (org.junit.Test)2 SuppressFBWarnings (edu.umd.cs.findbugs.annotations.SuppressFBWarnings)1 IOException (java.io.IOException)1 ByteBuffer (java.nio.ByteBuffer)1 Collection (java.util.Collection)1