15
15
// specific language governing permissions and limitations
16
16
// under the License.
17
17
18
+ #include < bvar/bvar.h>
18
19
#include < cpp/s3_rate_limiter.h>
19
20
#include < gtest/gtest.h>
20
21
@@ -43,15 +44,15 @@ int main(int argc, char** argv) {
43
44
return RUN_ALL_TESTS ();
44
45
}
45
46
46
- #define S3RateLimiterTest DISABLED_S3RateLimiterTest
47
+ // #define S3RateLimiterTest DISABLED_S3RateLimiterTest
47
48
TEST (S3RateLimiterTest, normal ) {
48
49
auto rate_limiter = doris::S3RateLimiter (1 , 5 , 10 );
49
50
std::atomic_int64_t failed;
50
51
std::atomic_int64_t succ;
51
52
std::atomic_int64_t sleep_thread_num;
52
53
std::atomic_int64_t sleep ;
53
54
auto request_thread = [&]() {
54
- std::this_thread::sleep_for (std::chrono::milliseconds (500 ));
55
+ std::this_thread::sleep_for (std::chrono::milliseconds (100 ));
55
56
auto ms = rate_limiter.add (1 );
56
57
if (ms < 0 ) {
57
58
failed++;
@@ -73,7 +74,51 @@ TEST(S3RateLimiterTest, normal) {
73
74
}
74
75
}
75
76
}
76
- ASSERT_EQ (failed, 10 );
77
- ASSERT_EQ (succ, 6 );
78
- ASSERT_EQ (sleep_thread_num, 4 );
77
+ EXPECT_EQ (failed, 10 );
78
+ EXPECT_EQ (succ, 5 );
79
+ EXPECT_EQ (sleep_thread_num, 5 );
80
+ }
81
+
82
+ TEST (S3RateLimiterTest, BasicRateLimit) {
83
+ auto rate_limiter = doris::S3RateLimiter (100 , 100 , 200 );
84
+ int64_t sleep_time = rate_limiter.add (50 );
85
+ EXPECT_EQ (sleep_time, 0 );
86
+
87
+ sleep_time = rate_limiter.add (60 );
88
+ EXPECT_GT (sleep_time, 0 );
89
+ }
90
+
91
+ TEST (S3RateLimiterTest, BurstCapacity) {
92
+ auto rate_limiter = doris::S3RateLimiter (125 , 250 , 1000 );
93
+ int64_t sleep_time = rate_limiter.add (250 );
94
+ EXPECT_EQ (sleep_time, 0 );
95
+
96
+ sleep_time = rate_limiter.add (1 );
97
+ EXPECT_GT (sleep_time, 0 );
98
+ }
99
+
100
+ TEST (S3RateLimiterTest, ExceedLimit) {
101
+ auto rate_limiter = doris::S3RateLimiter (125 , 250 , 250 );
102
+ int64_t sleep_time = rate_limiter.add (250 );
103
+ EXPECT_EQ (sleep_time, 0 );
104
+
105
+ sleep_time = rate_limiter.add (1 );
106
+ EXPECT_EQ (sleep_time, -1 );
107
+ }
108
+
109
+ TEST (S3RateLimiterHolderTest, BvarMetric) {
110
+ bvar::Adder<int64_t > rate_limit_ns (" rate_limit_ns" );
111
+ bvar::Adder<int64_t > rate_limit_exceed_req_num (" rate_limit_exceed_req_num" );
112
+
113
+ auto rate_limiter_holder = doris::S3RateLimiterHolder (
114
+ 125 , 250 , 500 , doris::metric_func_factory (rate_limit_ns, rate_limit_exceed_req_num));
115
+ int64_t sleep_time = rate_limiter_holder.add (250 );
116
+ EXPECT_EQ (sleep_time, 0 );
117
+ EXPECT_EQ (rate_limit_ns.get_value (), 0 );
118
+ EXPECT_EQ (rate_limit_exceed_req_num.get_value (), 0 );
119
+
120
+ sleep_time = rate_limiter_holder.add (1 );
121
+ EXPECT_GT (rate_limit_ns.get_value (), 0 );
122
+ EXPECT_EQ (rate_limit_exceed_req_num.get_value (), 1 );
123
+ EXPECT_GT (sleep_time, 0 );
79
124
}
0 commit comments