nghttpx: Close and disallow h1 backend connection on backend replacement
This commit is contained in:
parent
0ca7c4cb38
commit
cb7269f334
|
@ -29,10 +29,14 @@ namespace shrpx {
|
||||||
|
|
||||||
DownstreamConnectionPool::DownstreamConnectionPool() {}
|
DownstreamConnectionPool::DownstreamConnectionPool() {}
|
||||||
|
|
||||||
DownstreamConnectionPool::~DownstreamConnectionPool() {
|
DownstreamConnectionPool::~DownstreamConnectionPool() { remove_all(); }
|
||||||
|
|
||||||
|
void DownstreamConnectionPool::remove_all() {
|
||||||
for (auto dconn : pool_) {
|
for (auto dconn : pool_) {
|
||||||
delete dconn;
|
delete dconn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pool_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DownstreamConnectionPool::add_downstream_connection(
|
void DownstreamConnectionPool::add_downstream_connection(
|
||||||
|
|
|
@ -42,6 +42,7 @@ public:
|
||||||
void add_downstream_connection(std::unique_ptr<DownstreamConnection> dconn);
|
void add_downstream_connection(std::unique_ptr<DownstreamConnection> dconn);
|
||||||
std::unique_ptr<DownstreamConnection> pop_downstream_connection();
|
std::unique_ptr<DownstreamConnection> pop_downstream_connection();
|
||||||
void remove_downstream_connection(DownstreamConnection *dconn);
|
void remove_downstream_connection(DownstreamConnection *dconn);
|
||||||
|
void remove_all();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::set<DownstreamConnection *> pool_;
|
std::set<DownstreamConnection *> pool_;
|
||||||
|
|
|
@ -166,7 +166,11 @@ HttpDownstreamConnection::HttpDownstreamConnection(
|
||||||
ioctrl_(&conn_.rlimit),
|
ioctrl_(&conn_.rlimit),
|
||||||
response_htp_{0} {}
|
response_htp_{0} {}
|
||||||
|
|
||||||
HttpDownstreamConnection::~HttpDownstreamConnection() {}
|
HttpDownstreamConnection::~HttpDownstreamConnection() {
|
||||||
|
if (LOG_ENABLED(INFO)) {
|
||||||
|
DCLOG(INFO, this) << "Deleted";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int HttpDownstreamConnection::attach_downstream(Downstream *downstream) {
|
int HttpDownstreamConnection::attach_downstream(Downstream *downstream) {
|
||||||
if (LOG_ENABLED(INFO)) {
|
if (LOG_ENABLED(INFO)) {
|
||||||
|
@ -1173,4 +1177,6 @@ HttpDownstreamConnection::get_downstream_addr_group() const {
|
||||||
|
|
||||||
DownstreamAddr *HttpDownstreamConnection::get_addr() const { return addr_; }
|
DownstreamAddr *HttpDownstreamConnection::get_addr() const { return addr_; }
|
||||||
|
|
||||||
|
bool HttpDownstreamConnection::poolable() const { return !group_->retired; }
|
||||||
|
|
||||||
} // namespace shrpx
|
} // namespace shrpx
|
||||||
|
|
|
@ -61,7 +61,7 @@ public:
|
||||||
|
|
||||||
virtual void on_upstream_change(Upstream *upstream);
|
virtual void on_upstream_change(Upstream *upstream);
|
||||||
|
|
||||||
virtual bool poolable() const { return true; }
|
virtual bool poolable() const;
|
||||||
|
|
||||||
virtual DownstreamAddrGroup *get_downstream_addr_group() const;
|
virtual DownstreamAddrGroup *get_downstream_addr_group() const;
|
||||||
|
|
||||||
|
|
|
@ -141,6 +141,11 @@ Worker::Worker(struct ev_loop *loop, SSL_CTX *sv_ssl_ctx, SSL_CTX *cl_ssl_ctx,
|
||||||
|
|
||||||
void Worker::replace_downstream_config(
|
void Worker::replace_downstream_config(
|
||||||
std::shared_ptr<DownstreamConfig> downstreamconf) {
|
std::shared_ptr<DownstreamConfig> downstreamconf) {
|
||||||
|
for (auto &g : downstream_addr_groups_) {
|
||||||
|
g->retired = true;
|
||||||
|
g->shared_addr->dconn_pool.remove_all();
|
||||||
|
}
|
||||||
|
|
||||||
downstreamconf_ = downstreamconf;
|
downstreamconf_ = downstreamconf;
|
||||||
|
|
||||||
downstream_addr_groups_ = std::vector<std::shared_ptr<DownstreamAddrGroup>>(
|
downstream_addr_groups_ = std::vector<std::shared_ptr<DownstreamAddrGroup>>(
|
||||||
|
@ -153,14 +158,11 @@ void Worker::replace_downstream_config(
|
||||||
dst = std::make_shared<DownstreamAddrGroup>();
|
dst = std::make_shared<DownstreamAddrGroup>();
|
||||||
dst->pattern = src.pattern;
|
dst->pattern = src.pattern;
|
||||||
|
|
||||||
|
// TODO for some reason, clang-3.6 which comes with Ubuntu 15.10
|
||||||
|
// does not value initialize with std::make_shared.
|
||||||
auto shared_addr = std::make_shared<SharedDownstreamAddr>();
|
auto shared_addr = std::make_shared<SharedDownstreamAddr>();
|
||||||
|
|
||||||
// TODO for some reason, clang-3.6 which comes with Ubuntu 15.10
|
|
||||||
// does not value initialize SharedDownstreamAddr above.
|
|
||||||
shared_addr->next = 0;
|
|
||||||
shared_addr->addrs.resize(src.addrs.size());
|
shared_addr->addrs.resize(src.addrs.size());
|
||||||
shared_addr->http1_pri = {};
|
|
||||||
shared_addr->http2_pri = {};
|
|
||||||
|
|
||||||
size_t num_http1 = 0;
|
size_t num_http1 = 0;
|
||||||
size_t num_http2 = 0;
|
size_t num_http2 = 0;
|
||||||
|
|
|
@ -144,6 +144,10 @@ struct SharedDownstreamAddr {
|
||||||
struct DownstreamAddrGroup {
|
struct DownstreamAddrGroup {
|
||||||
ImmutableString pattern;
|
ImmutableString pattern;
|
||||||
std::shared_ptr<SharedDownstreamAddr> shared_addr;
|
std::shared_ptr<SharedDownstreamAddr> shared_addr;
|
||||||
|
// true if this group is no longer used for new request. If this is
|
||||||
|
// true, the connection made using one of address in shared_addr
|
||||||
|
// must not be pooled.
|
||||||
|
bool retired;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct WorkerStat {
|
struct WorkerStat {
|
||||||
|
|
Loading…
Reference in New Issue