mirror of https://github.com/grpc/grpc.git
parent
31bdbbeacf
commit
9db86fcc63
11 changed files with 465 additions and 170 deletions
@ -0,0 +1,142 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2018 gRPC authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "src/core/ext/filters/client_channel/retry_throttle.h" |
||||||
|
|
||||||
|
#include <gtest/gtest.h> |
||||||
|
|
||||||
|
#include "test/core/util/test_config.h" |
||||||
|
|
||||||
|
namespace grpc_core { |
||||||
|
namespace internal { |
||||||
|
namespace { |
||||||
|
|
||||||
|
TEST(ServerRetryThrottleData, Basic) { |
||||||
|
// Max token count is 4, so threshold for retrying is 2.
|
||||||
|
// Token count starts at 4.
|
||||||
|
// Each failure decrements by 1. Each success increments by 1.6.
|
||||||
|
auto throttle_data = |
||||||
|
MakeRefCounted<ServerRetryThrottleData>(4000, 1600, nullptr); |
||||||
|
// Failure: token_count=3. Above threshold.
|
||||||
|
EXPECT_TRUE(throttle_data->RecordFailure()); |
||||||
|
// Success: token_count=4. Not incremented beyond max.
|
||||||
|
throttle_data->RecordSuccess(); |
||||||
|
// Failure: token_count=3. Above threshold.
|
||||||
|
EXPECT_TRUE(throttle_data->RecordFailure()); |
||||||
|
// Failure: token_count=2. At threshold, so no retries.
|
||||||
|
EXPECT_FALSE(throttle_data->RecordFailure()); |
||||||
|
// Failure: token_count=1. Below threshold, so no retries.
|
||||||
|
EXPECT_FALSE(throttle_data->RecordFailure()); |
||||||
|
// Failure: token_count=0. Below threshold, so no retries.
|
||||||
|
EXPECT_FALSE(throttle_data->RecordFailure()); |
||||||
|
// Failure: token_count=0. Below threshold, so no retries. Not
|
||||||
|
// decremented below min.
|
||||||
|
EXPECT_FALSE(throttle_data->RecordFailure()); |
||||||
|
// Success: token_count=1.6.
|
||||||
|
throttle_data->RecordSuccess(); |
||||||
|
// Success: token_count=3.2.
|
||||||
|
throttle_data->RecordSuccess(); |
||||||
|
// Failure: token_count=2.2. Above threshold.
|
||||||
|
EXPECT_TRUE(throttle_data->RecordFailure()); |
||||||
|
// Failure: token_count=1.2. Below threshold, so no retries.
|
||||||
|
EXPECT_FALSE(throttle_data->RecordFailure()); |
||||||
|
// Success: token_count=2.8.
|
||||||
|
throttle_data->RecordSuccess(); |
||||||
|
// Failure: token_count=1.8. Below threshold, so no retries.
|
||||||
|
EXPECT_FALSE(throttle_data->RecordFailure()); |
||||||
|
// Success: token_count=3.4.
|
||||||
|
throttle_data->RecordSuccess(); |
||||||
|
// Failure: token_count=2.4. Above threshold.
|
||||||
|
EXPECT_TRUE(throttle_data->RecordFailure()); |
||||||
|
} |
||||||
|
|
||||||
|
TEST(ServerRetryThrottleData, Replacement) { |
||||||
|
// Create old throttle data.
|
||||||
|
// Max token count is 4, so threshold for retrying is 2.
|
||||||
|
// Token count starts at 4.
|
||||||
|
// Each failure decrements by 1. Each success increments by 1.
|
||||||
|
auto old_throttle_data = |
||||||
|
MakeRefCounted<ServerRetryThrottleData>(4000, 1000, nullptr); |
||||||
|
// Failure: token_count=3. Above threshold.
|
||||||
|
EXPECT_TRUE(old_throttle_data->RecordFailure()); |
||||||
|
// Create new throttle data.
|
||||||
|
// Max token count is 10, so threshold for retrying is 5.
|
||||||
|
// Token count starts at 7.5 (ratio inherited from old_throttle_data).
|
||||||
|
// Each failure decrements by 1. Each success increments by 3.
|
||||||
|
auto throttle_data = MakeRefCounted<ServerRetryThrottleData>( |
||||||
|
10000, 3000, old_throttle_data.get()); |
||||||
|
// Failure via old_throttle_data: token_count=6.5.
|
||||||
|
EXPECT_TRUE(old_throttle_data->RecordFailure()); |
||||||
|
// Failure: token_count=5.5.
|
||||||
|
EXPECT_TRUE(old_throttle_data->RecordFailure()); |
||||||
|
// Failure via old_throttle_data: token_count=4.5. Below threshold.
|
||||||
|
EXPECT_FALSE(old_throttle_data->RecordFailure()); |
||||||
|
// Failure: token_count=3.5. Below threshold.
|
||||||
|
EXPECT_FALSE(throttle_data->RecordFailure()); |
||||||
|
// Success: token_count=6.5.
|
||||||
|
throttle_data->RecordSuccess(); |
||||||
|
// Failure via old_throttle_data: token_count=5.5. Above threshold.
|
||||||
|
EXPECT_TRUE(old_throttle_data->RecordFailure()); |
||||||
|
// Failure: token_count=4.5. Below threshold.
|
||||||
|
EXPECT_FALSE(throttle_data->RecordFailure()); |
||||||
|
} |
||||||
|
|
||||||
|
TEST(ServerRetryThrottleMap, Replacement) { |
||||||
|
ServerRetryThrottleMap::Init(); |
||||||
|
const char kServerName[] = "server_name"; |
||||||
|
// Create old throttle data.
|
||||||
|
// Max token count is 4, so threshold for retrying is 2.
|
||||||
|
// Token count starts at 4.
|
||||||
|
// Each failure decrements by 1. Each success increments by 1.
|
||||||
|
auto old_throttle_data = |
||||||
|
ServerRetryThrottleMap::GetDataForServer(kServerName, 4000, 1000); |
||||||
|
// Failure: token_count=3. Above threshold.
|
||||||
|
EXPECT_TRUE(old_throttle_data->RecordFailure()); |
||||||
|
// Create new throttle data.
|
||||||
|
// Max token count is 10, so threshold for retrying is 5.
|
||||||
|
// Token count starts at 7.5 (ratio inherited from old_throttle_data).
|
||||||
|
// Each failure decrements by 1. Each success increments by 3.
|
||||||
|
auto throttle_data = |
||||||
|
ServerRetryThrottleMap::GetDataForServer(kServerName, 10000, 3000); |
||||||
|
// Failure via old_throttle_data: token_count=6.5.
|
||||||
|
EXPECT_TRUE(old_throttle_data->RecordFailure()); |
||||||
|
// Failure: token_count=5.5.
|
||||||
|
EXPECT_TRUE(old_throttle_data->RecordFailure()); |
||||||
|
// Failure via old_throttle_data: token_count=4.5. Below threshold.
|
||||||
|
EXPECT_FALSE(old_throttle_data->RecordFailure()); |
||||||
|
// Failure: token_count=3.5. Below threshold.
|
||||||
|
EXPECT_FALSE(throttle_data->RecordFailure()); |
||||||
|
// Success: token_count=6.5.
|
||||||
|
throttle_data->RecordSuccess(); |
||||||
|
// Failure via old_throttle_data: token_count=5.5. Above threshold.
|
||||||
|
EXPECT_TRUE(old_throttle_data->RecordFailure()); |
||||||
|
// Failure: token_count=4.5. Below threshold.
|
||||||
|
EXPECT_FALSE(throttle_data->RecordFailure()); |
||||||
|
// Clean up.
|
||||||
|
ServerRetryThrottleMap::Shutdown(); |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace
|
||||||
|
} // namespace internal
|
||||||
|
} // namespace grpc_core
|
||||||
|
|
||||||
|
int main(int argc, char** argv) { |
||||||
|
grpc_test_init(argc, argv); |
||||||
|
::testing::InitGoogleTest(&argc, argv); |
||||||
|
return RUN_ALL_TESTS(); |
||||||
|
} |
Loading…
Reference in new issue