chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
// Licensed to the Apache Software Foundation (ASF) under one
|
||||
// or more contributor license agreements. See the NOTICE file
|
||||
// distributed with this work for additional information
|
||||
// regarding copyright ownership. The ASF licenses this file
|
||||
// to you 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 "brpc/policy/timeout_concurrency_limiter.h"
|
||||
#include "butil/time.h"
|
||||
#include "bthread/bthread.h"
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
namespace brpc {
|
||||
namespace policy {
|
||||
DECLARE_int32(timeout_cl_sample_window_size_ms);
|
||||
DECLARE_int32(timeout_cl_min_sample_count);
|
||||
DECLARE_int32(timeout_cl_max_sample_count);
|
||||
} // namespace policy
|
||||
} // namespace brpc
|
||||
|
||||
TEST(TimeoutConcurrencyLimiterTest, AddSample) {
|
||||
{
|
||||
brpc::policy::FLAGS_timeout_cl_sample_window_size_ms = 10;
|
||||
brpc::policy::FLAGS_timeout_cl_min_sample_count = 5;
|
||||
brpc::policy::FLAGS_timeout_cl_max_sample_count = 10;
|
||||
|
||||
brpc::policy::TimeoutConcurrencyLimiter limiter;
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
bthread_usleep(10 * 1000);
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
ASSERT_EQ(limiter._sw.succ_count, 0);
|
||||
ASSERT_EQ(limiter._sw.failed_count, 0);
|
||||
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
bthread_usleep(10 * 1000);
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
ASSERT_EQ(limiter._sw.succ_count, 0);
|
||||
ASSERT_EQ(limiter._sw.failed_count, 0);
|
||||
ASSERT_EQ(limiter._avg_latency_us, 50);
|
||||
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
ASSERT_EQ(limiter._sw.succ_count, 0);
|
||||
ASSERT_EQ(limiter._sw.failed_count, 0);
|
||||
ASSERT_EQ(limiter._avg_latency_us, 50);
|
||||
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
ASSERT_EQ(limiter._sw.succ_count, 6);
|
||||
ASSERT_EQ(limiter._sw.failed_count, 0);
|
||||
|
||||
limiter.ResetSampleWindow(butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(0, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(1, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(1, 50, butil::cpuwide_time_us());
|
||||
limiter.AddSample(1, 50, butil::cpuwide_time_us());
|
||||
ASSERT_EQ(limiter._sw.succ_count, 3);
|
||||
ASSERT_EQ(limiter._sw.failed_count, 3);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(TimeoutConcurrencyLimiterTest, OnResponded) {
|
||||
brpc::policy::FLAGS_timeout_cl_sample_window_size_ms = 10;
|
||||
brpc::policy::FLAGS_timeout_cl_min_sample_count = 5;
|
||||
brpc::policy::FLAGS_timeout_cl_max_sample_count = 10;
|
||||
brpc::policy::TimeoutConcurrencyLimiter limiter;
|
||||
limiter.OnResponded(0, 50);
|
||||
limiter.OnResponded(0, 50);
|
||||
bthread_usleep(100);
|
||||
limiter.OnResponded(0, 50);
|
||||
limiter.OnResponded(1, 50);
|
||||
ASSERT_EQ(limiter._sw.succ_count, 2);
|
||||
ASSERT_EQ(limiter._sw.failed_count, 0);
|
||||
}
|
||||
|
||||
TEST(TimeoutConcurrencyLimiterTest, AdaptiveMaxConcurrencyTest) {
|
||||
{
|
||||
brpc::AdaptiveMaxConcurrency concurrency(
|
||||
brpc::TimeoutConcurrencyConf{100, 100});
|
||||
ASSERT_EQ(concurrency.type(), "timeout");
|
||||
ASSERT_EQ(concurrency.value(), "timeout");
|
||||
}
|
||||
{
|
||||
brpc::AdaptiveMaxConcurrency concurrency;
|
||||
concurrency = "timeout";
|
||||
ASSERT_EQ(concurrency.type(), "timeout");
|
||||
ASSERT_EQ(concurrency.value(), "timeout");
|
||||
}
|
||||
{
|
||||
brpc::AdaptiveMaxConcurrency concurrency;
|
||||
concurrency = brpc::TimeoutConcurrencyConf{50, 100};
|
||||
ASSERT_EQ(concurrency.type(), "timeout");
|
||||
ASSERT_EQ(concurrency.value(), "timeout");
|
||||
auto time_conf = static_cast<brpc::TimeoutConcurrencyConf>(concurrency);
|
||||
ASSERT_EQ(time_conf.timeout_ms, 50);
|
||||
ASSERT_EQ(time_conf.max_concurrency, 100);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user