Keep incoming streams only at server side
We should only keep incoming closed streams because we only keep at most max concurrent streams, which only applied to incoming streams.
This commit is contained in:
parent
2288ee8060
commit
93d8636fb0
|
@ -1023,6 +1023,7 @@ int nghttp2_session_close_stream(nghttp2_session *session, int32_t stream_id,
|
||||||
int rv;
|
int rv;
|
||||||
nghttp2_stream *stream;
|
nghttp2_stream *stream;
|
||||||
nghttp2_mem *mem;
|
nghttp2_mem *mem;
|
||||||
|
int is_my_stream_id;
|
||||||
|
|
||||||
mem = &session->mem;
|
mem = &session->mem;
|
||||||
stream = nghttp2_session_get_stream(session, stream_id);
|
stream = nghttp2_session_get_stream(session, stream_id);
|
||||||
|
@ -1070,14 +1071,16 @@ int nghttp2_session_close_stream(nghttp2_session *session, int32_t stream_id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is_my_stream_id = nghttp2_session_is_my_stream_id(session, stream_id);
|
||||||
|
|
||||||
/* pushed streams which is not opened yet is not counted toward max
|
/* pushed streams which is not opened yet is not counted toward max
|
||||||
concurrent limits */
|
concurrent limits */
|
||||||
if ((stream->flags & NGHTTP2_STREAM_FLAG_PUSH)) {
|
if ((stream->flags & NGHTTP2_STREAM_FLAG_PUSH)) {
|
||||||
if (!nghttp2_session_is_my_stream_id(session, stream_id)) {
|
if (!is_my_stream_id) {
|
||||||
--session->num_incoming_reserved_streams;
|
--session->num_incoming_reserved_streams;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (nghttp2_session_is_my_stream_id(session, stream_id)) {
|
if (is_my_stream_id) {
|
||||||
--session->num_outgoing_streams;
|
--session->num_outgoing_streams;
|
||||||
} else {
|
} else {
|
||||||
--session->num_incoming_streams;
|
--session->num_incoming_streams;
|
||||||
|
@ -1087,7 +1090,8 @@ int nghttp2_session_close_stream(nghttp2_session *session, int32_t stream_id,
|
||||||
/* Closes both directions just in case they are not closed yet */
|
/* Closes both directions just in case they are not closed yet */
|
||||||
stream->flags |= NGHTTP2_STREAM_FLAG_CLOSED;
|
stream->flags |= NGHTTP2_STREAM_FLAG_CLOSED;
|
||||||
|
|
||||||
if (session->server && nghttp2_stream_in_dep_tree(stream)) {
|
if (session->server && !is_my_stream_id &&
|
||||||
|
nghttp2_stream_in_dep_tree(stream)) {
|
||||||
/* On server side, retain stream at most MAX_CONCURRENT_STREAMS
|
/* On server side, retain stream at most MAX_CONCURRENT_STREAMS
|
||||||
combined with the current active incoming streams to make
|
combined with the current active incoming streams to make
|
||||||
dependency tree work better. */
|
dependency tree work better. */
|
||||||
|
|
|
@ -190,11 +190,13 @@ struct nghttp2_session {
|
||||||
updated when one frame was written. */
|
updated when one frame was written. */
|
||||||
uint64_t last_cycle;
|
uint64_t last_cycle;
|
||||||
void *user_data;
|
void *user_data;
|
||||||
/* Points to the latest closed stream. NULL if there is no closed
|
/* Points to the latest incoming closed stream. NULL if there is no
|
||||||
stream. Only used when session is initialized as server. */
|
closed stream. Only used when session is initialized as
|
||||||
|
server. */
|
||||||
nghttp2_stream *closed_stream_head;
|
nghttp2_stream *closed_stream_head;
|
||||||
/* Points to the oldest closed stream. NULL if there is no closed
|
/* Points to the oldest incoming closed stream. NULL if there is no
|
||||||
stream. Only used when session is initialized as server. */
|
closed stream. Only used when session is initialized as
|
||||||
|
server. */
|
||||||
nghttp2_stream *closed_stream_tail;
|
nghttp2_stream *closed_stream_tail;
|
||||||
/* Points to the latest idle stream. NULL if there is no idle
|
/* Points to the latest idle stream. NULL if there is no idle
|
||||||
stream. Only used when session is initialized as server .*/
|
stream. Only used when session is initialized as server .*/
|
||||||
|
|
|
@ -7378,7 +7378,8 @@ void test_nghttp2_session_stream_get_state(void) {
|
||||||
|
|
||||||
stream = nghttp2_session_find_stream(session, 2);
|
stream = nghttp2_session_find_stream(session, 2);
|
||||||
|
|
||||||
CU_ASSERT(NGHTTP2_STREAM_STATE_CLOSED == nghttp2_stream_get_state(stream));
|
/* At server, pushed stream object is not retained after closed */
|
||||||
|
CU_ASSERT(NULL == stream);
|
||||||
|
|
||||||
/* Push stream 4 associated to stream 5 */
|
/* Push stream 4 associated to stream 5 */
|
||||||
rv = nghttp2_submit_push_promise(session, NGHTTP2_FLAG_NONE, 5, reqnv,
|
rv = nghttp2_submit_push_promise(session, NGHTTP2_FLAG_NONE, 5, reqnv,
|
||||||
|
@ -7599,6 +7600,22 @@ void test_nghttp2_session_keep_closed_stream(void) {
|
||||||
CU_ASSERT(NULL == session->closed_stream_tail);
|
CU_ASSERT(NULL == session->closed_stream_tail);
|
||||||
CU_ASSERT(NULL == session->closed_stream_head);
|
CU_ASSERT(NULL == session->closed_stream_head);
|
||||||
|
|
||||||
|
nghttp2_session_close_stream(session, 3, NGHTTP2_NO_ERROR);
|
||||||
|
|
||||||
|
CU_ASSERT(1 == session->num_closed_streams);
|
||||||
|
CU_ASSERT(3 == session->closed_stream_head->stream_id);
|
||||||
|
|
||||||
|
/* server initiated stream is not counted to max concurrent limit */
|
||||||
|
open_stream(session, 2);
|
||||||
|
|
||||||
|
CU_ASSERT(1 == session->num_closed_streams);
|
||||||
|
CU_ASSERT(3 == session->closed_stream_head->stream_id);
|
||||||
|
|
||||||
|
nghttp2_session_close_stream(session, 2, NGHTTP2_NO_ERROR);
|
||||||
|
|
||||||
|
CU_ASSERT(1 == session->num_closed_streams);
|
||||||
|
CU_ASSERT(3 == session->closed_stream_head->stream_id);
|
||||||
|
|
||||||
nghttp2_session_del(session);
|
nghttp2_session_del(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue