Class DelayedStream

  • All Implemented Interfaces:
    ClientStream, Stream
    Direct Known Subclasses:
    DelayedClientTransport.PendingStream

    class DelayedStream
    extends java.lang.Object
    implements ClientStream
    A stream that queues requests before the transport is available, and delegates to a real stream implementation when the transport is available.

    ClientStream itself doesn't require thread-safety. However, the state of DelayedStream may be internally altered by different threads, thus internal synchronization is necessary.

    • Field Detail

      • passThrough

        private volatile boolean passThrough
        true once realStream is valid and all pending calls have been drained.
      • listener

        private ClientStreamListener listener
        Non-null iff start has been called. Used to assert methods are called in appropriate order, but also used if an error occurs before realStream is set.
      • realStream

        private ClientStream realStream
        Must hold this lock when setting.
      • pendingCalls

        private java.util.List<java.lang.Runnable> pendingCalls
      • startTimeNanos

        private long startTimeNanos
      • streamSetTimeNanos

        private long streamSetTimeNanos
      • preStartPendingCalls

        private java.util.List<java.lang.Runnable> preStartPendingCalls
    • Constructor Detail

      • DelayedStream

        DelayedStream()
    • Method Detail

      • setMaxInboundMessageSize

        public void setMaxInboundMessageSize​(int maxSize)
        Description copied from interface: ClientStream
        Sets the max size accepted from the remote endpoint.
        Specified by:
        setMaxInboundMessageSize in interface ClientStream
      • setMaxOutboundMessageSize

        public void setMaxOutboundMessageSize​(int maxSize)
        Description copied from interface: ClientStream
        Sets the max size sent to the remote endpoint.
        Specified by:
        setMaxOutboundMessageSize in interface ClientStream
      • appendTimeoutInsight

        public void appendTimeoutInsight​(InsightBuilder insight)
        Description copied from interface: ClientStream
        Append information that will be included in the locally generated DEADLINE_EXCEEDED errors to the given InsightBuilder, 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:
        appendTimeoutInsight in interface ClientStream
      • setStream

        @CheckReturnValue
        final java.lang.Runnable setStream​(ClientStream stream)
        Transfers all pending and future requests and mutations to the given stream. Method will return quickly, but if the returned Runnable is non-null it must be called to complete the process. The Runnable may take a while to execute.

        No-op if either this method or cancel(io.grpc.Status) have already been called.

      • drainPendingCalls

        private void drainPendingCalls()
        Called to transition passThrough to true. This method is not safe to be called multiple times; the caller must ensure it will only be called once, ever. this lock should not be held when calling this method.
      • delayOrExecute

        private void delayOrExecute​(java.lang.Runnable runnable)
        Enqueue the runnable or execute it now. Call sites that may be called many times may want avoid this method if passThrough == true.

        Note that this method is no more thread-safe than runnable. It is thread-safe if and only if runnable is thread-safe.

      • internalStart

        private void internalStart​(ClientStreamListener listener)
        Starts stream without synchronization. listener should be same instance as listener.
      • getAttributes

        public Attributes getAttributes()
        Description copied from interface: ClientStream
        Attributes 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:
        getAttributes in interface ClientStream
      • writeMessage

        public void writeMessage​(java.io.InputStream message)
        Description copied from interface: Stream
        Writes a message payload to the remote end-point. The bytes from the stream are immediately read by the Transport. Where possible callers should use streams that are KnownLength to improve efficiency. This method will always return immediately and will not wait for the write to complete. If the stream has a start() method, it must be called before writing any messages.

        It is recommended that the caller consult Stream.isReady() before calling this method to avoid excessive buffering in the transport.

        This method takes ownership of the InputStream, and implementations are responsible for calling InputStream.close().

        Specified by:
        writeMessage in interface Stream
        Parameters:
        message - stream containing the serialized message to be sent
      • flush

        public void flush()
        Description copied from interface: Stream
        Flushes any internally buffered messages to the remote end-point.
        Specified by:
        flush in interface Stream
      • onEarlyCancellation

        protected void onEarlyCancellation​(Status reason)
      • setRealStream

        private void setRealStream​(ClientStream realStream)
      • halfClose

        public void halfClose()
        Description copied from interface: ClientStream
        Closes 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 after ClientStream.start(io.grpc.internal.ClientStreamListener).
        Specified by:
        halfClose in interface ClientStream
      • request

        public void request​(int numMessages)
        Description copied from interface: Stream
        Requests up to the given number of messages from the call to be delivered via StreamListener.messagesAvailable(StreamListener.MessageProducer). No additional messages will be delivered. If the stream has a start() method, it must be called before requesting messages.
        Specified by:
        request in interface Stream
        Parameters:
        numMessages - the requested number of messages to be delivered to the listener.
      • optimizeForDirectExecutor

        public void optimizeForDirectExecutor()
        Description copied from interface: Stream
        Provides 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:
        optimizeForDirectExecutor in interface Stream
      • setCompressor

        public void setCompressor​(Compressor compressor)
        Description copied from interface: Stream
        Sets the compressor on the framer.
        Specified by:
        setCompressor in interface Stream
        Parameters:
        compressor - the compressor to use
      • setFullStreamDecompression

        public void setFullStreamDecompression​(boolean fullStreamDecompression)
        Description copied from interface: ClientStream
        Enables full-stream decompression, allowing the client stream to use GzipInflatingBuffer to decode inbound GZIP compressed streams.
        Specified by:
        setFullStreamDecompression in interface ClientStream
      • isReady

        public boolean isReady()
        Description copied from interface: Stream
        If true, indicates that the transport is capable of sending additional messages without requiring excessive buffering internally. Otherwise, StreamListener.onReady() will be called when it turns true.

        This is just a suggestion and the application is free to ignore it, however doing so may result in excessive buffering within the transport.

        Specified by:
        isReady in interface Stream
      • setMessageCompression

        public void setMessageCompression​(boolean enable)
        Description copied from interface: Stream
        Enables 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:
        setMessageCompression in interface Stream