nghttpx: Fix request is sent to backend prematurely with http2 upstream

This commit is contained in:
Tatsuhiro Tsujikawa 2014-10-07 00:31:35 +09:00
parent f3a76d84f1
commit a225bb29df
3 changed files with 26 additions and 0 deletions

View File

@ -121,6 +121,17 @@ std::unique_ptr<Downstream> DownstreamQueue::pop_pending()
return downstream;
}
Downstream* DownstreamQueue::pending_top() const
{
auto i = std::begin(pending_downstreams_);
if(i == std::end(pending_downstreams_)) {
return nullptr;
}
return (*i).second.get();
}
size_t DownstreamQueue::num_active() const
{
return active_downstreams_.size();

View File

@ -58,6 +58,9 @@ public:
// Pops first Downstream object in pending_downstreams_ and returns
// it.
std::unique_ptr<Downstream> pop_pending();
// Returns first Downstream object in pending_downstreams_. This
// does not pop the first one. If queue is empty, returns nullptr.
Downstream* pending_top() const;
private:
// Downstream objects, not processed yet
std::map<int32_t, std::unique_ptr<Downstream>> pending_downstreams_;

View File

@ -382,6 +382,18 @@ void Http2Upstream::maintain_downstream_concurrency()
{
while(get_config()->max_downstream_connections >
downstream_queue_.num_active()) {
if(downstream_queue_.pending_empty()) {
break;
}
{
auto downstream = downstream_queue_.pending_top();
if(downstream->get_request_state() != Downstream::HEADER_COMPLETE &&
downstream->get_request_state() != Downstream::MSG_COMPLETE) {
break;
}
}
auto downstream = downstream_queue_.pop_pending();
if(!downstream) {