Class HTTP2Session.StreamsState
- Enclosing class:
HTTP2Session
The HTTP/2 specification requires that stream ids are monotonically increasing, see RFC 7540, 5.1.1.
This implementation uses a queue to atomically reserve a stream id and claim a slot in the queue; the slot is then assigned the entries to write.
Concurrent threads push slots in the queue but only one thread flushes the slots, up to the slot that has a non-null entries to write, therefore guaranteeing that frames are sent strictly in their stream id order.
This class also coordinates the creation of streams with the close of the session, see RFC 7540, 6.8.
-
Nested Class Summary
Nested Classes -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate CloseState
private Throwable
private Thread
private GoAwayFrame
private GoAwayFrame
private long
private final org.eclipse.jetty.util.thread.Locker
private final Queue
<HTTP2Session.StreamsState.Slot> private final AtomicLong
private Runnable
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate boolean
createLocalStream
(HTTP2Session.StreamsState.Slot slot, List<StreamFrame> frames, org.eclipse.jetty.util.Promise<Stream> promise, Stream.Listener listener, int streamId) private void
flush()
Iterates over the entries of the slot queue to flush them.private void
freeSlot
(HTTP2Session.StreamsState.Slot slot, int streamId) private CloseState
private boolean
goAway
(GoAwayFrame frame, org.eclipse.jetty.util.Callback callback) private void
private void
newLocalStream
(IStream.FrameList frameList, org.eclipse.jetty.util.Promise<Stream> promise, Stream.Listener listener) private boolean
newRemoteStream
(int streamId) private void
onGoAway
(GoAwayFrame frame) private boolean
private void
onSessionFailure
(int error, String reason, org.eclipse.jetty.util.Callback callback) private void
private void
private void
private void
private int
priority
(PriorityFrame frame, org.eclipse.jetty.util.Callback callback) private void
push
(PushPromiseFrame frame, org.eclipse.jetty.util.Promise<Stream> promise, Stream.Listener listener) private int
reserveSlot
(HTTP2Session.StreamsState.Slot slot, int streamId, Consumer<Throwable> fail) private void
sendGoAway
(GoAwayFrame frame, org.eclipse.jetty.util.Callback callback) private void
sendGoAwayAndTerminate
(GoAwayFrame frame, GoAwayFrame eventFrame) private void
terminate
(GoAwayFrame frame) toString()
private void
-
Field Details
-
lock
private final org.eclipse.jetty.util.thread.Locker lock -
slots
-
streamCount
-
idleTime
private long idleTime -
closed
-
zeroStreamsAction
-
goAwayRecv
-
goAwaySent
-
failure
-
flushing
-
-
Constructor Details
-
StreamsState
private StreamsState()
-
-
Method Details
-
getCloseState
-
goAway
-
halt
-
onGoAway
-
onShutdown
private void onShutdown() -
onIdleTimeout
private boolean onIdleTimeout() -
onSessionFailure
-
onWriteFailure
-
sendGoAwayAndTerminate
-
sendGoAway
-
onStreamCreated
private void onStreamCreated() -
onStreamDestroyed
private void onStreamDestroyed() -
tryRunZeroStreamsAction
private void tryRunZeroStreamsAction() -
terminate
-
priority
-
newLocalStream
private void newLocalStream(IStream.FrameList frameList, org.eclipse.jetty.util.Promise<Stream> promise, Stream.Listener listener) -
newRemoteStream
private boolean newRemoteStream(int streamId) -
push
private void push(PushPromiseFrame frame, org.eclipse.jetty.util.Promise<Stream> promise, Stream.Listener listener) -
createLocalStream
private boolean createLocalStream(HTTP2Session.StreamsState.Slot slot, List<StreamFrame> frames, org.eclipse.jetty.util.Promise<Stream> promise, Stream.Listener listener, int streamId) -
reserveSlot
private int reserveSlot(HTTP2Session.StreamsState.Slot slot, int streamId, Consumer<Throwable> fail) -
freeSlot
-
flush
private void flush()Iterates over the entries of the slot queue to flush them.
The flush proceeds until either one of the following two conditions is true:
- the queue is empty
- a slot with a no entries is encountered
When a slot with a no entries is encountered, then it means that a concurrent thread reserved a slot but hasn't set its entries yet. Since slots must be flushed in order, the thread encountering the slot with no entries must bail out and it is up to the concurrent thread to finish up flushing.
Note that only one thread can flush at any time; if two threads happen to call this method concurrently, one will do the work while the other will bail out, so it is safe that all threads call this method after they are done reserving a slot and setting the entries.
-
toString
-