Package io.grpc.internal
Class RetriableStream<ReqT>
- java.lang.Object
-
- io.grpc.internal.RetriableStream<ReqT>
-
- All Implemented Interfaces:
ClientStream,Stream
abstract class RetriableStream<ReqT> extends java.lang.Object implements ClientStream
A logicalClientStreamthat is retriable.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static interfaceRetriableStream.BufferEntry(package private) classRetriableStream.BufferSizeTracerTraces the buffer used by a substream.(package private) static classRetriableStream.ChannelBufferMeterUsed to keep track of the total amount of memory used to buffer retryable or hedged RPCs for the Channel.private static classRetriableStream.FutureCancellerAllows cancelling a Future without racing with setting the future.private static classRetriableStream.HedgingPlanprivate classRetriableStream.HedgingRunnableprivate static classRetriableStream.RetryPlanprivate static classRetriableStream.SavedCloseMasterListenerReason(package private) classRetriableStream.StartEntryprivate static classRetriableStream.Stateprivate classRetriableStream.Sublistenerprivate static classRetriableStream.SubstreamA wrapper of a physical stream of a retry/hedging attempt, that comes with some useful attributes.(package private) static classRetriableStream.ThrottleUsed for retry throttling.
-
Field Summary
Fields Modifier and Type Field Description private java.util.concurrent.ExecutorcallExecutorprivate StatuscancellationStatusprivate static StatusCANCELLED_BECAUSE_COMMITTEDprivate longchannelBufferLimitprivate RetriableStream.ChannelBufferMeterchannelBufferUsedprivate InsightBuilderclosedSubstreamsInsight(package private) static Metadata.Key<java.lang.String>GRPC_PREVIOUS_RPC_ATTEMPTS(package private) static Metadata.Key<java.lang.String>GRPC_RETRY_PUSHBACK_MSprivate Metadataheadersprivate HedgingPolicyhedgingPolicyprivate java.util.concurrent.atomic.AtomicIntegerinFlightSubStreamsprivate booleanisClosedprivate booleanisHedgingprivate java.util.concurrent.ExecutorlistenerSerializeExecutorprivate java.util.concurrent.atomic.AtomicIntegerlocalOnlyTransparentRetriesprivate java.lang.ObjectlockMust be held when updating state, accessing state.buffer, or certain substream attributes.private ClientStreamListenermasterListenerprivate MethodDescriptor<ReqT,?>methodprivate longnextBackoffIntervalNanosprivate java.util.concurrent.atomic.AtomicBooleannoMoreTransparentRetryEither non-local transparent retry happened or reached server's application logic.private longperRpcBufferLimitprivate longperRpcBufferUsedprivate static java.util.Randomrandomprivate RetryPolicyretryPolicyprivate RetriableStream.SavedCloseMasterListenerReasonsavedCloseMasterListenerReasonprivate java.util.concurrent.ScheduledExecutorServicescheduledExecutorServiceprivate RetriableStream.FutureCancellerscheduledHedgingprivate RetriableStream.FutureCancellerscheduledRetryprivate RetriableStream.Statestateprivate RetriableStream.Throttlethrottle
-
Constructor Summary
Constructors Constructor Description RetriableStream(MethodDescriptor<ReqT,?> method, Metadata headers, RetriableStream.ChannelBufferMeter channelBufferUsed, long perRpcBufferLimit, long channelBufferLimit, java.util.concurrent.Executor callExecutor, java.util.concurrent.ScheduledExecutorService scheduledExecutorService, RetryPolicy retryPolicy, HedgingPolicy hedgingPolicy, RetriableStream.Throttle throttle)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description voidappendTimeoutInsight(InsightBuilder insight)Append information that will be included in the locally generated DEADLINE_EXCEEDED errors to the givenInsightBuilder, in order to tell the user about the state of the stream so that they can better diagnose the cause of the error.voidcancel(Status reason)Abnormally terminates the stream.private java.lang.Runnablecommit(RetriableStream.Substream winningSubstream)private voidcommitAndRun(RetriableStream.Substream winningSubstream)Calls commit() and if successful runs the post commit task.private RetriableStream.SubstreamcreateSubstream(int previousAttemptCount, boolean isTransparentRetry)private voiddelayOrExecute(RetriableStream.BufferEntry bufferEntry)private voiddrain(RetriableStream.Substream substream)voidflush()Flushes any internally buffered messages to the remote end-point.private voidfreezeHedging()AttributesgetAttributes()Attributes that the stream holds at the current moment.voidhalfClose()Closes the local side of this stream and flushes any remaining messages.private booleanhasPotentialHedging(RetriableStream.State state)Whether there is any potential hedge at the moment.booleanisReady()Iftrue, indicates that the transport is capable of sending additional messages without requiring excessive buffering internally.(package private) abstract ClientStreamnewSubstream(Metadata headers, ClientStreamTracer.Factory tracerFactory, int previousAttempts, boolean isTransparentRetry)Creates a new physical ClientStream that represents a retry/hedging attempt.voidoptimizeForDirectExecutor()Provides a hint that directExecutor is being used by the listener for callbacks to the application.(package private) abstract voidpostCommit()(package private) abstract Statusprestart()Runs pre-start tasks.private voidpushbackHedging(java.lang.Integer delayMillis)voidrequest(int numMessages)Requests up to the given number of messages from the call to be delivered viaStreamListener.messagesAvailable(StreamListener.MessageProducer).private voidsafeCloseMasterListener(Status status, ClientStreamListener.RpcProgress progress, Metadata metadata)(package private) voidsendMessage(ReqT message)voidsetAuthority(java.lang.String authority)Override the default authority withauthority.voidsetCompressor(Compressor compressor)Sets the compressor on the framer.voidsetDeadline(Deadline deadline)Sets the effective deadline of the RPC.voidsetDecompressorRegistry(DecompressorRegistry decompressorRegistry)Sets the registry to find a decompressor for the framer.voidsetFullStreamDecompression(boolean fullStreamDecompression)Enables full-stream decompression, allowing the client stream to useGzipInflatingBufferto decode inbound GZIP compressed streams.voidsetMaxInboundMessageSize(int maxSize)Sets the max size accepted from the remote endpoint.voidsetMaxOutboundMessageSize(int maxSize)Sets the max size sent to the remote endpoint.voidsetMessageCompression(boolean enable)Enables per-message compression, if an encoding type has been negotiated.(package private) static voidsetRandom(java.util.Random random)voidstart(ClientStreamListener listener)Starts the first PRC attempt.(package private) MetadataupdateHeaders(Metadata originalHeaders, int previousAttemptCount)Adds grpc-previous-rpc-attempts in the headers of a retry/hedging RPC.voidwriteMessage(java.io.InputStream message)Do not use it directly.
-
-
-
Field Detail
-
GRPC_PREVIOUS_RPC_ATTEMPTS
static final Metadata.Key<java.lang.String> GRPC_PREVIOUS_RPC_ATTEMPTS
-
GRPC_RETRY_PUSHBACK_MS
static final Metadata.Key<java.lang.String> GRPC_RETRY_PUSHBACK_MS
-
CANCELLED_BECAUSE_COMMITTED
private static final Status CANCELLED_BECAUSE_COMMITTED
-
method
private final MethodDescriptor<ReqT,?> method
-
callExecutor
private final java.util.concurrent.Executor callExecutor
-
listenerSerializeExecutor
private final java.util.concurrent.Executor listenerSerializeExecutor
-
scheduledExecutorService
private final java.util.concurrent.ScheduledExecutorService scheduledExecutorService
-
headers
private final Metadata headers
-
retryPolicy
@Nullable private final RetryPolicy retryPolicy
-
hedgingPolicy
@Nullable private final HedgingPolicy hedgingPolicy
-
isHedging
private final boolean isHedging
-
lock
private final java.lang.Object lock
Must be held when updating state, accessing state.buffer, or certain substream attributes.
-
channelBufferUsed
private final RetriableStream.ChannelBufferMeter channelBufferUsed
-
perRpcBufferLimit
private final long perRpcBufferLimit
-
channelBufferLimit
private final long channelBufferLimit
-
throttle
@Nullable private final RetriableStream.Throttle throttle
-
closedSubstreamsInsight
private final InsightBuilder closedSubstreamsInsight
-
state
private volatile RetriableStream.State state
-
noMoreTransparentRetry
private final java.util.concurrent.atomic.AtomicBoolean noMoreTransparentRetry
Either non-local transparent retry happened or reached server's application logic.Note that local-only transparent retries are unlimited.
-
localOnlyTransparentRetries
private final java.util.concurrent.atomic.AtomicInteger localOnlyTransparentRetries
-
inFlightSubStreams
private final java.util.concurrent.atomic.AtomicInteger inFlightSubStreams
-
savedCloseMasterListenerReason
private RetriableStream.SavedCloseMasterListenerReason savedCloseMasterListenerReason
-
perRpcBufferUsed
private long perRpcBufferUsed
-
masterListener
private ClientStreamListener masterListener
-
scheduledRetry
private RetriableStream.FutureCanceller scheduledRetry
-
scheduledHedging
private RetriableStream.FutureCanceller scheduledHedging
-
nextBackoffIntervalNanos
private long nextBackoffIntervalNanos
-
cancellationStatus
private Status cancellationStatus
-
isClosed
private boolean isClosed
-
random
private static java.util.Random random
-
-
Constructor Detail
-
RetriableStream
RetriableStream(MethodDescriptor<ReqT,?> method, Metadata headers, RetriableStream.ChannelBufferMeter channelBufferUsed, long perRpcBufferLimit, long channelBufferLimit, java.util.concurrent.Executor callExecutor, java.util.concurrent.ScheduledExecutorService scheduledExecutorService, @Nullable RetryPolicy retryPolicy, @Nullable HedgingPolicy hedgingPolicy, @Nullable RetriableStream.Throttle throttle)
-
-
Method Detail
-
commit
@Nullable @CheckReturnValue private java.lang.Runnable commit(RetriableStream.Substream winningSubstream)
-
postCommit
abstract void postCommit()
-
commitAndRun
private void commitAndRun(RetriableStream.Substream winningSubstream)
Calls commit() and if successful runs the post commit task. Post commit task will be non-null for only once. The post commit task cancels other non-winning streams on separate transport threads, thus it must be run on the callExecutor to prevent deadlocks between multiple stream transports.(issues/10314) This method should be called only in subListener callbacks. This guarantees callExecutor schedules tasks before master listener closes, which is protected by the inFlightSubStreams decorative. That is because: For a successful winning stream, other streams won't attempt to close master listener. For a cancelled winning stream (noop), other stream won't attempt to close master listener. For a failed/closed winning stream, the last closed stream closes the master listener, and callExecutor scheduling happens-before that.
-
createSubstream
@Nullable private RetriableStream.Substream createSubstream(int previousAttemptCount, boolean isTransparentRetry)
-
newSubstream
abstract ClientStream newSubstream(Metadata headers, ClientStreamTracer.Factory tracerFactory, int previousAttempts, boolean isTransparentRetry)
Creates a new physical ClientStream that represents a retry/hedging attempt. The returned Client stream is not yet started.
-
updateHeaders
final Metadata updateHeaders(Metadata originalHeaders, int previousAttemptCount)
Adds grpc-previous-rpc-attempts in the headers of a retry/hedging RPC.
-
drain
private void drain(RetriableStream.Substream substream)
-
prestart
@CheckReturnValue @Nullable abstract Status prestart()
Runs pre-start tasks. Returns the Status of shutdown if the channel is shutdown.
-
start
public final void start(ClientStreamListener listener)
Starts the first PRC attempt.- Specified by:
startin interfaceClientStream- Parameters:
listener- non-nulllistener of stream events
-
pushbackHedging
private void pushbackHedging(@Nullable java.lang.Integer delayMillis)
-
cancel
public final void cancel(Status reason)
Description copied from interface:ClientStreamAbnormally terminates the stream. After calling this method, no further messages will be sent or received, however it may still be possible to receive buffered messages for a brief period untilClientStreamListener.closed(io.grpc.Status, io.grpc.internal.ClientStreamListener.RpcProgress, io.grpc.Metadata)is called. This method may only be called afterClientStream.start(io.grpc.internal.ClientStreamListener), but else is safe to be called at any time and multiple times and from any thread.- Specified by:
cancelin interfaceClientStream- Parameters:
reason- must be non-OK
-
delayOrExecute
private void delayOrExecute(RetriableStream.BufferEntry bufferEntry)
-
writeMessage
public final void writeMessage(java.io.InputStream message)
Do not use it directly. UsesendMessage(Object)instead because we don't use InputStream for buffering.- Specified by:
writeMessagein interfaceStream- Parameters:
message- stream containing the serialized message to be sent
-
sendMessage
final void sendMessage(ReqT message)
-
request
public final void request(int numMessages)
Description copied from interface:StreamRequests up to the given number of messages from the call to be delivered viaStreamListener.messagesAvailable(StreamListener.MessageProducer). No additional messages will be delivered. If the stream has astart()method, it must be called before requesting messages.
-
flush
public final void flush()
Description copied from interface:StreamFlushes any internally buffered messages to the remote end-point.
-
isReady
public final boolean isReady()
Description copied from interface:StreamIftrue, indicates that the transport is capable of sending additional messages without requiring excessive buffering internally. Otherwise,StreamListener.onReady()will be called when it turnstrue.This is just a suggestion and the application is free to ignore it, however doing so may result in excessive buffering within the transport.
-
optimizeForDirectExecutor
public void optimizeForDirectExecutor()
Description copied from interface:StreamProvides a hint that directExecutor is being used by the listener for callbacks to the application. No action is required. There is no requirement that this method actually matches the executor used.- Specified by:
optimizeForDirectExecutorin interfaceStream
-
setCompressor
public final void setCompressor(Compressor compressor)
Description copied from interface:StreamSets the compressor on the framer.- Specified by:
setCompressorin interfaceStream- Parameters:
compressor- the compressor to use
-
setFullStreamDecompression
public final void setFullStreamDecompression(boolean fullStreamDecompression)
Description copied from interface:ClientStreamEnables full-stream decompression, allowing the client stream to useGzipInflatingBufferto decode inbound GZIP compressed streams.- Specified by:
setFullStreamDecompressionin interfaceClientStream
-
setMessageCompression
public final void setMessageCompression(boolean enable)
Description copied from interface:StreamEnables per-message compression, if an encoding type has been negotiated. If no message encoding has been negotiated, this is a no-op. By default per-message compression is enabled, but may not have any effect if compression is not enabled on the call.- Specified by:
setMessageCompressionin interfaceStream
-
halfClose
public final void halfClose()
Description copied from interface:ClientStreamCloses the local side of this stream and flushes any remaining messages. After this is called, no further messages may be sent on this stream, but additional messages may be received until the remote end-point is closed. This method may only be called once, and only afterClientStream.start(io.grpc.internal.ClientStreamListener).- Specified by:
halfClosein interfaceClientStream
-
setAuthority
public final void setAuthority(java.lang.String authority)
Description copied from interface:ClientStreamOverride the default authority withauthority. May only be called beforeClientStream.start(io.grpc.internal.ClientStreamListener).- Specified by:
setAuthorityin interfaceClientStream
-
setDecompressorRegistry
public final void setDecompressorRegistry(DecompressorRegistry decompressorRegistry)
Description copied from interface:ClientStreamSets the registry to find a decompressor for the framer. May only be called beforeClientStream.start(io.grpc.internal.ClientStreamListener). If the transport does not support compression, this may do nothing.- Specified by:
setDecompressorRegistryin interfaceClientStream- Parameters:
decompressorRegistry- the registry of decompressors for decoding responses
-
setMaxInboundMessageSize
public final void setMaxInboundMessageSize(int maxSize)
Description copied from interface:ClientStreamSets the max size accepted from the remote endpoint.- Specified by:
setMaxInboundMessageSizein interfaceClientStream
-
setMaxOutboundMessageSize
public final void setMaxOutboundMessageSize(int maxSize)
Description copied from interface:ClientStreamSets the max size sent to the remote endpoint.- Specified by:
setMaxOutboundMessageSizein interfaceClientStream
-
setDeadline
public final void setDeadline(Deadline deadline)
Description copied from interface:ClientStreamSets the effective deadline of the RPC.- Specified by:
setDeadlinein interfaceClientStream
-
getAttributes
public final Attributes getAttributes()
Description copied from interface:ClientStreamAttributes that the stream holds at the current moment. Thread-safe and can be called at any time, although some attributes are there only after a certain point.- Specified by:
getAttributesin interfaceClientStream
-
appendTimeoutInsight
public void appendTimeoutInsight(InsightBuilder insight)
Description copied from interface:ClientStreamAppend information that will be included in the locally generated DEADLINE_EXCEEDED errors to the givenInsightBuilder, in order to tell the user about the state of the stream so that they can better diagnose the cause of the error.- Specified by:
appendTimeoutInsightin interfaceClientStream
-
setRandom
static void setRandom(java.util.Random random)
-
hasPotentialHedging
private boolean hasPotentialHedging(RetriableStream.State state)
Whether there is any potential hedge at the moment. A false return value implies there is absolutely no potential hedge. At least one of the hedges will observe a false return value when calling this method, unless otherwise the rpc is committed.
-
freezeHedging
private void freezeHedging()
-
safeCloseMasterListener
private void safeCloseMasterListener(Status status, ClientStreamListener.RpcProgress progress, Metadata metadata)
-
-