Skip to content

Commit

Permalink
hcm: remove Server::Admin from conn_manager_impl. (#8809)
Browse files Browse the repository at this point in the history
Signed-off-by: Xin Zhuang <stevenzzz@google.com>
  • Loading branch information
stevenzzzz authored and mattklein123 committed Oct 30, 2019
1 parent 71f009a commit b0a03bc
Show file tree
Hide file tree
Showing 8 changed files with 27 additions and 27 deletions.
1 change: 0 additions & 1 deletion source/common/http/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,6 @@ envoy_cc_library(
"//include/envoy/router:rds_interface",
"//include/envoy/router:scopes_interface",
"//include/envoy/runtime:runtime_interface",
"//include/envoy/server:admin_interface",
"//include/envoy/server:overload_manager_interface",
"//include/envoy/ssl:connection_interface",
"//include/envoy/stats:stats_interface",
Expand Down
6 changes: 6 additions & 0 deletions source/common/http/conn_manager_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,12 @@ class ConnectionManagerConfig {
*/
virtual absl::optional<std::chrono::milliseconds> idleTimeout() const PURE;

/**
* @return if the connection manager does routing base on router config, e.g. a Server::Admin impl
* has no route config.
*/
virtual bool isRoutable() const PURE;

/**
* @return optional maximum connection duration timeout for manager connections.
*/
Expand Down
34 changes: 15 additions & 19 deletions source/common/http/conn_manager_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
#include "envoy/event/dispatcher.h"
#include "envoy/network/drain_decision.h"
#include "envoy/router/router.h"
#include "envoy/server/admin.h"
#include "envoy/ssl/connection.h"
#include "envoy/stats/scope.h"
#include "envoy/tracing/http_tracer.h"
Expand Down Expand Up @@ -489,22 +488,14 @@ ConnectionManagerImpl::ActiveStream::ActiveStream(ConnectionManagerImpl& connect
connection_manager_.stats_.named_.downstream_rq_time_, connection_manager_.timeSource())),
stream_info_(connection_manager_.codec_->protocol(), connection_manager_.timeSource()),
upstream_options_(std::make_shared<Network::Socket::Options>()) {
// For Server::Admin, no routeConfigProvider or SRDS route provider is used.
ASSERT(dynamic_cast<Server::Admin*>(&connection_manager_.config_) != nullptr ||
ASSERT(!connection_manager.config_.isRoutable() ||
((connection_manager.config_.routeConfigProvider() == nullptr &&
connection_manager.config_.scopedRouteConfigProvider() != nullptr) ||
(connection_manager.config_.routeConfigProvider() != nullptr &&
connection_manager.config_.scopedRouteConfigProvider() == nullptr)),
"Either routeConfigProvider or scopedRouteConfigProvider should be set in "
"ConnectionManagerImpl.");
if (connection_manager.config_.routeConfigProvider() != nullptr) {
snapped_route_config_ = connection_manager.config_.routeConfigProvider()->config();
} else if (connection_manager.config_.scopedRouteConfigProvider() != nullptr) {
snapped_scoped_routes_config_ =
connection_manager_.config_.scopedRouteConfigProvider()->config<Router::ScopedConfig>();
ASSERT(snapped_scoped_routes_config_ != nullptr,
"Scoped rds provider returns null for scoped routes config.");
}

ScopeTrackerScopeState scope(this,
connection_manager_.read_callbacks_->connection().dispatcher());

Expand Down Expand Up @@ -695,13 +686,18 @@ void ConnectionManagerImpl::ActiveStream::decodeHeaders(HeaderMapPtr&& headers,
ScopeTrackerScopeState scope(this,
connection_manager_.read_callbacks_->connection().dispatcher());
request_headers_ = std::move(headers);
// For Admin thread, we don't use routeConfigProvider or SRDS route provider.
if (dynamic_cast<Server::Admin*>(&connection_manager_.config_) == nullptr &&
connection_manager_.config_.scopedRouteConfigProvider() != nullptr) {
ASSERT(snapped_route_config_ == nullptr,
"Route config already latched to the active stream when scoped RDS is enabled.");
// We need to snap snapped_route_config_ here as it's used in mutateRequestHeaders later.
snapScopedRouteConfig();

// We need to snap snapped_route_config_ here as it's used in mutateRequestHeaders later.
if (connection_manager_.config_.isRoutable()) {
if (connection_manager_.config_.routeConfigProvider() != nullptr) {
snapped_route_config_ = connection_manager_.config_.routeConfigProvider()->config();
} else if (connection_manager_.config_.scopedRouteConfigProvider() != nullptr) {
snapped_scoped_routes_config_ =
connection_manager_.config_.scopedRouteConfigProvider()->config<Router::ScopedConfig>();
snapScopedRouteConfig();
}
} else {
snapped_route_config_ = connection_manager_.config_.routeConfigProvider()->config();
}

if (Http::Headers::get().MethodValues.Head ==
Expand Down Expand Up @@ -1322,7 +1318,7 @@ void ConnectionManagerImpl::ActiveStream::snapScopedRouteConfig() {
void ConnectionManagerImpl::ActiveStream::refreshCachedRoute() {
Router::RouteConstSharedPtr route;
if (request_headers_ != nullptr) {
if (dynamic_cast<Server::Admin*>(&connection_manager_.config_) == nullptr &&
if (connection_manager_.config_.isRoutable() &&
connection_manager_.config_.scopedRouteConfigProvider() != nullptr) {
// NOTE: re-select scope as well in case the scope key header has been changed by a filter.
snapScopedRouteConfig();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ class HttpConnectionManagerConfig : Logger::Loggable<Logger::Id::config>,
uint32_t maxRequestHeadersKb() const override { return max_request_headers_kb_; }
uint32_t maxRequestHeadersCount() const override { return max_request_headers_count_; }
absl::optional<std::chrono::milliseconds> idleTimeout() const override { return idle_timeout_; }
bool isRoutable() const override { return true; }
absl::optional<std::chrono::milliseconds> maxConnectionDuration() const override {
return max_connection_duration_;
}
Expand Down
1 change: 1 addition & 0 deletions source/server/http/admin.h
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ class AdminImpl : public Admin,
bool generateRequestId() override { return false; }
bool preserveExternalRequestId() const override { return false; }
absl::optional<std::chrono::milliseconds> idleTimeout() const override { return idle_timeout_; }
bool isRoutable() const override { return false; }
absl::optional<std::chrono::milliseconds> maxConnectionDuration() const override {
return max_connection_duration_;
}
Expand Down
1 change: 1 addition & 0 deletions test/common/http/conn_manager_impl_fuzz_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ class FuzzConfig : public ConnectionManagerConfig {
uint32_t maxRequestHeadersKb() const override { return max_request_headers_kb_; }
uint32_t maxRequestHeadersCount() const override { return max_request_headers_count_; }
absl::optional<std::chrono::milliseconds> idleTimeout() const override { return idle_timeout_; }
bool isRoutable() const override { return true; }
absl::optional<std::chrono::milliseconds> maxConnectionDuration() const override {
return max_connection_duration_;
}
Expand Down
8 changes: 1 addition & 7 deletions test/common/http/conn_manager_impl_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,7 @@ class HttpConnectionManagerImplTest : public testing::Test, public ConnectionMan
uint32_t maxRequestHeadersKb() const override { return max_request_headers_kb_; }
uint32_t maxRequestHeadersCount() const override { return max_request_headers_count_; }
absl::optional<std::chrono::milliseconds> idleTimeout() const override { return idle_timeout_; }
bool isRoutable() const override { return true; }
absl::optional<std::chrono::milliseconds> maxConnectionDuration() const override {
return max_connection_duration_;
}
Expand Down Expand Up @@ -5006,13 +5007,6 @@ TEST_F(HttpConnectionManagerImplDeathTest, InvalidConnectionManagerConfig) {
route_config_provider2_.reset();
// Only scoped route config provider valid.
EXPECT_NO_THROW(conn_manager_->onData(fake_input, false));

#if !defined(NDEBUG)
EXPECT_CALL(*scoped_route_config_provider2_, getConfig()).WillRepeatedly(Return(nullptr));
// ASSERT failure when SRDS provider returns a nullptr.
EXPECT_DEBUG_DEATH(conn_manager_->onData(fake_input, false),
"Scoped rds provider returns null for scoped routes config.");
#endif // !defined(NDEBUG)
}

} // namespace Http
Expand Down
2 changes: 2 additions & 0 deletions test/common/http/conn_manager_utility_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ class MockConnectionManagerConfig : public ConnectionManagerConfig {
public:
MockConnectionManagerConfig() {
ON_CALL(*this, generateRequestId()).WillByDefault(Return(true));
ON_CALL(*this, isRoutable()).WillByDefault(Return(true));
ON_CALL(*this, preserveExternalRequestId()).WillByDefault(Return(false));
}

Expand All @@ -59,6 +60,7 @@ class MockConnectionManagerConfig : public ConnectionManagerConfig {
MOCK_CONST_METHOD0(maxRequestHeadersKb, uint32_t());
MOCK_CONST_METHOD0(maxRequestHeadersCount, uint32_t());
MOCK_CONST_METHOD0(idleTimeout, absl::optional<std::chrono::milliseconds>());
MOCK_CONST_METHOD0(isRoutable, bool());
MOCK_CONST_METHOD0(maxConnectionDuration, absl::optional<std::chrono::milliseconds>());
MOCK_CONST_METHOD0(streamIdleTimeout, std::chrono::milliseconds());
MOCK_CONST_METHOD0(requestTimeout, std::chrono::milliseconds());
Expand Down

0 comments on commit b0a03bc

Please sign in to comment.