Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,21 @@ DlbConnectionBalanceFactory::createConnectionBalancerFromProto(
#ifdef DLB_DISABLED
throw EnvoyException("X86_64 architecture is required for Dlb.");
#else
int device_id = 0;
int device_id = dlb_config.id();
Comment thread
daixiang0 marked this conversation as resolved.
Outdated
Api::OsSysCalls& os_sys_calls = Api::OsSysCallsSingleton::get();
struct stat buffer;

if (dlb_config.id()) {
device_id = dlb_config.id();
const std::string& device_name = fmt::format("/dev/dlb{}", device_id);
if (os_sys_calls.stat(device_name.c_str(), &buffer).return_value_ != 0) {
ExceptionUtil::throwEnvoyException(fmt::format("dlb hardware {} not found", device_name));
}
} else {
std::string device_name;
std::string device_name = fmt::format("/dev/dlb{}", device_id);
if (os_sys_calls.stat(device_name.c_str(), &buffer).return_value_ != 0) {
int i = 0;
// auto detect available dlb devices, now the max number of dlb device id is 63.
const int max_id = 64;
for (; i < max_id; i++) {
device_name = fmt::format("/dev/dlb{}", i);
if (os_sys_calls.stat(device_name.c_str(), &buffer).return_value_ == 0) {
device_id = i;
ENVOY_LOG(warn, "dlb device {} is not found, use dlb device {} instead", dlb_config.id(),
device_id);
break;
}
}
Expand Down Expand Up @@ -239,6 +235,8 @@ DlbConnectionBalanceFactory::~DlbConnectionBalanceFactory() {
}
}

REGISTER_FACTORY(DlbConnectionBalanceFactory, Envoy::Network::ConnectionBalanceFactory);

void DlbBalancedConnectionHandlerImpl::setDlbEvent() {
auto listener = dynamic_cast<Envoy::Server::ActiveTcpListener*>(&handler_);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,6 @@ class DlbConnectionBalanceFactory : public Envoy::Network::ConnectionBalanceFact
#endif
};

REGISTER_FACTORY(DlbConnectionBalanceFactory, Envoy::Network::ConnectionBalanceFactory);
using DlbConnectionBalanceFactorySingleton = InjectableSingleton<DlbConnectionBalanceFactory>;

/**
Expand Down
3 changes: 2 additions & 1 deletion contrib/network/connection_balance/dlb/test/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,10 @@ envoy_cc_test(
name = "config_test",
srcs = ["config_test.cc"],
deps = [
"//contrib/network/connection_balance/dlb/source:connection_balancer",
"//source/common/protobuf:utility_lib",
"//test/mocks/server:factory_context_mocks",
"//test/test_common:status_utility_lib",
"@envoy_api//contrib/envoy/extensions/network/connection_balance/dlb/v3alpha:pkg_cc_proto",
"@envoy_api//envoy/config/core/v3:pkg_cc_proto",
],
)
41 changes: 40 additions & 1 deletion contrib/network/connection_balance/dlb/test/config_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@

#include "source/common/protobuf/utility.h"

#include "test/mocks/server/factory_context.h"
#include "test/test_common/status_utility.h"

#include "contrib/envoy/extensions/network/connection_balance/dlb/v3alpha/dlb.pb.h"
#include "contrib/network/connection_balance/dlb/source/connection_balancer_impl.h"
#include "gtest/gtest.h"

namespace Envoy {
Expand Down Expand Up @@ -52,6 +53,44 @@ TEST_F(DlbConnectionBalanceFactoryTest, MakeCustomConfig) {
EXPECT_EQ(10, dlb.id());
}

TEST_F(DlbConnectionBalanceFactoryTest, EmptyProto) {
DlbConnectionBalanceFactory factory;
EXPECT_NE(nullptr,
dynamic_cast<envoy::extensions::network::connection_balance::dlb::v3alpha::Dlb*>(
factory.createEmptyConfigProto().get()));
}

#ifndef DLB_DISABLED

using testing::HasSubstr;

TEST_F(DlbConnectionBalanceFactoryTest, MakeFromDefaultProto) {
envoy::config::core::v3::TypedExtensionConfig typed_config;
DlbConnectionBalanceFactory factory;
NiceMock<Server::Configuration::MockFactoryContext> context;

envoy::extensions::network::connection_balance::dlb::v3alpha::Dlb dlb;
makeDlbConnectionBalanceConfig(typed_config, dlb);

EXPECT_THAT_THROWS_MESSAGE(factory.createConnectionBalancerFromProto(typed_config, context),
EnvoyException, HasSubstr("no available dlb hardware"));
}

TEST_F(DlbConnectionBalanceFactoryTest, TooManyThreads) {
envoy::config::core::v3::TypedExtensionConfig typed_config;
DlbConnectionBalanceFactory factory;
NiceMock<Server::Configuration::MockFactoryContext> context;
context.options_.concurrency_ = 33;

envoy::extensions::network::connection_balance::dlb::v3alpha::Dlb dlb;
makeDlbConnectionBalanceConfig(typed_config, dlb);

EXPECT_THAT_THROWS_MESSAGE(
factory.createConnectionBalancerFromProto(typed_config, context), EnvoyException,
HasSubstr("Dlb connection balanncer only supports up to 32 worker threads"));
}
#endif

} // namespace Dlb
} // namespace Extensions
} // namespace Envoy