|
|
|
@ -398,11 +398,40 @@ class GrpclbEnd2endTest : public ::testing::Test { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void WaitForAllBackends() { |
|
|
|
|
void SendRpcAndCount(int* num_total, int* num_ok, int* num_failure, |
|
|
|
|
int* num_drops) { |
|
|
|
|
const Status status = SendRpc(); |
|
|
|
|
if (status.ok()) { |
|
|
|
|
++*num_ok; |
|
|
|
|
} else { |
|
|
|
|
if (status.error_message() == "Call dropped by load balancing policy") { |
|
|
|
|
++*num_drops; |
|
|
|
|
} else { |
|
|
|
|
++*num_failure; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
++*num_total; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::tuple<int, int, int> WaitForAllBackends( |
|
|
|
|
int num_requests_multiple_of = 1) { |
|
|
|
|
int num_ok = 0; |
|
|
|
|
int num_failure = 0; |
|
|
|
|
int num_drops = 0; |
|
|
|
|
int num_total = 0; |
|
|
|
|
while (!SeenAllBackends()) { |
|
|
|
|
CheckRpcSendOk(); |
|
|
|
|
SendRpcAndCount(&num_total, &num_ok, &num_failure, &num_drops); |
|
|
|
|
} |
|
|
|
|
while (num_total % num_requests_multiple_of != 0) { |
|
|
|
|
SendRpcAndCount(&num_total, &num_ok, &num_failure, &num_drops); |
|
|
|
|
} |
|
|
|
|
ResetBackendCounters(); |
|
|
|
|
gpr_log(GPR_INFO, |
|
|
|
|
"Performed %d warm up requests (a multiple of %d) against the " |
|
|
|
|
"backends. %d succeeded, %d failed, %d dropped.", |
|
|
|
|
num_total, num_requests_multiple_of, num_ok, num_failure, |
|
|
|
|
num_drops); |
|
|
|
|
return std::make_tuple(num_ok, num_failure, num_drops); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void WaitForBackend(size_t backend_idx) { |
|
|
|
@ -556,10 +585,8 @@ TEST_F(SingleBalancerTest, Vanilla) { |
|
|
|
|
0); |
|
|
|
|
// Make sure that trying to connect works without a call.
|
|
|
|
|
channel_->GetState(true /* try_to_connect */); |
|
|
|
|
|
|
|
|
|
// We need to wait for all backends to come online.
|
|
|
|
|
WaitForAllBackends(); |
|
|
|
|
|
|
|
|
|
// Send kNumRpcsPerAddress RPCs per server.
|
|
|
|
|
CheckRpcSendOk(kNumRpcsPerAddress * num_backends_); |
|
|
|
|
|
|
|
|
@ -863,13 +890,22 @@ TEST_F(UpdatesTest, UpdateBalancersDeadUpdate) { |
|
|
|
|
|
|
|
|
|
TEST_F(SingleBalancerTest, Drop) { |
|
|
|
|
const size_t kNumRpcsPerAddress = 100; |
|
|
|
|
const int num_of_drop_by_rate_limiting_addresses = 1; |
|
|
|
|
const int num_of_drop_by_load_balancing_addresses = 2; |
|
|
|
|
const int num_of_drop_addresses = num_of_drop_by_rate_limiting_addresses + |
|
|
|
|
num_of_drop_by_load_balancing_addresses; |
|
|
|
|
const int num_total_addresses = num_backends_ + num_of_drop_addresses; |
|
|
|
|
ScheduleResponseForBalancer( |
|
|
|
|
0, BalancerServiceImpl::BuildResponseForBackends( |
|
|
|
|
GetBackendPorts(), {{"rate_limiting", 1}, {"load_balancing", 2}}), |
|
|
|
|
GetBackendPorts(), |
|
|
|
|
{{"rate_limiting", num_of_drop_by_rate_limiting_addresses}, |
|
|
|
|
{"load_balancing", num_of_drop_by_load_balancing_addresses}}), |
|
|
|
|
0); |
|
|
|
|
// Wait until all backends are ready.
|
|
|
|
|
WaitForAllBackends(); |
|
|
|
|
// Send kNumRpcsPerAddress RPCs for each server and drop address.
|
|
|
|
|
size_t num_drops = 0; |
|
|
|
|
for (size_t i = 0; i < kNumRpcsPerAddress * (num_backends_ + 3); ++i) { |
|
|
|
|
for (size_t i = 0; i < kNumRpcsPerAddress * num_total_addresses; ++i) { |
|
|
|
|
EchoResponse response; |
|
|
|
|
const Status status = SendRpc(&response); |
|
|
|
|
if (!status.ok() && |
|
|
|
@ -881,7 +917,7 @@ TEST_F(SingleBalancerTest, Drop) { |
|
|
|
|
EXPECT_EQ(response.message(), kMessage_); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * 3, num_drops); |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * num_of_drop_addresses, num_drops); |
|
|
|
|
|
|
|
|
|
// Each backend should have gotten 100 requests.
|
|
|
|
|
for (size_t i = 0; i < backends_.size(); ++i) { |
|
|
|
@ -896,9 +932,12 @@ TEST_F(SingleBalancerTest, Drop) { |
|
|
|
|
|
|
|
|
|
TEST_F(SingleBalancerTest, DropAllFirst) { |
|
|
|
|
// All registered addresses are marked as "drop".
|
|
|
|
|
const int num_of_drop_by_rate_limiting_addresses = 1; |
|
|
|
|
const int num_of_drop_by_load_balancing_addresses = 1; |
|
|
|
|
ScheduleResponseForBalancer( |
|
|
|
|
0, BalancerServiceImpl::BuildResponseForBackends( |
|
|
|
|
{}, {{"rate_limiting", 1}, {"load_balancing", 1}}), |
|
|
|
|
{}, {{"rate_limiting", num_of_drop_by_rate_limiting_addresses}, |
|
|
|
|
{"load_balancing", num_of_drop_by_load_balancing_addresses}}), |
|
|
|
|
0); |
|
|
|
|
const Status status = SendRpc(); |
|
|
|
|
EXPECT_FALSE(status.ok()); |
|
|
|
@ -909,9 +948,12 @@ TEST_F(SingleBalancerTest, DropAll) { |
|
|
|
|
ScheduleResponseForBalancer( |
|
|
|
|
0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}), |
|
|
|
|
0); |
|
|
|
|
const int num_of_drop_by_rate_limiting_addresses = 1; |
|
|
|
|
const int num_of_drop_by_load_balancing_addresses = 1; |
|
|
|
|
ScheduleResponseForBalancer( |
|
|
|
|
0, BalancerServiceImpl::BuildResponseForBackends( |
|
|
|
|
{}, {{"rate_limiting", 1}, {"load_balancing", 1}}), |
|
|
|
|
{}, {{"rate_limiting", num_of_drop_by_rate_limiting_addresses}, |
|
|
|
|
{"load_balancing", num_of_drop_by_load_balancing_addresses}}), |
|
|
|
|
1000); |
|
|
|
|
|
|
|
|
|
// First call succeeds.
|
|
|
|
@ -936,6 +978,11 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, Vanilla) { |
|
|
|
|
ScheduleResponseForBalancer( |
|
|
|
|
0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}), |
|
|
|
|
0); |
|
|
|
|
// Wait until all backends are ready.
|
|
|
|
|
int num_ok = 0; |
|
|
|
|
int num_failure = 0; |
|
|
|
|
int num_drops = 0; |
|
|
|
|
std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends(); |
|
|
|
|
// Send kNumRpcsPerAddress RPCs per server.
|
|
|
|
|
CheckRpcSendOk(kNumRpcsPerAddress * num_backends_); |
|
|
|
|
// Each backend should have gotten 100 requests.
|
|
|
|
@ -950,24 +997,39 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, Vanilla) { |
|
|
|
|
EXPECT_EQ(1U, balancer_servers_[0].service_->response_count()); |
|
|
|
|
|
|
|
|
|
const ClientStats client_stats = WaitForLoadReports(); |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * num_backends_, client_stats.num_calls_started); |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * num_backends_, |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_ok, |
|
|
|
|
client_stats.num_calls_started); |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_ok, |
|
|
|
|
client_stats.num_calls_finished); |
|
|
|
|
EXPECT_EQ(0U, client_stats.num_calls_finished_with_client_failed_to_send); |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * num_backends_, |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + (num_ok + num_drops), |
|
|
|
|
client_stats.num_calls_finished_known_received); |
|
|
|
|
EXPECT_THAT(client_stats.drop_token_counts, ::testing::ElementsAre()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(SingleBalancerWithClientLoadReportingTest, Drop) { |
|
|
|
|
const size_t kNumRpcsPerAddress = 3; |
|
|
|
|
const int num_of_drop_by_rate_limiting_addresses = 2; |
|
|
|
|
const int num_of_drop_by_load_balancing_addresses = 1; |
|
|
|
|
const int num_of_drop_addresses = num_of_drop_by_rate_limiting_addresses + |
|
|
|
|
num_of_drop_by_load_balancing_addresses; |
|
|
|
|
const int num_total_addresses = num_backends_ + num_of_drop_addresses; |
|
|
|
|
ScheduleResponseForBalancer( |
|
|
|
|
0, BalancerServiceImpl::BuildResponseForBackends( |
|
|
|
|
GetBackendPorts(), {{"rate_limiting", 2}, {"load_balancing", 1}}), |
|
|
|
|
GetBackendPorts(), |
|
|
|
|
{{"rate_limiting", num_of_drop_by_rate_limiting_addresses}, |
|
|
|
|
{"load_balancing", num_of_drop_by_load_balancing_addresses}}), |
|
|
|
|
0); |
|
|
|
|
|
|
|
|
|
// Wait until all backends are ready.
|
|
|
|
|
int num_warmup_ok = 0; |
|
|
|
|
int num_warmup_failure = 0; |
|
|
|
|
int num_warmup_drops = 0; |
|
|
|
|
std::tie(num_warmup_ok, num_warmup_failure, num_warmup_drops) = |
|
|
|
|
WaitForAllBackends(num_total_addresses /* num_requests_multiple_of */); |
|
|
|
|
const int num_total_warmup_requests = |
|
|
|
|
num_warmup_ok + num_warmup_failure + num_warmup_drops; |
|
|
|
|
size_t num_drops = 0; |
|
|
|
|
for (size_t i = 0; i < kNumRpcsPerAddress * (num_backends_ + 3); ++i) { |
|
|
|
|
for (size_t i = 0; i < kNumRpcsPerAddress * num_total_addresses; ++i) { |
|
|
|
|
EchoResponse response; |
|
|
|
|
const Status status = SendRpc(&response); |
|
|
|
|
if (!status.ok() && |
|
|
|
@ -979,8 +1041,7 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, Drop) { |
|
|
|
|
EXPECT_EQ(response.message(), kMessage_); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * 3, num_drops); |
|
|
|
|
|
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * num_of_drop_addresses, num_drops); |
|
|
|
|
// Each backend should have gotten 100 requests.
|
|
|
|
|
for (size_t i = 0; i < backends_.size(); ++i) { |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress, |
|
|
|
@ -993,17 +1054,28 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, Drop) { |
|
|
|
|
EXPECT_EQ(1U, balancer_servers_[0].service_->response_count()); |
|
|
|
|
|
|
|
|
|
const ClientStats client_stats = WaitForLoadReports(); |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * (num_backends_ + 3), |
|
|
|
|
EXPECT_EQ( |
|
|
|
|
kNumRpcsPerAddress * num_total_addresses + num_total_warmup_requests, |
|
|
|
|
client_stats.num_calls_started); |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * (num_backends_ + 3), |
|
|
|
|
EXPECT_EQ( |
|
|
|
|
kNumRpcsPerAddress * num_total_addresses + num_total_warmup_requests, |
|
|
|
|
client_stats.num_calls_finished); |
|
|
|
|
EXPECT_EQ(0U, client_stats.num_calls_finished_with_client_failed_to_send); |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * num_backends_, |
|
|
|
|
EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_warmup_ok, |
|
|
|
|
client_stats.num_calls_finished_known_received); |
|
|
|
|
EXPECT_THAT(client_stats.drop_token_counts, |
|
|
|
|
// The number of warmup request is a multiple of the number of addresses.
|
|
|
|
|
// Therefore, all addresses in the scheduled balancer response are hit the
|
|
|
|
|
// same number of times.
|
|
|
|
|
const int num_times_drop_addresses_hit = |
|
|
|
|
num_warmup_drops / num_of_drop_addresses; |
|
|
|
|
EXPECT_THAT( |
|
|
|
|
client_stats.drop_token_counts, |
|
|
|
|
::testing::ElementsAre( |
|
|
|
|
::testing::Pair("load_balancing", kNumRpcsPerAddress), |
|
|
|
|
::testing::Pair("rate_limiting", kNumRpcsPerAddress * 2))); |
|
|
|
|
::testing::Pair("load_balancing", |
|
|
|
|
(kNumRpcsPerAddress + num_times_drop_addresses_hit)), |
|
|
|
|
::testing::Pair( |
|
|
|
|
"rate_limiting", |
|
|
|
|
(kNumRpcsPerAddress + num_times_drop_addresses_hit) * 2))); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|