Skip to content

Commit 49b8766

Browse files
committed
[config] fix flaky test in leader_elector_test
1 parent ba353be commit 49b8766

File tree

1 file changed

+35
-15
lines changed

1 file changed

+35
-15
lines changed

kv_cache_manager/config/test/leader_elector_test.cc

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class LeaderElectorTest : public TESTBASE {
3232
// 准备选举器参数
3333
lock_key_ = "test_lock_key";
3434
lock_value_ = "127.0.0.1-" + std::to_string(getpid());
35-
lease_ms_ = 100; // 较短的租约时间以便测试
35+
lease_ms_ = 1000; // 较短的租约时间以便测试
3636
loop_interval_ms_ = 10;
3737
}
3838

@@ -118,8 +118,13 @@ TEST_F(LeaderElectorTest, SingleElectorBecomesLeader) {
118118

119119
EXPECT_TRUE(elector->Start());
120120

121-
// 等待足够时间让选举器有机会成为领导者
122-
std::this_thread::sleep_for(std::chrono::milliseconds(200));
121+
for (int i = 0; i < 100; i++) {
122+
// 等待足够时间让选举发生
123+
if (become_leader_called) {
124+
break;
125+
}
126+
std::this_thread::sleep_for(std::chrono::milliseconds(100));
127+
}
123128

124129
// 应该成为领导者
125130
EXPECT_TRUE(become_leader_called);
@@ -145,8 +150,13 @@ TEST_F(LeaderElectorTest, ManualDemote) {
145150

146151
EXPECT_TRUE(elector->Start());
147152

148-
// 等待成为领导者
149-
std::this_thread::sleep_for(std::chrono::milliseconds(200));
153+
for (int i = 0; i < 100; i++) {
154+
// 等待足够时间让选举发生
155+
if (elector->IsLeader()) {
156+
break;
157+
}
158+
std::this_thread::sleep_for(std::chrono::milliseconds(100));
159+
}
150160

151161
ASSERT_TRUE(elector->IsLeader());
152162
ASSERT_TRUE(become_leader_called);
@@ -188,17 +198,22 @@ TEST_F(LeaderElectorTest, TwoElectorsCompetition) {
188198
EXPECT_TRUE(elector1->Start());
189199
EXPECT_TRUE(elector2->Start());
190200

191-
// 等待足够时间让选举发生
192-
std::this_thread::sleep_for(std::chrono::milliseconds(300));
201+
for (int i = 0; i < 100; i++) {
202+
// 等待足够时间让选举发生
203+
if ((elector1->IsLeader() || elector2->IsLeader()) && (elector1_leader || elector2_leader)) {
204+
break;
205+
}
206+
std::this_thread::sleep_for(std::chrono::milliseconds(100));
207+
}
193208

194209
// 检查只有一个选举器成为领导者
195-
const bool is_elector1_first_leader = elector1->IsLeader();
210+
const bool is_elector1_leader = elector1->IsLeader();
196211
const bool is_elector2_leader = elector2->IsLeader();
197212

198-
EXPECT_NE(is_elector1_first_leader, is_elector2_leader) << "只有一个选举器应该成为领导者";
213+
EXPECT_NE(is_elector1_leader, is_elector2_leader) << "只有一个选举器应该成为领导者";
199214

200215
// 验证相应的回调被调用
201-
if (is_elector1_first_leader) {
216+
if (is_elector1_leader) {
202217
EXPECT_TRUE(elector1_leader);
203218
EXPECT_FALSE(elector2_leader);
204219
elector1_leader = false;
@@ -215,7 +230,7 @@ TEST_F(LeaderElectorTest, TwoElectorsCompetition) {
215230
std::this_thread::sleep_for(std::chrono::milliseconds(300));
216231

217232
// 另外一个elector应该能够成为领导者
218-
if (is_elector1_first_leader) {
233+
if (is_elector1_leader) {
219234
EXPECT_TRUE(elector2->IsLeader());
220235
EXPECT_TRUE(elector2_leader);
221236
elector2->Stop();
@@ -413,8 +428,13 @@ TEST_F(LeaderElectorTest, MultipleElectorsDifferentKeys) {
413428
EXPECT_TRUE(elector1->Start());
414429
EXPECT_TRUE(elector2->Start());
415430

416-
// 等待足够时间
417-
std::this_thread::sleep_for(std::chrono::milliseconds(300));
431+
for (int i = 0; i < 100; i++) {
432+
// 等待足够时间让选举发生
433+
if (elector1_leader && elector2_leader) {
434+
break;
435+
}
436+
std::this_thread::sleep_for(std::chrono::milliseconds(100));
437+
}
418438

419439
// 两个选举器都应该成为领导者,因为它们使用不同的锁键
420440
EXPECT_TRUE(elector1_leader);
@@ -567,8 +587,8 @@ TEST_F(LeaderElectorTest, LeaseExpirationWithCompetition) {
567587
EXPECT_FALSE(elector2_leader_called) << "elector2's become leader callback should not be called yet";
568588

569589
// 模拟 elector1 长时间未续约,导致租约过期
570-
// 等待足够时间让租约过期(租约时间是100ms,我们等待150ms)
571-
std::this_thread::sleep_for(std::chrono::milliseconds(150));
590+
// 等待足够时间让租约过期
591+
std::this_thread::sleep_for(std::chrono::milliseconds(lease_ms_ * 2));
572592

573593
// 现在 elector2 应该能够获得领导者身份
574594
elector2->WorkLoop();

0 commit comments

Comments
 (0)