diff --git a/envoy/upstream/thread_local_cluster.h b/envoy/upstream/thread_local_cluster.h index 16c59ebf7f0ef..2efe626228475 100644 --- a/envoy/upstream/thread_local_cluster.h +++ b/envoy/upstream/thread_local_cluster.h @@ -17,12 +17,23 @@ class HttpPoolData { HttpPoolData(OnNewStreamFn on_new_stream, Http::ConnectionPool::Instance* pool) : on_new_stream_(on_new_stream), pool_(pool) {} + /** + * See documentation of Http::ConnectionPool::Instance. + */ Envoy::Http::ConnectionPool::Cancellable* newStream(Http::ResponseDecoder& response_decoder, Envoy::Http::ConnectionPool::Callbacks& callbacks) { on_new_stream_(); return pool_->newStream(response_decoder, callbacks); } + bool hasActiveConnections() const { return pool_->hasActiveConnections(); }; + + /** + * See documentation of Envoy::ConnectionPool::Instance. + */ + void addDrainedCallback(ConnectionPool::Instance::DrainedCb cb) { + pool_->addDrainedCallback(cb); + }; Upstream::HostDescriptionConstSharedPtr host() const { return pool_->host(); } diff --git a/test/common/upstream/cluster_manager_impl_test.cc b/test/common/upstream/cluster_manager_impl_test.cc index 4357ca2dccfc9..7fed2c6567b49 100644 --- a/test/common/upstream/cluster_manager_impl_test.cc +++ b/test/common/upstream/cluster_manager_impl_test.cc @@ -3422,6 +3422,27 @@ TEST_F(ClusterManagerImplTest, UpstreamSocketOptionsNullIsOkay) { EXPECT_TRUE(opt_cp.has_value()); } +TEST_F(ClusterManagerImplTest, HttpPoolDataForwardsCallsToConnectionPool) { + createWithLocalClusterUpdate(); + NiceMock context; + + Http::ConnectionPool::MockInstance* pool_mock = new Http::ConnectionPool::MockInstance(); + Network::Socket::OptionsSharedPtr options_to_return = nullptr; + + EXPECT_CALL(factory_, allocateConnPool_(_, _, _, _, _)).WillOnce(Return(pool_mock)); + + auto opt_cp = cluster_manager_->getThreadLocalCluster("cluster_1") + ->httpConnPool(ResourcePriority::Default, Http::Protocol::Http11, &context); + ASSERT_TRUE(opt_cp.has_value()); + + EXPECT_CALL(*pool_mock, hasActiveConnections()).WillOnce(Return(true)); + opt_cp.value().hasActiveConnections(); + + ConnectionPool::Instance::DrainedCb drained_cb = []() {}; + EXPECT_CALL(*pool_mock, addDrainedCallback(_)); + opt_cp.value().addDrainedCallback(drained_cb); +} + class TestUpstreamNetworkFilter : public Network::WriteFilter { public: Network::FilterStatus onWrite(Buffer::Instance&, bool) override {