Class DefaultHttp2LocalFlowController

java.lang.Object
io.netty.handler.codec.http2.DefaultHttp2LocalFlowController
All Implemented Interfaces:
Http2FlowController, Http2LocalFlowController

@UnstableApi public class DefaultHttp2LocalFlowController extends Object implements Http2LocalFlowController
Basic implementation of Http2LocalFlowController.

This class is NOT thread safe. The assumption is all methods must be invoked from a single thread. Typically this thread is the event loop thread for the ChannelHandlerContext managed by this class.

  • Field Details

    • DEFAULT_WINDOW_UPDATE_RATIO

      public static final float DEFAULT_WINDOW_UPDATE_RATIO
      The default ratio of window size to initial window size below which a WINDOW_UPDATE is sent to expand the window.
      See Also:
    • connection

      private final Http2Connection connection
    • stateKey

      private final Http2Connection.PropertyKey stateKey
    • frameWriter

      private Http2FrameWriter frameWriter
    • ctx

      private ChannelHandlerContext ctx
    • windowUpdateRatio

      private float windowUpdateRatio
    • initialWindowSize

      private int initialWindowSize
    • REDUCED_FLOW_STATE

      private static final DefaultHttp2LocalFlowController.FlowState REDUCED_FLOW_STATE
      The local flow control state for a single stream that is not in a state where flow controlled frames cannot be exchanged.
  • Constructor Details

    • DefaultHttp2LocalFlowController

      public DefaultHttp2LocalFlowController(Http2Connection connection)
    • DefaultHttp2LocalFlowController

      public DefaultHttp2LocalFlowController(Http2Connection connection, float windowUpdateRatio, boolean autoRefillConnectionWindow)
      Constructs a controller with the given settings.
      Parameters:
      connection - the connection state.
      windowUpdateRatio - the window percentage below which to send a WINDOW_UPDATE.
      autoRefillConnectionWindow - if true, effectively disables the connection window in the flow control algorithm as they will always refill automatically without requiring the application to consume the bytes. When enabled, the maximum bytes you must be prepared to queue is proportional to maximum number of concurrent streams * the initial window size per stream (SETTINGS_MAX_CONCURRENT_STREAMS SETTINGS_INITIAL_WINDOW_SIZE).
  • Method Details

    • frameWriter

      public DefaultHttp2LocalFlowController frameWriter(Http2FrameWriter frameWriter)
      Description copied from interface: Http2LocalFlowController
      Sets the writer to be use for sending WINDOW_UPDATE frames. This must be called before any flow controlled data is received.
      Specified by:
      frameWriter in interface Http2LocalFlowController
      Parameters:
      frameWriter - the HTTP/2 frame writer.
    • channelHandlerContext

      public void channelHandlerContext(ChannelHandlerContext ctx)
      Description copied from interface: Http2FlowController
      Set the ChannelHandlerContext for which to apply flow control on.

      This must be called to properly initialize the Http2FlowController. Not calling this is considered a programming error.

      Specified by:
      channelHandlerContext in interface Http2FlowController
      Parameters:
      ctx - The ChannelHandlerContext for which to apply flow control on.
    • initialWindowSize

      public void initialWindowSize(int newWindowSize) throws Http2Exception
      Description copied from interface: Http2FlowController
      Sets the connection-wide initial flow control window and updates all stream windows (but not the connection stream window) by the delta.

      Represents the value for SETTINGS_INITIAL_WINDOW_SIZE. This method should only be called by Netty (not users) as a result of a receiving a SETTINGS frame.

      Specified by:
      initialWindowSize in interface Http2FlowController
      Parameters:
      newWindowSize - the new initial window size.
      Throws:
      Http2Exception - thrown if any protocol-related error occurred.
    • initialWindowSize

      public int initialWindowSize()
      Description copied from interface: Http2FlowController
      Gets the connection-wide initial flow control window size that is used as the basis for new stream flow control windows.

      Represents the value for SETTINGS_INITIAL_WINDOW_SIZE. The initial value returned by this method must be Http2CodecUtil.DEFAULT_WINDOW_SIZE.

      Specified by:
      initialWindowSize in interface Http2FlowController
    • windowSize

      public int windowSize(Http2Stream stream)
      Description copied from interface: Http2FlowController
      Get the portion of the flow control window for the given stream that is currently available for sending/receiving frames which are subject to flow control. This quantity is measured in number of bytes.
      Specified by:
      windowSize in interface Http2FlowController
    • initialWindowSize

      public int initialWindowSize(Http2Stream stream)
      Description copied from interface: Http2LocalFlowController
      Get the initial flow control window size for the given stream. This quantity is measured in number of bytes. Note the unavailable window portion can be calculated by Http2FlowController.initialWindowSize() - Http2FlowController.windowSize(Http2Stream).
      Specified by:
      initialWindowSize in interface Http2LocalFlowController
    • incrementWindowSize

      public void incrementWindowSize(Http2Stream stream, int delta) throws Http2Exception
      Description copied from interface: Http2FlowController
      Increments the size of the stream's flow control window by the given delta.

      In the case of a Http2RemoteFlowController this is called upon receipt of a WINDOW_UPDATE frame from the remote endpoint to mirror the changes to the window size.

      For a Http2LocalFlowController this can be called to request the expansion of the window size published by this endpoint. It is up to the implementation, however, as to when a WINDOW_UPDATE is actually sent.

      Specified by:
      incrementWindowSize in interface Http2FlowController
      Parameters:
      stream - The subject stream. Use Http2Connection.connectionStream() for requesting the size of the connection window.
      delta - the change in size of the flow control window.
      Throws:
      Http2Exception - thrown if a protocol-related error occurred.
    • consumeBytes

      public boolean consumeBytes(Http2Stream stream, int numBytes) throws Http2Exception
      Description copied from interface: Http2LocalFlowController
      Indicates that the application has consumed a number of bytes for the given stream and is therefore ready to receive more data from the remote endpoint. The application must consume any bytes that it receives or the flow control window will collapse. Consuming bytes enables the flow controller to send WINDOW_UPDATE to restore a portion of the flow control window for the stream.

      If stream is null or closed (i.e. Http2Stream.state() method returns Http2Stream.State.CLOSED), calling this method has no effect.

      Specified by:
      consumeBytes in interface Http2LocalFlowController
      Parameters:
      stream - the stream for which window space should be freed. The connection stream object must not be used. If stream is null or closed (i.e. Http2Stream.state() method returns Http2Stream.State.CLOSED), calling this method has no effect.
      numBytes - the number of bytes to be returned to the flow control window.
      Returns:
      true if a WINDOW_UPDATE was sent, false otherwise.
      Throws:
      Http2Exception - if the number of bytes returned exceeds the Http2LocalFlowController.unconsumedBytes(Http2Stream) for the stream.
    • consumeAllBytes

      private boolean consumeAllBytes(DefaultHttp2LocalFlowController.FlowState state, int numBytes) throws Http2Exception
      Throws:
      Http2Exception
    • unconsumedBytes

      public int unconsumedBytes(Http2Stream stream)
      Description copied from interface: Http2LocalFlowController
      The number of bytes for the given stream that have been received but not yet consumed by the application.
      Specified by:
      unconsumedBytes in interface Http2LocalFlowController
      Parameters:
      stream - the stream for which window space should be freed.
      Returns:
      the number of unconsumed bytes for the stream.
    • checkValidRatio

      private static void checkValidRatio(float ratio)
    • windowUpdateRatio

      public void windowUpdateRatio(float ratio)
      The window update ratio is used to determine when a window update must be sent. If the ratio of bytes processed since the last update has meet or exceeded this ratio then a window update will be sent. This is the global window update ratio that will be used for new streams.
      Parameters:
      ratio - the ratio to use when checking if a WINDOW_UPDATE is determined necessary for new streams.
      Throws:
      IllegalArgumentException - If the ratio is out of bounds (0, 1).
    • windowUpdateRatio

      public float windowUpdateRatio()
      The window update ratio is used to determine when a window update must be sent. If the ratio of bytes processed since the last update has meet or exceeded this ratio then a window update will be sent. This is the global window update ratio that will be used for new streams.
    • windowUpdateRatio

      public void windowUpdateRatio(Http2Stream stream, float ratio) throws Http2Exception
      The window update ratio is used to determine when a window update must be sent. If the ratio of bytes processed since the last update has meet or exceeded this ratio then a window update will be sent. This window update ratio will only be applied to streamId.

      Note it is the responsibly of the caller to ensure that the initial SETTINGS frame is sent before this is called. It would be considered a Http2Error.PROTOCOL_ERROR if a WINDOW_UPDATE was generated by this method before the initial SETTINGS frame is sent.

      Parameters:
      stream - the stream for which ratio applies to.
      ratio - the ratio to use when checking if a WINDOW_UPDATE is determined necessary.
      Throws:
      Http2Exception - If a protocol-error occurs while generating WINDOW_UPDATE frames
    • windowUpdateRatio

      public float windowUpdateRatio(Http2Stream stream) throws Http2Exception
      The window update ratio is used to determine when a window update must be sent. If the ratio of bytes processed since the last update has meet or exceeded this ratio then a window update will be sent. This window update ratio will only be applied to streamId.
      Throws:
      Http2Exception - If no stream corresponding to stream could be found.
    • receiveFlowControlledFrame

      public void receiveFlowControlledFrame(Http2Stream stream, ByteBuf data, int padding, boolean endOfStream) throws Http2Exception
      Description copied from interface: Http2LocalFlowController
      Receives an inbound DATA frame from the remote endpoint and applies flow control policies to it for both the stream as well as the connection. If any flow control policies have been violated, an exception is raised immediately, otherwise the frame is considered to have "passed" flow control.

      If stream is null or closed, flow control should only be applied to the connection window and the bytes are immediately consumed.

      Specified by:
      receiveFlowControlledFrame in interface Http2LocalFlowController
      Parameters:
      stream - the subject stream for the received frame. The connection stream object must not be used. If stream is null or closed, flow control should only be applied to the connection window and the bytes are immediately consumed.
      data - payload buffer for the frame.
      padding - additional bytes that should be added to obscure the true content size. Must be between 0 and 256 (inclusive).
      endOfStream - Indicates whether this is the last frame to be sent from the remote endpoint for this stream.
      Throws:
      Http2Exception - if any flow control errors are encountered.
    • connectionState

      private DefaultHttp2LocalFlowController.FlowState connectionState()
    • state

    • isClosed

      private static boolean isClosed(Http2Stream stream)