Search in sources :

Example 1 with MemoizedSupplier

use of org.apache.ratis.util.MemoizedSupplier 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)

Aggregations

SuppressFBWarnings (edu.umd.cs.findbugs.annotations.SuppressFBWarnings)1 IOException (java.io.IOException)1 ByteBuffer (java.nio.ByteBuffer)1 Collection (java.util.Collection)1 Collections (java.util.Collections)1 List (java.util.List)1 Optional (java.util.Optional)1 Set (java.util.Set)1 CompletableFuture (java.util.concurrent.CompletableFuture)1 CompletionException (java.util.concurrent.CompletionException)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 ConcurrentMap (java.util.concurrent.ConcurrentMap)1 Executor (java.util.concurrent.Executor)1 AtomicReference (java.util.concurrent.atomic.AtomicReference)1 Function (java.util.function.Function)1 Collectors (java.util.stream.Collectors)1 AsyncRpcApi (org.apache.ratis.client.AsyncRpcApi)1 DataStreamOutputRpc (org.apache.ratis.client.DataStreamOutputRpc)1 ClientProtoUtils (org.apache.ratis.client.impl.ClientProtoUtils)1 RaftProperties (org.apache.ratis.conf.RaftProperties)1