Skip to content

Commit 29e4c85

Browse files
committed
[#3276] Fix synchronization in passive-backup
1 parent b0429d0 commit 29e4c85

File tree

3 files changed

+156
-27
lines changed

3 files changed

+156
-27
lines changed

src/hooks/dhcp/high_availability/ha_service.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2135,7 +2135,7 @@ HAService::asyncSyncLeasesInternal(http::HttpClient& http_client,
21352135
PostSyncCallback post_sync_action,
21362136
const bool dhcp_disabled) {
21372137

2138-
HAConfig::PeerConfigPtr partner_config = config_->getFailoverPeerConfig();
2138+
HAConfig::PeerConfigPtr partner_config = config_->getPeerConfig(server_name);
21392139

21402140
// Create HTTP/1.1 request including our command.
21412141
PostHttpRequestJsonPtr request = boost::make_shared<PostHttpRequestJson>

src/hooks/dhcp/high_availability/tests/ha_service_unittest.cc

Lines changed: 154 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2056,19 +2056,15 @@ class HAServiceTest : public HATest {
20562056
/// up the status codes to be returned by the servers, verifying a response and
20572057
/// leases in the lease database.
20582058
///
2059+
/// @param config_storage test HA configuration.
20592060
/// @param [out] rsp pointer to the object where response will be stored.
2060-
void runProcessSynchronize4(ConstElementPtr& rsp) {
2061+
void runProcessSynchronize4(HAConfigPtr config_storage, ConstElementPtr& rsp) {
20612062
// Create lease manager.
20622063
ASSERT_NO_THROW(LeaseMgrFactory::create("universe=4 type=memfile persist=false"));
20632064

20642065
// Create IPv4 leases which will be fetched from the other server.
20652066
ASSERT_NO_THROW(generateTestLeases4());
20662067

2067-
// Create HA configuration for 3 servers. This server is
2068-
// server 1.
2069-
HAConfigPtr config_storage = createValidConfiguration();
2070-
setBasicAuth(config_storage);
2071-
20722068
// Leases are fetched in pages, so the lease4-get-page should be
20732069
// sent multiple times. The server is configured to return leases
20742070
// in 3-element chunks.
@@ -2108,19 +2104,15 @@ class HAServiceTest : public HATest {
21082104
/// up the status codes to be returned by the servers, verifying a response and
21092105
/// leases in the lease database.
21102106
///
2107+
/// @param config_storage test HA configuration.
21112108
/// @param [out] rsp pointer to the object where response will be stored.
2112-
void runProcessSynchronize6(ConstElementPtr& rsp) {
2109+
void runProcessSynchronize6(HAConfigPtr config_storage, ConstElementPtr& rsp) {
21132110
// Create lease manager.
21142111
ASSERT_NO_THROW(LeaseMgrFactory::create("universe=6 type=memfile persist=false"));
21152112

21162113
// Create IPv4 leases which will be fetched from the other server.
21172114
ASSERT_NO_THROW(generateTestLeases6());
21182115

2119-
// Create HA configuration for 3 servers. This server is
2120-
// server 1.
2121-
HAConfigPtr config_storage = createValidConfiguration();
2122-
setBasicAuth(config_storage);
2123-
21242116
// Leases are fetched in pages, so the lease6-get-page should be
21252117
// sent multiple times. The server is configured to return leases
21262118
// in 3-element chunks.
@@ -3962,9 +3954,47 @@ TEST_F(HAServiceTest, asyncSyncLeases6Hub) {
39623954
// DHCPv4 server.
39633955
TEST_F(HAServiceTest, processSynchronize4) {
39643956

3957+
// Create HA configuration for 3 servers. This server is
3958+
// server 1.
3959+
HAConfigPtr config_storage = createValidConfiguration();
3960+
setBasicAuth(config_storage);
3961+
39653962
// Run HAService::processSynchronize and gather a response.
39663963
ConstElementPtr rsp;
3967-
runProcessSynchronize4(rsp);
3964+
runProcessSynchronize4(config_storage, rsp);
3965+
3966+
// The response should indicate success.
3967+
ASSERT_TRUE(rsp);
3968+
checkAnswer(rsp, CONTROL_RESULT_SUCCESS, "Lease database synchronization"
3969+
" complete.");
3970+
3971+
// All leases should have been inserted into the database.
3972+
for (size_t i = 0; i < leases4_.size(); ++i) {
3973+
Lease4Ptr existing_lease = LeaseMgrFactory::instance().getLease4(leases4_[i]->addr_);
3974+
ASSERT_TRUE(existing_lease) << "lease " << leases4_[i]->addr_.toText()
3975+
<< " not in the lease database";
3976+
}
3977+
3978+
// The following commands should have been sent to the server2: dhcp-disable,
3979+
// lease4-get-page and ha-sync-complete-notify.
3980+
EXPECT_TRUE(factory2_->getResponseCreator()->findRequest("dhcp-disable","20"));
3981+
EXPECT_TRUE(factory2_->getResponseCreator()->findRequest("lease4-get-page",""));
3982+
EXPECT_TRUE(factory2_->getResponseCreator()->findRequest("ha-sync-complete-notify", ""));
3983+
EXPECT_FALSE(factory2_->getResponseCreator()->findRequest("dhcp-enable", ""));
3984+
}
3985+
3986+
// This test verifies that the ha-sync command is processed successfully for the
3987+
// DHCPv4 server in the passive-backup configuration.
3988+
TEST_F(HAServiceTest, processSynchronize4PassiveBackup) {
3989+
3990+
// Create passive-backup configuration for 3 servers.
3991+
// This server is server 1.
3992+
HAConfigPtr config_storage = createValidPassiveBackupConfiguration();
3993+
setBasicAuth(config_storage);
3994+
3995+
// Run HAService::processSynchronize and gather a response.
3996+
ConstElementPtr rsp;
3997+
runProcessSynchronize4(config_storage, rsp);
39683998

39693999
// The response should indicate success.
39704000
ASSERT_TRUE(rsp);
@@ -3999,9 +4029,14 @@ TEST_F(HAServiceTest, processSynchronize4Authorized) {
39994029
factory2_->getResponseCreator()->addBasicAuth("foo", "bar");
40004030
factory3_->getResponseCreator()->addBasicAuth("test", "1234");
40014031

4032+
// Create HA configuration for 3 servers. This server is
4033+
// server 1.
4034+
HAConfigPtr config_storage = createValidConfiguration();
4035+
setBasicAuth(config_storage);
4036+
40024037
// Run HAService::processSynchronize and gather a response.
40034038
ConstElementPtr rsp;
4004-
runProcessSynchronize4(rsp);
4039+
runProcessSynchronize4(config_storage, rsp);
40054040

40064041
// The response should indicate success.
40074042
ASSERT_TRUE(rsp);
@@ -4030,9 +4065,14 @@ TEST_F(HAServiceTest, processSynchronizeDisableError) {
40304065
factory2_->getResponseCreator()->setControlResult("dhcp-disable",
40314066
CONTROL_RESULT_ERROR);
40324067

4068+
// Create HA configuration for 3 servers. This server is
4069+
// server 1.
4070+
HAConfigPtr config_storage = createValidConfiguration();
4071+
setBasicAuth(config_storage);
4072+
40334073
// Run HAService::processSynchronize and gather a response.
40344074
ConstElementPtr rsp;
4035-
runProcessSynchronize4(rsp);
4075+
runProcessSynchronize4(config_storage, rsp);
40364076

40374077
// The response should indicate an error
40384078
ASSERT_TRUE(rsp);
@@ -4052,9 +4092,14 @@ TEST_F(HAServiceTest, processSynchronizeUnauthorized) {
40524092
// Instruct server2 to require authentication.
40534093
factory2_->getResponseCreator()->addBasicAuth("foo", "bar");
40544094

4095+
// Create HA configuration for 3 servers. This server is
4096+
// server 1.
4097+
HAConfigPtr config_storage = createValidConfiguration();
4098+
setBasicAuth(config_storage);
4099+
40554100
// Run HAService::processSynchronize and gather a response.
40564101
ConstElementPtr rsp;
4057-
runProcessSynchronize4(rsp);
4102+
runProcessSynchronize4(config_storage, rsp);
40584103

40594104
// The response should indicate an error
40604105
ASSERT_TRUE(rsp);
@@ -4071,9 +4116,14 @@ TEST_F(HAServiceTest, processSynchronizeLease4GetPageError) {
40714116
factory2_->getResponseCreator()->setControlResult("lease4-get-page",
40724117
CONTROL_RESULT_ERROR);
40734118

4119+
// Create HA configuration for 3 servers. This server is
4120+
// server 1.
4121+
HAConfigPtr config_storage = createValidConfiguration();
4122+
setBasicAuth(config_storage);
4123+
40744124
// Run HAService::processSynchronize and gather a response.
40754125
ConstElementPtr rsp;
4076-
runProcessSynchronize4(rsp);
4126+
runProcessSynchronize4(config_storage, rsp);
40774127

40784128
// The response should indicate an error
40794129
ASSERT_TRUE(rsp);
@@ -4103,9 +4153,14 @@ TEST_F(HAServiceTest, processSynchronizeEnableError) {
41034153
factory2_->getResponseCreator()->setControlResult("ha-sync-complete-notify",
41044154
CONTROL_RESULT_COMMAND_UNSUPPORTED);
41054155

4156+
// Create HA configuration for 3 servers. This server is
4157+
// server 1.
4158+
HAConfigPtr config_storage = createValidConfiguration();
4159+
setBasicAuth(config_storage);
4160+
41064161
// Run HAService::processSynchronize and gather a response.
41074162
ConstElementPtr rsp;
4108-
runProcessSynchronize4(rsp);
4163+
runProcessSynchronize4(config_storage, rsp);
41094164

41104165
// The response should indicate an error
41114166
ASSERT_TRUE(rsp);
@@ -4146,9 +4201,14 @@ TEST_F(HAServiceTest, processSynchronizeNotifyError) {
41464201
factory2_->getResponseCreator()->setControlResult("ha-sync-complete-notify",
41474202
CONTROL_RESULT_ERROR);
41484203

4204+
// Create HA configuration for 3 servers. This server is
4205+
// server 1.
4206+
HAConfigPtr config_storage = createValidConfiguration();
4207+
setBasicAuth(config_storage);
4208+
41494209
// Run HAService::processSynchronize and gather a response.
41504210
ConstElementPtr rsp;
4151-
runProcessSynchronize4(rsp);
4211+
runProcessSynchronize4(config_storage, rsp);
41524212

41534213
// The response should indicate an error
41544214
ASSERT_TRUE(rsp);
@@ -4182,9 +4242,47 @@ TEST_F(HAServiceTest, processSynchronizeNotifyError) {
41824242
// DHCPv6 server.
41834243
TEST_F(HAServiceTest, processSynchronize6) {
41844244

4245+
// Create HA configuration for 3 servers. This server is
4246+
// server 1.
4247+
HAConfigPtr config_storage = createValidConfiguration();
4248+
setBasicAuth(config_storage);
4249+
41854250
// Run HAService::processSynchronize and gather a response.
41864251
ConstElementPtr rsp;
4187-
runProcessSynchronize6(rsp);
4252+
runProcessSynchronize6(config_storage, rsp);
4253+
4254+
// The response should indicate success.
4255+
ASSERT_TRUE(rsp);
4256+
checkAnswer(rsp, CONTROL_RESULT_SUCCESS, "Lease database synchronization"
4257+
" complete.");
4258+
4259+
// All leases should have been inserted into the database.
4260+
for (size_t i = 0; i < leases6_.size(); ++i) {
4261+
Lease6Ptr existing_lease = LeaseMgrFactory::instance().getLease6(Lease::TYPE_NA,
4262+
leases6_[i]->addr_);
4263+
ASSERT_TRUE(existing_lease) << "lease " << leases6_[i]->addr_.toText()
4264+
<< " not in the lease database";
4265+
}
4266+
4267+
// The following commands should have been sent to the server2: dhcp-disable,
4268+
// lease6-get-page and ha-sync-complete-notify.
4269+
EXPECT_TRUE(factory2_->getResponseCreator()->findRequest("dhcp-disable","20"));
4270+
EXPECT_TRUE(factory2_->getResponseCreator()->findRequest("lease6-get-page",""));
4271+
EXPECT_TRUE(factory2_->getResponseCreator()->findRequest("ha-sync-complete-notify",""));
4272+
}
4273+
4274+
// This test verifies that the ha-sync command is processed successfully for the
4275+
// DHCPv6 server in the passive-backup configuration.
4276+
TEST_F(HAServiceTest, processSynchronize6PassiveBackup) {
4277+
4278+
// Create HA configuration for 3 servers. This server is
4279+
// server 1.
4280+
HAConfigPtr config_storage = createValidPassiveBackupConfiguration();
4281+
setBasicAuth(config_storage);
4282+
4283+
// Run HAService::processSynchronize and gather a response.
4284+
ConstElementPtr rsp;
4285+
runProcessSynchronize6(config_storage, rsp);
41884286

41894287
// The response should indicate success.
41904288
ASSERT_TRUE(rsp);
@@ -4219,9 +4317,14 @@ TEST_F(HAServiceTest, processSynchronize6Authorized) {
42194317
factory2_->getResponseCreator()->addBasicAuth("foo", "bar");
42204318
factory3_->getResponseCreator()->addBasicAuth("test", "1234");
42214319

4320+
// Create HA configuration for 3 servers. This server is
4321+
// server 1.
4322+
HAConfigPtr config_storage = createValidConfiguration();
4323+
setBasicAuth(config_storage);
4324+
42224325
// Run HAService::processSynchronize and gather a response.
42234326
ConstElementPtr rsp;
4224-
runProcessSynchronize6(rsp);
4327+
runProcessSynchronize6(config_storage, rsp);
42254328

42264329
// The response should indicate success.
42274330
ASSERT_TRUE(rsp);
@@ -4250,9 +4353,14 @@ TEST_F(HAServiceTest, processSynchronize6DisableError) {
42504353
factory2_->getResponseCreator()->setControlResult("dhcp-disable",
42514354
CONTROL_RESULT_ERROR);
42524355

4356+
// Create HA configuration for 3 servers. This server is
4357+
// server 1.
4358+
HAConfigPtr config_storage = createValidConfiguration();
4359+
setBasicAuth(config_storage);
4360+
42534361
// Run HAService::processSynchronize and gather a response.
42544362
ConstElementPtr rsp;
4255-
runProcessSynchronize6(rsp);
4363+
runProcessSynchronize6(config_storage, rsp);
42564364

42574365
// The response should indicate an error
42584366
ASSERT_TRUE(rsp);
@@ -4271,9 +4379,14 @@ TEST_F(HAServiceTest, processSynchronize6Unauthorized) {
42714379
// Instruct server2 to require authentication.
42724380
factory2_->getResponseCreator()->addBasicAuth("foo", "bar");
42734381

4382+
// Create HA configuration for 3 servers. This server is
4383+
// server 1.
4384+
HAConfigPtr config_storage = createValidConfiguration();
4385+
setBasicAuth(config_storage);
4386+
42744387
// Run HAService::processSynchronize and gather a response.
42754388
ConstElementPtr rsp;
4276-
runProcessSynchronize6(rsp);
4389+
runProcessSynchronize6(config_storage, rsp);
42774390

42784391
// The response should indicate an error
42794392
ASSERT_TRUE(rsp);
@@ -4290,9 +4403,14 @@ TEST_F(HAServiceTest, processSynchronizeLease6GetPageError) {
42904403
factory2_->getResponseCreator()->setControlResult("lease6-get-page",
42914404
CONTROL_RESULT_ERROR);
42924405

4406+
// Create HA configuration for 3 servers. This server is
4407+
// server 1.
4408+
HAConfigPtr config_storage = createValidConfiguration();
4409+
setBasicAuth(config_storage);
4410+
42934411
// Run HAService::processSynchronize and gather a response.
42944412
ConstElementPtr rsp;
4295-
runProcessSynchronize6(rsp);
4413+
runProcessSynchronize6(config_storage, rsp);
42964414

42974415
// The response should indicate an error
42984416
ASSERT_TRUE(rsp);
@@ -4318,9 +4436,14 @@ TEST_F(HAServiceTest, processSynchronize6EnableError) {
43184436
factory2_->getResponseCreator()->setControlResult("ha-sync-complete-notify",
43194437
CONTROL_RESULT_COMMAND_UNSUPPORTED);
43204438

4439+
// Create HA configuration for 3 servers. This server is
4440+
// server 1.
4441+
HAConfigPtr config_storage = createValidConfiguration();
4442+
setBasicAuth(config_storage);
4443+
43214444
// Run HAService::processSynchronize and gather a response.
43224445
ConstElementPtr rsp;
4323-
runProcessSynchronize6(rsp);
4446+
runProcessSynchronize6(config_storage, rsp);
43244447

43254448
// The response should indicate an error
43264449
ASSERT_TRUE(rsp);
@@ -4341,9 +4464,14 @@ TEST_F(HAServiceTest, processSynchronize6NotifyError) {
43414464
factory2_->getResponseCreator()->setControlResult("ha-sync-complete-notify",
43424465
CONTROL_RESULT_ERROR);
43434466

4467+
// Create HA configuration for 3 servers. This server is
4468+
// server 1.
4469+
HAConfigPtr config_storage = createValidConfiguration();
4470+
setBasicAuth(config_storage);
4471+
43444472
// Run HAService::processSynchronize and gather a response.
43454473
ConstElementPtr rsp;
4346-
runProcessSynchronize6(rsp);
4474+
runProcessSynchronize6(config_storage, rsp);
43474475

43484476
// The response should indicate an error
43494477
ASSERT_TRUE(rsp);

src/hooks/dhcp/high_availability/tests/ha_test.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@ HATest::createValidPassiveBackupJsonConfiguration() const {
209209
" {"
210210
" \"this-server-name\": \"server1\","
211211
" \"mode\": \"passive-backup\","
212+
" \"sync-page-limit\": 3,"
212213
" \"multi-threading\": {"
213214
" \"enable-multi-threading\": false"
214215
" },"

0 commit comments

Comments
 (0)