Search in sources :

Example 1 with Type

use of org.apache.ratis.proto.RaftProtos.DataStreamPacketHeaderProto.Type 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 2 with Type

use of org.apache.ratis.proto.RaftProtos.DataStreamPacketHeaderProto.Type in project incubator-ratis by apache.

the class DataStreamTestUtils method writeAndAssertReplies.

static int writeAndAssertReplies(DataStreamOutputImpl out, int bufferSize, int bufferNum) {
    final List<CompletableFuture<DataStreamReply>> futures = new ArrayList<>();
    final List<Integer> sizes = new ArrayList<>();
    // send data
    final int halfBufferSize = bufferSize / 2;
    int dataSize = 0;
    for (int i = 0; i < bufferNum; i++) {
        final int size = halfBufferSize + ThreadLocalRandom.current().nextInt(halfBufferSize);
        sizes.add(size);
        final ByteBuffer bf = initBuffer(dataSize, size);
        futures.add(i == bufferNum - 1 ? out.writeAsync(bf, StandardWriteOption.SYNC) : out.writeAsync(bf));
        dataSize += size;
    }
    {
        // check header
        final DataStreamReply reply = out.getHeaderFuture().join();
        assertSuccessReply(Type.STREAM_HEADER, 0, reply);
    }
    // check writeAsync requests
    for (int i = 0; i < futures.size(); i++) {
        final DataStreamReply reply = futures.get(i).join();
        final Type expectedType = Type.STREAM_DATA;
        assertSuccessReply(expectedType, sizes.get(i).longValue(), reply);
    }
    return dataSize;
}
Also used : CompletableFuture(java.util.concurrent.CompletableFuture) Type(org.apache.ratis.proto.RaftProtos.DataStreamPacketHeaderProto.Type) ArrayList(java.util.ArrayList) ByteBuffer(java.nio.ByteBuffer) DataStreamReplyByteBuffer(org.apache.ratis.datastream.impl.DataStreamReplyByteBuffer) DataStreamRequestByteBuffer(org.apache.ratis.datastream.impl.DataStreamRequestByteBuffer) DataStreamReply(org.apache.ratis.protocol.DataStreamReply)

Aggregations

ByteBuffer (java.nio.ByteBuffer)2 CompletableFuture (java.util.concurrent.CompletableFuture)2 DataStreamReplyByteBuffer (org.apache.ratis.datastream.impl.DataStreamReplyByteBuffer)2 Type (org.apache.ratis.proto.RaftProtos.DataStreamPacketHeaderProto.Type)2 DataStreamReply (org.apache.ratis.protocol.DataStreamReply)2 SuppressFBWarnings (edu.umd.cs.findbugs.annotations.SuppressFBWarnings)1 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)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 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