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 CloseStateprivate Throwableprivate Threadprivate GoAwayFrameprivate GoAwayFrameprivate longprivate final org.eclipse.jetty.util.thread.Lockerprivate final Queue<HTTP2Session.StreamsState.Slot> private final AtomicLongprivate Runnable -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate booleancreateLocalStream(HTTP2Session.StreamsState.Slot slot, List<StreamFrame> frames, org.eclipse.jetty.util.Promise<Stream> promise, Stream.Listener listener, int streamId) private voidflush()Iterates over the entries of the slot queue to flush them.private voidfreeSlot(HTTP2Session.StreamsState.Slot slot, int streamId) private CloseStateprivate booleangoAway(GoAwayFrame frame, org.eclipse.jetty.util.Callback callback) private voidprivate voidnewLocalStream(IStream.FrameList frameList, org.eclipse.jetty.util.Promise<Stream> promise, Stream.Listener listener) private booleannewRemoteStream(int streamId) private voidonGoAway(GoAwayFrame frame) private booleanprivate voidonSessionFailure(int error, String reason, org.eclipse.jetty.util.Callback callback) private voidprivate voidprivate voidprivate voidprivate intpriority(PriorityFrame frame, org.eclipse.jetty.util.Callback callback) private voidpush(PushPromiseFrame frame, org.eclipse.jetty.util.Promise<Stream> promise, Stream.Listener listener) private intreserveSlot(HTTP2Session.StreamsState.Slot slot, int streamId, Consumer<Throwable> fail) private voidsendGoAway(GoAwayFrame frame, org.eclipse.jetty.util.Callback callback) private voidsendGoAwayAndTerminate(GoAwayFrame frame, GoAwayFrame eventFrame) private voidterminate(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
-