Skip to content

Commit 2c62def

Browse files
Nanda Kishore Salemfacebook-github-bot
authored andcommitted
Ensure withdraw prefix is client or type specific
Summary: IpPrefix + type/client uniquely identifies a instance to withdraw. Even though thrift interface takes PrefixEntry, PrefixManagerClient, is only taking IpPrefix as input, this causes conflict as to which specific prefix to be deleted. Going forward as we enable multi client support etc we need to uniquely delete a specific instance of prefix mgr entry. Ensured that PrefixEntry is deleted only if type matches. Ensured that all the prefixes passed for withdraw must exist, i.e. we only act on the message, if full message can be acted upon without any errors. Another reason for doing this change is, we can use prefix type in input parameters to figure out if we need to update persistent store or not (for next diff) without checking values in prefixMap_. Reviewed By: saifhhasan Differential Revision: D14453541 fbshipit-source-id: da3e3d45a56c29f7025a6fcd1396e75d91300aa2
1 parent e77461e commit 2c62def

6 files changed

Lines changed: 86 additions & 47 deletions

File tree

openr/prefix-manager/PrefixManager.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,16 +262,27 @@ PrefixManager::addOrUpdatePrefixes(
262262
bool
263263
PrefixManager::removePrefixes(
264264
const std::vector<thrift::PrefixEntry>& prefixes) {
265-
bool fail{false};
265+
// Verify all prefixes exist
266+
for (const auto& prefix : prefixes) {
267+
auto it = prefixMap_.find(prefix.prefix);
268+
if ((it == prefixMap_.end()) or (it->second.type != prefix.type)) {
269+
// Missing prefix or invalid type
270+
LOG(INFO) << "Cannot withdraw prefix " << toString(prefix.prefix)
271+
<< ", client: "
272+
<< apache::thrift::TEnumTraits<thrift::PrefixType>::findName(
273+
prefix.type);
274+
return false;
275+
}
276+
}
266277

267278
for (const auto& prefix : prefixes) {
268279
LOG(INFO) << "Withdrawing prefix " << toString(prefix.prefix)
269280
<< ", client: "
270281
<< apache::thrift::TEnumTraits<thrift::PrefixType>::findName(
271282
prefix.type);
272-
fail = prefixMap_.erase(prefix.prefix) > 0 or fail;
283+
prefixMap_.erase(prefix.prefix);
273284
}
274-
return fail;
285+
return true;
275286
}
276287

277288
bool

openr/prefix-manager/PrefixManagerClient.cpp

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,10 @@ PrefixManagerClient::addPrefixes(
3333

3434
folly::Expected<thrift::PrefixManagerResponse, fbzmq::Error>
3535
PrefixManagerClient::withdrawPrefixes(
36-
const std::vector<thrift::IpPrefix>& prefixes) {
36+
const std::vector<thrift::PrefixEntry>& prefixes) {
3737
thrift::PrefixManagerRequest req;
3838
req.cmd = thrift::PrefixManagerCommand::WITHDRAW_PREFIXES;
39-
req.prefixes = folly::gen::from(prefixes) |
40-
folly::gen::mapped([](const thrift::IpPrefix& prefix) {
41-
return thrift::PrefixEntry(
42-
apache::thrift::FRAGILE,
43-
prefix,
44-
{},
45-
{},
46-
thrift::PrefixForwardingType::IP);
47-
}) |
48-
folly::gen::as<std::vector<thrift::PrefixEntry>>();
39+
req.prefixes = prefixes;
4940
return sendRequest(req);
5041
}
5142

openr/prefix-manager/PrefixManagerClient.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class PrefixManagerClient final {
3030
const std::vector<thrift::PrefixEntry>& prefixes);
3131

3232
folly::Expected<thrift::PrefixManagerResponse, fbzmq::Error> withdrawPrefixes(
33-
const std::vector<thrift::IpPrefix>& prefixes);
33+
const std::vector<thrift::PrefixEntry>& prefixes);
3434

3535
folly::Expected<thrift::PrefixManagerResponse, fbzmq::Error>
3636
withdrawPrefixesByType(thrift::PrefixType type);

openr/prefix-manager/tests/PrefixManagerTest.cpp

Lines changed: 65 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -181,23 +181,25 @@ class PrefixManagerTestFixture : public ::testing::Test {
181181
};
182182

183183
TEST_F(PrefixManagerTestFixture, AddRemovePrefix) {
184-
auto resp1 = prefixManagerClient->withdrawPrefixes({addr1});
184+
auto resp1 = prefixManagerClient->withdrawPrefixes({prefixEntry1});
185185
auto resp2 = prefixManagerClient->addPrefixes({prefixEntry1});
186186
auto resp3 = prefixManagerClient->addPrefixes({prefixEntry1});
187-
auto resp4 = prefixManagerClient->withdrawPrefixes({addr1});
188-
auto resp5 = prefixManagerClient->withdrawPrefixes({addr3});
187+
auto resp4 = prefixManagerClient->withdrawPrefixes({prefixEntry1});
188+
auto resp5 = prefixManagerClient->withdrawPrefixes({prefixEntry3});
189189
auto resp6 = prefixManagerClient->addPrefixes({prefixEntry2});
190190
auto resp7 = prefixManagerClient->addPrefixes({prefixEntry3});
191191
auto resp8 = prefixManagerClient->addPrefixes({prefixEntry4});
192192
auto resp9 = prefixManagerClient->addPrefixes({prefixEntry3});
193-
auto resp10 = prefixManagerClient->withdrawPrefixes({addr2});
194-
auto resp11 = prefixManagerClient->withdrawPrefixes({addr3});
195-
auto resp12 = prefixManagerClient->withdrawPrefixes({addr4});
193+
auto resp10 = prefixManagerClient->withdrawPrefixes({prefixEntry2});
194+
auto resp11 = prefixManagerClient->withdrawPrefixes({prefixEntry3});
195+
auto resp12 = prefixManagerClient->withdrawPrefixes({prefixEntry4});
196196
auto resp13 = prefixManagerClient->addPrefixes(
197197
{prefixEntry1, prefixEntry2, prefixEntry3});
198-
auto resp14 = prefixManagerClient->withdrawPrefixes({addr1, addr2});
199-
auto resp15 = prefixManagerClient->withdrawPrefixes({addr1, addr2});
200-
auto resp16 = prefixManagerClient->withdrawPrefixes({addr4});
198+
auto resp14 =
199+
prefixManagerClient->withdrawPrefixes({prefixEntry1, prefixEntry2});
200+
auto resp15 =
201+
prefixManagerClient->withdrawPrefixes({prefixEntry1, prefixEntry2});
202+
auto resp16 = prefixManagerClient->withdrawPrefixes({prefixEntry4});
201203
EXPECT_FALSE(resp1.value().success);
202204
EXPECT_TRUE(resp2.value().success);
203205
EXPECT_FALSE(resp3.value().success);
@@ -225,7 +227,7 @@ TEST_F(PrefixManagerTestFixture, RemoveUpdateType) {
225227
prefixManagerClient->addPrefixes({prefixEntry6});
226228
prefixManagerClient->addPrefixes({prefixEntry7});
227229
prefixManagerClient->addPrefixes({prefixEntry8});
228-
auto resp1 = prefixManagerClient->withdrawPrefixes({addr1});
230+
auto resp1 = prefixManagerClient->withdrawPrefixes({prefixEntry1});
229231
EXPECT_TRUE(resp1.value().success);
230232
auto resp2 =
231233
prefixManagerClient->withdrawPrefixesByType(thrift::PrefixType::DEFAULT);
@@ -235,20 +237,20 @@ TEST_F(PrefixManagerTestFixture, RemoveUpdateType) {
235237
prefixManagerClient->withdrawPrefixesByType(thrift::PrefixType::DEFAULT);
236238
EXPECT_FALSE(resp3.value().success);
237239
// all the DEFAULT type should be gone
238-
auto resp4 = prefixManagerClient->withdrawPrefixes({addr3});
240+
auto resp4 = prefixManagerClient->withdrawPrefixes({prefixEntry3});
239241
EXPECT_FALSE(resp4.value().success);
240-
auto resp5 = prefixManagerClient->withdrawPrefixes({addr5});
242+
auto resp5 = prefixManagerClient->withdrawPrefixes({prefixEntry5});
241243
EXPECT_FALSE(resp5.value().success);
242-
auto resp6 = prefixManagerClient->withdrawPrefixes({addr7});
244+
auto resp6 = prefixManagerClient->withdrawPrefixes({prefixEntry7});
243245
EXPECT_FALSE(resp6.value().success);
244246
// The PREFIX_ALLOCATOR type should still be there to be withdrawed
245-
auto resp7 = prefixManagerClient->withdrawPrefixes({addr2});
247+
auto resp7 = prefixManagerClient->withdrawPrefixes({prefixEntry2});
246248
EXPECT_TRUE(resp7.value().success);
247-
auto resp8 = prefixManagerClient->withdrawPrefixes({addr4});
249+
auto resp8 = prefixManagerClient->withdrawPrefixes({prefixEntry4});
248250
EXPECT_TRUE(resp8.value().success);
249-
auto resp9 = prefixManagerClient->withdrawPrefixes({addr6});
251+
auto resp9 = prefixManagerClient->withdrawPrefixes({prefixEntry6});
250252
EXPECT_TRUE(resp9.value().success);
251-
auto resp10 = prefixManagerClient->withdrawPrefixes({addr8});
253+
auto resp10 = prefixManagerClient->withdrawPrefixes({prefixEntry8});
252254
EXPECT_TRUE(resp10.value().success);
253255
auto resp11 = prefixManagerClient->withdrawPrefixesByType(
254256
thrift::PrefixType::PREFIX_ALLOCATOR);
@@ -264,10 +266,42 @@ TEST_F(PrefixManagerTestFixture, RemoveUpdateType) {
264266
EXPECT_TRUE(resp12.value().success);
265267
EXPECT_FALSE(resp13.value().success);
266268

267-
EXPECT_FALSE(prefixManagerClient->withdrawPrefixes({addr2}).value().success);
268-
EXPECT_FALSE(prefixManagerClient->withdrawPrefixes({addr4}).value().success);
269-
EXPECT_TRUE(prefixManagerClient->withdrawPrefixes({addr6}).value().success);
270-
EXPECT_TRUE(prefixManagerClient->withdrawPrefixes({addr8}).value().success);
269+
EXPECT_FALSE(
270+
prefixManagerClient->withdrawPrefixes({prefixEntry2}).value().success);
271+
EXPECT_FALSE(
272+
prefixManagerClient->withdrawPrefixes({prefixEntry4}).value().success);
273+
EXPECT_TRUE(
274+
prefixManagerClient->withdrawPrefixes({prefixEntry6}).value().success);
275+
EXPECT_TRUE(
276+
prefixManagerClient->withdrawPrefixes({prefixEntry8}).value().success);
277+
}
278+
279+
TEST_F(PrefixManagerTestFixture, RemoveInvalidType) {
280+
EXPECT_TRUE(prefixManagerClient->addPrefixes({prefixEntry1}).value().success);
281+
EXPECT_TRUE(prefixManagerClient->addPrefixes({prefixEntry2}).value().success);
282+
283+
// Verify that prefix type has to match for withdrawing prefix
284+
auto prefixEntryError = prefixEntry1;
285+
prefixEntryError.type = thrift::PrefixType::PREFIX_ALLOCATOR;
286+
287+
auto resp1 =
288+
prefixManagerClient->withdrawPrefixes({prefixEntryError, prefixEntry2});
289+
EXPECT_FALSE(resp1.value().success);
290+
291+
// Verify that all prefixes are still present
292+
auto resp2 = prefixManagerClient->getPrefixes();
293+
EXPECT_TRUE(resp2.value().success);
294+
EXPECT_EQ(2, resp2.value().prefixes.size());
295+
296+
// Verify withdrawing of multiple prefixes
297+
auto resp3 =
298+
prefixManagerClient->withdrawPrefixes({prefixEntry1, prefixEntry2});
299+
EXPECT_TRUE(resp3.value().success);
300+
301+
// Verify that there are no prefixes
302+
auto resp4 = prefixManagerClient->getPrefixes();
303+
EXPECT_TRUE(resp4.value().success);
304+
EXPECT_EQ(0, resp4.value().prefixes.size());
271305
}
272306

273307
TEST_F(PrefixManagerTestFixture, VerifyKvStore) {
@@ -322,8 +356,10 @@ TEST_F(PrefixManagerTestFixture, CheckReload) {
322356
PrefixManagerLocalCmdUrl{prefixManager2->inprocCmdUrl}, context);
323357

324358
// verify that the new manager has what the first manager had
325-
EXPECT_TRUE(prefixManagerClient2->withdrawPrefixes({addr1}).value().success);
326-
EXPECT_TRUE(prefixManagerClient2->withdrawPrefixes({addr2}).value().success);
359+
EXPECT_TRUE(
360+
prefixManagerClient2->withdrawPrefixes({prefixEntry1}).value().success);
361+
EXPECT_TRUE(
362+
prefixManagerClient2->withdrawPrefixes({prefixEntry2}).value().success);
327363
// cleanup
328364
prefixManager2->stop();
329365
prefixManagerThread2->join();
@@ -387,7 +423,7 @@ TEST_F(PrefixManagerTestFixture, PrefixAddCount) {
387423
auto count2 = prefixManager->getPrefixAddCounter();
388424
EXPECT_EQ(5, count2);
389425

390-
prefixManagerClient->withdrawPrefixes({addr1});
426+
prefixManagerClient->withdrawPrefixes({prefixEntry1});
391427
auto count3 = prefixManager->getPrefixAddCounter();
392428
EXPECT_EQ(5, count3);
393429
}
@@ -396,7 +432,7 @@ TEST_F(PrefixManagerTestFixture, PrefixWithdrawCount) {
396432
auto count0 = prefixManager->getPrefixWithdrawCounter();
397433
EXPECT_EQ(0, count0);
398434

399-
prefixManagerClient->withdrawPrefixes({addr1});
435+
prefixManagerClient->withdrawPrefixes({prefixEntry1});
400436
auto count1 = prefixManager->getPrefixWithdrawCounter();
401437
EXPECT_EQ(0, count1);
402438

@@ -407,16 +443,16 @@ TEST_F(PrefixManagerTestFixture, PrefixWithdrawCount) {
407443
auto count2 = prefixManager->getPrefixWithdrawCounter();
408444
EXPECT_EQ(0, count2);
409445

410-
prefixManagerClient->withdrawPrefixes({addr1});
446+
prefixManagerClient->withdrawPrefixes({prefixEntry1});
411447
auto count3 = prefixManager->getPrefixWithdrawCounter();
412448
EXPECT_EQ(1, count3);
413449

414-
prefixManagerClient->withdrawPrefixes({addr4});
450+
prefixManagerClient->withdrawPrefixes({prefixEntry4});
415451
auto count4 = prefixManager->getPrefixWithdrawCounter();
416452
EXPECT_EQ(1, count4);
417453

418-
prefixManagerClient->withdrawPrefixes({addr1});
419-
prefixManagerClient->withdrawPrefixes({addr2});
454+
prefixManagerClient->withdrawPrefixes({prefixEntry1});
455+
prefixManagerClient->withdrawPrefixes({prefixEntry2});
420456
auto count5 = prefixManager->getPrefixWithdrawCounter();
421457
EXPECT_EQ(2, count5);
422458
}

openr/py/openr/cli/commands/prefix_mgr.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
from builtins import object
1313

1414
from openr.clients import prefix_mgr_client
15-
from openr.Lsdb import ttypes as lsdb_types
1615
from openr.utils import ipnetwork, printing
1716

1817

openr/py/openr/clients/prefix_mgr_client.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,11 @@ def sync_prefix(self, prefixes, prefix_type, forwarding_type=False):
7979
forwarding_type,
8080
)
8181

82-
def withdraw_prefix(self, prefixes):
82+
def withdraw_prefix(self, prefixes, prefix_type="BREEZE"):
8383
return self.send_cmd_to_prefix_mgr(
84-
prefix_mgr_types.PrefixManagerCommand.WITHDRAW_PREFIXES, prefixes
84+
prefix_mgr_types.PrefixManagerCommand.WITHDRAW_PREFIXES,
85+
prefixes,
86+
prefix_type,
8587
)
8688

8789
def view_prefix(self):

0 commit comments

Comments
 (0)