Skip to content

Commit 4c08d2b

Browse files
committed
[core] Changed the default value of maxQueue option in muxers from unlimited to 1 for better compatibility with servers that don't support HTTP pipelining
1 parent 1fc4951 commit 4c08d2b

File tree

3 files changed

+42
-22
lines changed

3 files changed

+42
-22
lines changed

src/filters/http.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1528,7 +1528,8 @@ auto Mux::verify_http_version(pjs::Str *name) -> int {
15281528
//
15291529

15301530
Mux::Session::Session(const Mux::Options &options, std::shared_ptr<BufferStats> buffer_stats)
1531-
: Encoder(false, buffer_stats)
1531+
: MuxQueue(this)
1532+
, Encoder(false, buffer_stats)
15321533
, Decoder(true)
15331534
, http2::Client(options)
15341535
, m_options(options)

src/filters/mux.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,19 @@ MuxSession::Options::Options(pjs::Object *options) {
115115
// - MuxSessionPools
116116
//
117117

118+
void MuxSession::increase_share_count() {
119+
m_share_count++;
120+
m_pool->sort(this);
121+
}
122+
123+
void MuxSession::decrease_share_count() {
124+
if (m_pool) {
125+
m_pool->free(this);
126+
} else {
127+
close();
128+
}
129+
}
130+
118131
void MuxSession::set_pending(bool pending) {
119132
if (pending != m_is_pending) {
120133
if (!pending) {
@@ -157,14 +170,6 @@ void MuxSession::close() {
157170
}
158171
}
159172

160-
void MuxSession::free() {
161-
if (m_pool) {
162-
m_pool->free(this);
163-
} else {
164-
close();
165-
}
166-
}
167-
168173
//
169174
// MuxSessionPool
170175
//
@@ -185,9 +190,7 @@ auto MuxSessionPool::alloc() -> MuxSession* {
185190
if ((max_share_count <= 0 || s->m_share_count < max_share_count) &&
186191
(max_message_count <= 0 || s->m_message_count < max_message_count)
187192
) {
188-
s->m_share_count++;
189193
s->m_message_count++;
190-
sort(s);
191194
return s;
192195
}
193196
s = s->next();
@@ -376,7 +379,6 @@ void MuxSource::reset() {
376379
if (m_session) {
377380
stop_waiting();
378381
close_stream();
379-
m_session->free();
380382
m_session = nullptr;
381383
}
382384
m_waiting_events.clear();
@@ -424,7 +426,6 @@ void MuxSource::alloc_stream() {
424426
if (m_session && !m_session->is_open()) {
425427
stop_waiting();
426428
close_stream();
427-
m_session->free();
428429
m_session = nullptr;
429430
}
430431

@@ -570,6 +571,17 @@ void MuxQueue::on_reply(Event *evt) {
570571
// - MuxQueue::Receiver
571572
//
572573

574+
MuxQueue::Stream::Stream(MuxQueue *queue, MuxSource *source)
575+
: m_queue(queue)
576+
, m_source(source)
577+
{
578+
queue->m_session->increase_share_count();
579+
}
580+
581+
MuxQueue::Stream::~Stream() {
582+
m_queue->m_session->decrease_share_count();
583+
}
584+
573585
void MuxQueue::Stream::on_event(Event *evt) {
574586
auto q = m_queue;
575587

src/filters/mux.hpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class MuxSession :
6161

6262
struct Options : public pipy::Options {
6363
double max_idle = 60;
64-
int max_queue = 0;
64+
int max_queue = 1;
6565
int max_messages = 0;
6666
Options() {}
6767
Options(pjs::Object *options);
@@ -72,6 +72,9 @@ class MuxSession :
7272
virtual void mux_session_close_stream(EventFunction *stream) = 0;
7373
virtual void mux_session_close() = 0;
7474

75+
void increase_share_count();
76+
void decrease_share_count();
77+
7578
protected:
7679
auto pool() const -> MuxSessionPool* { return m_pool; }
7780
auto input() const -> EventTarget::Input* { return m_pipeline->input(); }
@@ -85,13 +88,12 @@ class MuxSession :
8588
private:
8689
void open(MuxSource *source, Pipeline *pipeline);
8790
void close();
88-
void free();
8991

9092
MuxSessionPool* m_pool = nullptr;
9193
pjs::Ref<Pipeline> m_pipeline;
9294
pjs::Ref<StreamEnd> m_eos;
9395
List<MuxSource> m_waiting_sources;
94-
int m_share_count = 1;
96+
int m_share_count = 0;
9597
int m_message_count = 0;
9698
double m_free_time = 0;
9799
bool m_is_pending = false;
@@ -217,6 +219,8 @@ class MuxSource : public List<MuxSource>::Item {
217219

218220
class MuxQueue : public EventSource {
219221
protected:
222+
MuxQueue(MuxSession *session) : m_session(session) {}
223+
220224
void reset();
221225
auto stream(MuxSource *source) -> EventFunction*;
222226
void close(EventFunction *stream);
@@ -238,11 +242,11 @@ class MuxQueue : public EventSource {
238242
public pjs::RefCount<Stream>,
239243
public EventFunction
240244
{
241-
protected:
242-
Stream(MuxQueue *queue, MuxSource *source)
243-
: m_queue(queue)
244-
, m_source(source) {}
245+
public:
246+
Stream(MuxQueue *queue, MuxSource *source);
247+
~Stream();
245248

249+
protected:
246250
virtual void on_event(Event *evt) override;
247251

248252
private:
@@ -279,12 +283,13 @@ class MuxQueue : public EventSource {
279283
pjs::Ref<Stream> m_stream;
280284
int m_output_count;
281285
bool m_has_message_started = false;
286+
287+
friend class MuxQueue;
282288
};
283289

290+
MuxSession* m_session;
284291
List<Receiver> m_receivers;
285292
pjs::Ref<Stream> m_dedicated_stream;
286-
287-
friend class Stream;
288293
};
289294

290295
//
@@ -346,6 +351,8 @@ class Mux : public MuxBase {
346351
public pjs::Pooled<Session, MuxSession>,
347352
public MuxQueue
348353
{
354+
Session() : MuxQueue(this) {}
355+
349356
virtual void mux_session_open(MuxSource *source) override;
350357
virtual auto mux_session_open_stream(MuxSource *source) -> EventFunction* override;
351358
virtual void mux_session_close_stream(EventFunction *stream) override;

0 commit comments

Comments
 (0)