Skip to content

Commit 583236f

Browse files
authored
[P4Orch] Lazy UDF match creation to avoid failure during warm reboot (sonic-net#2282)
* [P4Orch] Lazy UDF match creation.
1 parent d7b5ff7 commit 583236f

File tree

5 files changed

+44
-28
lines changed

5 files changed

+44
-28
lines changed

orchagent/p4orch/acl_table_manager.cpp

+10-8
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,15 @@ AclTableManager::AclTableManager(P4OidMapper *p4oidMapper, ResponsePublisherInte
3636
SWSS_LOG_ENTER();
3737

3838
assert(p4oidMapper != nullptr);
39-
// Create the default UDF match
40-
auto status = createDefaultUdfMatch();
41-
if (!status.ok())
42-
{
43-
SWSS_LOG_ERROR("Failed to create ACL UDF default match : %s", status.message().c_str());
44-
}
4539
}
4640

4741
AclTableManager::~AclTableManager()
4842
{
43+
sai_object_id_t udf_match_oid;
44+
if (!m_p4OidMapper->getOID(SAI_OBJECT_TYPE_UDF_MATCH, P4_UDF_MATCH_DEFAULT, &udf_match_oid))
45+
{
46+
return;
47+
}
4948
auto status = removeDefaultUdfMatch();
5049
if (!status.ok())
5150
{
@@ -465,8 +464,11 @@ ReturnCode AclTableManager::createUdf(const P4UdfField &udf_field)
465464
sai_object_id_t udf_match_oid;
466465
if (!m_p4OidMapper->getOID(SAI_OBJECT_TYPE_UDF_MATCH, P4_UDF_MATCH_DEFAULT, &udf_match_oid))
467466
{
468-
return ReturnCode(StatusCode::SWSS_RC_NOT_FOUND)
469-
<< "UDF default match " << QuotedVar(P4_UDF_MATCH_DEFAULT) << " does not exist";
467+
// Create the default UDF match
468+
LOG_AND_RETURN_IF_ERROR(createDefaultUdfMatch()
469+
<< "Failed to create ACL UDF default match "
470+
<< QuotedVar(P4_UDF_MATCH_DEFAULT));
471+
m_p4OidMapper->getOID(SAI_OBJECT_TYPE_UDF_MATCH, P4_UDF_MATCH_DEFAULT, &udf_match_oid);
470472
}
471473
std::vector<sai_attribute_t> udf_attrs;
472474
sai_attribute_t udf_attr;

orchagent/p4orch/tests/acl_manager_test.cpp

+18-2
Original file line numberDiff line numberDiff line change
@@ -834,8 +834,6 @@ class AclManagerTest : public ::testing::Test
834834
Truly(std::bind(MatchSaiSwitchAttrByAclStage, SAI_SWITCH_ATTR_PRE_INGRESS_ACL,
835835
kAclGroupLookupOid, std::placeholders::_1))))
836836
.WillRepeatedly(Return(SAI_STATUS_SUCCESS));
837-
EXPECT_CALL(mock_sai_udf_, create_udf_match(_, _, _, _))
838-
.WillOnce(DoAll(SetArgPointee<0>(kUdfMatchOid1), Return(SAI_STATUS_SUCCESS)));
839837
std::vector<std::string> p4_tables;
840838
gP4Orch = new P4Orch(gAppDb, p4_tables, gVrfOrch, copp_orch_);
841839
acl_table_manager_ = gP4Orch->getAclTableManager();
@@ -860,6 +858,8 @@ class AclManagerTest : public ::testing::Test
860858
.WillOnce(DoAll(SetArgPointee<0>(kAclTableIngressOid), Return(SAI_STATUS_SUCCESS)));
861859
EXPECT_CALL(mock_sai_acl_, create_acl_table_group_member(_, _, _, _))
862860
.WillOnce(DoAll(SetArgPointee<0>(kAclGroupMemberIngressOid), Return(SAI_STATUS_SUCCESS)));
861+
EXPECT_CALL(mock_sai_udf_, create_udf_match(_, _, _, _))
862+
.WillOnce(DoAll(SetArgPointee<0>(kUdfMatchOid1), Return(SAI_STATUS_SUCCESS)));
863863
EXPECT_CALL(mock_sai_udf_, create_udf_group(_, _, _, _))
864864
.Times(3)
865865
.WillRepeatedly(DoAll(SetArgPointee<0>(kUdfGroupOid1), Return(SAI_STATUS_SUCCESS)));
@@ -1156,6 +1156,8 @@ TEST_F(AclManagerTest, CreateIngressPuntTableFailsWhenCapabilityExceeds)
11561156
auto app_db_entry = getDefaultAclTableDefAppDbEntry();
11571157
sai_object_id_t user_defined_trap_oid = gUserDefinedTrapStartOid;
11581158
AddDefaultUserTrapsSaiCalls(&user_defined_trap_oid);
1159+
EXPECT_CALL(mock_sai_udf_, create_udf_match(_, _, _, _))
1160+
.WillOnce(DoAll(SetArgPointee<0>(kUdfMatchOid1), Return(SAI_STATUS_SUCCESS)));
11591161
EXPECT_CALL(mock_sai_udf_, create_udf_group(_, _, _, _))
11601162
.WillRepeatedly(DoAll(SetArgPointee<0>(kUdfGroupOid1), Return(SAI_STATUS_SUCCESS)));
11611163
EXPECT_CALL(mock_sai_udf_, create_udf(_, _, _, _)).Times(3).WillRepeatedly(Return(SAI_STATUS_SUCCESS));
@@ -1170,6 +1172,8 @@ TEST_F(AclManagerTest, CreateIngressPuntTableFailsWhenFailedToCreateTableGroupMe
11701172
auto app_db_entry = getDefaultAclTableDefAppDbEntry();
11711173
sai_object_id_t user_defined_trap_oid = gUserDefinedTrapStartOid;
11721174
AddDefaultUserTrapsSaiCalls(&user_defined_trap_oid);
1175+
EXPECT_CALL(mock_sai_udf_, create_udf_match(_, _, _, _))
1176+
.WillOnce(DoAll(SetArgPointee<0>(kUdfMatchOid1), Return(SAI_STATUS_SUCCESS)));
11731177
EXPECT_CALL(mock_sai_udf_, create_udf_group(_, _, _, _))
11741178
.WillRepeatedly(DoAll(SetArgPointee<0>(kUdfGroupOid1), Return(SAI_STATUS_SUCCESS)));
11751179
EXPECT_CALL(mock_sai_udf_, create_udf(_, _, _, _)).Times(3).WillRepeatedly(Return(SAI_STATUS_SUCCESS));
@@ -1187,6 +1191,8 @@ TEST_F(AclManagerTest, CreateIngressPuntTableRaisesCriticalStateWhenAclTableReco
11871191
auto app_db_entry = getDefaultAclTableDefAppDbEntry();
11881192
sai_object_id_t user_defined_trap_oid = gUserDefinedTrapStartOid;
11891193
AddDefaultUserTrapsSaiCalls(&user_defined_trap_oid);
1194+
EXPECT_CALL(mock_sai_udf_, create_udf_match(_, _, _, _))
1195+
.WillOnce(DoAll(SetArgPointee<0>(kUdfMatchOid1), Return(SAI_STATUS_SUCCESS)));
11901196
EXPECT_CALL(mock_sai_udf_, create_udf_group(_, _, _, _))
11911197
.WillRepeatedly(DoAll(SetArgPointee<0>(kUdfGroupOid1), Return(SAI_STATUS_SUCCESS)));
11921198
EXPECT_CALL(mock_sai_udf_, create_udf(_, _, _, _)).Times(3).WillRepeatedly(Return(SAI_STATUS_SUCCESS));
@@ -1205,6 +1211,8 @@ TEST_F(AclManagerTest, CreateIngressPuntTableRaisesCriticalStateWhenUdfGroupReco
12051211
auto app_db_entry = getDefaultAclTableDefAppDbEntry();
12061212
sai_object_id_t user_defined_trap_oid = gUserDefinedTrapStartOid;
12071213
AddDefaultUserTrapsSaiCalls(&user_defined_trap_oid);
1214+
EXPECT_CALL(mock_sai_udf_, create_udf_match(_, _, _, _))
1215+
.WillOnce(DoAll(SetArgPointee<0>(kUdfMatchOid1), Return(SAI_STATUS_SUCCESS)));
12081216
EXPECT_CALL(mock_sai_udf_, create_udf_group(_, _, _, _))
12091217
.WillRepeatedly(DoAll(SetArgPointee<0>(kUdfGroupOid1), Return(SAI_STATUS_SUCCESS)));
12101218
EXPECT_CALL(mock_sai_udf_, create_udf(_, _, _, _)).Times(3).WillRepeatedly(Return(SAI_STATUS_SUCCESS));
@@ -1223,6 +1231,8 @@ TEST_F(AclManagerTest, CreateIngressPuntTableRaisesCriticalStateWhenUdfRecoveryF
12231231
auto app_db_entry = getDefaultAclTableDefAppDbEntry();
12241232
sai_object_id_t user_defined_trap_oid = gUserDefinedTrapStartOid;
12251233
AddDefaultUserTrapsSaiCalls(&user_defined_trap_oid);
1234+
EXPECT_CALL(mock_sai_udf_, create_udf_match(_, _, _, _))
1235+
.WillOnce(DoAll(SetArgPointee<0>(kUdfMatchOid1), Return(SAI_STATUS_SUCCESS)));
12261236
EXPECT_CALL(mock_sai_udf_, create_udf_group(_, _, _, _))
12271237
.WillRepeatedly(DoAll(SetArgPointee<0>(kUdfGroupOid1), Return(SAI_STATUS_SUCCESS)));
12281238
EXPECT_CALL(mock_sai_udf_, create_udf(_, _, _, _)).Times(3).WillRepeatedly(Return(SAI_STATUS_SUCCESS));
@@ -1244,6 +1254,8 @@ TEST_F(AclManagerTest, CreateIngressPuntTableFailsWhenFailedToCreateUdf)
12441254
AddDefaultUserTrapsSaiCalls(&user_defined_trap_oid);
12451255
// Fail to create the first UDF, and success to remove the first UDF
12461256
// group
1257+
EXPECT_CALL(mock_sai_udf_, create_udf_match(_, _, _, _))
1258+
.WillOnce(DoAll(SetArgPointee<0>(kUdfMatchOid1), Return(SAI_STATUS_SUCCESS)));
12471259
EXPECT_CALL(mock_sai_udf_, create_udf_group(_, _, _, _)).WillOnce(Return(SAI_STATUS_SUCCESS));
12481260
EXPECT_CALL(mock_sai_udf_, create_udf(_, _, _, _)).WillOnce(Return(SAI_STATUS_FAILURE));
12491261
EXPECT_CALL(mock_sai_udf_, remove_udf_group(_)).WillOnce(Return(SAI_STATUS_SUCCESS));
@@ -2099,6 +2111,8 @@ TEST_F(AclManagerTest, DrainRuleTuplesToProcessSetRequestSucceeds)
20992111
.WillOnce(DoAll(SetArgPointee<0>(kAclTableIngressOid), Return(SAI_STATUS_SUCCESS)));
21002112
EXPECT_CALL(mock_sai_acl_, create_acl_table_group_member(_, _, _, _))
21012113
.WillOnce(DoAll(SetArgPointee<0>(kAclGroupMemberIngressOid), Return(SAI_STATUS_SUCCESS)));
2114+
EXPECT_CALL(mock_sai_udf_, create_udf_match(_, _, _, _))
2115+
.WillOnce(DoAll(SetArgPointee<0>(kUdfMatchOid1), Return(SAI_STATUS_SUCCESS)));
21022116
EXPECT_CALL(mock_sai_udf_, create_udf_group(_, _, _, _))
21032117
.WillRepeatedly(DoAll(SetArgPointee<0>(kUdfGroupOid1), Return(SAI_STATUS_SUCCESS)));
21042118
EXPECT_CALL(mock_sai_udf_, create_udf(_, _, _, _)).Times(3).WillRepeatedly(Return(SAI_STATUS_SUCCESS));
@@ -4055,6 +4069,8 @@ TEST_F(AclManagerTest, DoAclCounterStatsTaskSucceeds)
40554069
.WillOnce(DoAll(SetArgPointee<0>(kAclTableIngressOid), Return(SAI_STATUS_SUCCESS)));
40564070
EXPECT_CALL(mock_sai_acl_, create_acl_table_group_member(_, _, _, _))
40574071
.WillOnce(DoAll(SetArgPointee<0>(kAclGroupMemberIngressOid), Return(SAI_STATUS_SUCCESS)));
4072+
EXPECT_CALL(mock_sai_udf_, create_udf_match(_, _, _, _))
4073+
.WillOnce(DoAll(SetArgPointee<0>(kUdfMatchOid1), Return(SAI_STATUS_SUCCESS)));
40584074
EXPECT_CALL(mock_sai_udf_, create_udf_group(_, _, _, _))
40594075
.WillRepeatedly(DoAll(SetArgPointee<0>(kUdfGroupOid1), Return(SAI_STATUS_SUCCESS)));
40604076
EXPECT_CALL(mock_sai_udf_, create_udf(_, _, _, _)).Times(3).WillRepeatedly(Return(SAI_STATUS_SUCCESS));

orchagent/p4orch/tests/wcmp_manager_test.cpp

-11
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#include "mock_sai_next_hop_group.h"
1313
#include "mock_sai_serialize.h"
1414
#include "mock_sai_switch.h"
15-
#include "mock_sai_udf.h"
1615
#include "p4oidmapper.h"
1716
#include "p4orch.h"
1817
#include "p4orch/p4orch_util.h"
@@ -31,7 +30,6 @@ extern sai_object_id_t gSwitchId;
3130
extern sai_next_hop_group_api_t *sai_next_hop_group_api;
3231
extern sai_hostif_api_t *sai_hostif_api;
3332
extern sai_switch_api_t *sai_switch_api;
34-
extern sai_udf_api_t *sai_udf_api;
3533
extern sai_object_id_t gSwitchId;
3634
extern sai_acl_api_t *sai_acl_api;
3735

@@ -68,7 +66,6 @@ const std::string kWcmpGroupKey1 = KeyGenerator::generateWcmpGroupKey(kWcmpGroup
6866
const std::string kNexthopKey1 = KeyGenerator::generateNextHopKey(kNexthopId1);
6967
const std::string kNexthopKey2 = KeyGenerator::generateNextHopKey(kNexthopId2);
7068
const std::string kNexthopKey3 = KeyGenerator::generateNextHopKey(kNexthopId3);
71-
constexpr sai_object_id_t kUdfMatchOid1 = 5001;
7269

7370
// Matches the next hop group type sai_attribute_t argument.
7471
bool MatchSaiNextHopGroupAttribute(const sai_attribute_t *attr)
@@ -154,7 +151,6 @@ class WcmpManagerTest : public ::testing::Test
154151
EXPECT_CALL(mock_sai_switch_, set_switch_attribute(Eq(gSwitchId), _))
155152
.WillRepeatedly(Return(SAI_STATUS_SUCCESS));
156153
EXPECT_CALL(mock_sai_acl_, remove_acl_table_group(_)).WillRepeatedly(Return(SAI_STATUS_SUCCESS));
157-
EXPECT_CALL(mock_sai_udf_, remove_udf_match(_)).WillRepeatedly(Return(SAI_STATUS_SUCCESS));
158154
delete gP4Orch;
159155
delete copp_orch_;
160156
}
@@ -167,7 +163,6 @@ class WcmpManagerTest : public ::testing::Test
167163
mock_sai_hostif = &mock_sai_hostif_;
168164
mock_sai_serialize = &mock_sai_serialize_;
169165
mock_sai_acl = &mock_sai_acl_;
170-
mock_sai_udf = &mock_sai_udf_;
171166

172167
sai_next_hop_group_api->create_next_hop_group = create_next_hop_group;
173168
sai_next_hop_group_api->remove_next_hop_group = remove_next_hop_group;
@@ -181,8 +176,6 @@ class WcmpManagerTest : public ::testing::Test
181176
sai_switch_api->set_switch_attribute = mock_set_switch_attribute;
182177
sai_acl_api->create_acl_table_group = create_acl_table_group;
183178
sai_acl_api->remove_acl_table_group = remove_acl_table_group;
184-
sai_udf_api->create_udf_match = create_udf_match;
185-
sai_udf_api->remove_udf_match = remove_udf_match;
186179
}
187180

188181
void setUpP4Orch()
@@ -194,9 +187,6 @@ class WcmpManagerTest : public ::testing::Test
194187
copp_orch_ = new CoppOrch(gAppDb, APP_COPP_TABLE_NAME);
195188

196189
// init P4 orch
197-
EXPECT_CALL(mock_sai_udf_, create_udf_match(_, _, _, _))
198-
.WillOnce(DoAll(SetArgPointee<0>(kUdfMatchOid1), Return(SAI_STATUS_SUCCESS)));
199-
200190
std::vector<std::string> p4_tables;
201191
gP4Orch = new P4Orch(gAppDb, p4_tables, gVrfOrch, copp_orch_);
202192
}
@@ -301,7 +291,6 @@ class WcmpManagerTest : public ::testing::Test
301291
StrictMock<MockSaiHostif> mock_sai_hostif_;
302292
StrictMock<MockSaiSerialize> mock_sai_serialize_;
303293
StrictMock<MockSaiAcl> mock_sai_acl_;
304-
StrictMock<MockSaiUdf> mock_sai_udf_;
305294
P4OidMapper *p4_oid_mapper_;
306295
WcmpManager *wcmp_group_manager_;
307296
CoppOrch *copp_orch_;

tests/p4rt/test_l3.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ def test_IPv4RouteWithNexthopAddUpdateDeletePass(self, dvs, testlog):
262262

263263
# Verify that P4RT key to OID count is same as the original count.
264264
status, fvs = key_to_oid_helper.get_db_info()
265-
assert status == True
265+
assert status == False
266266
assert len(fvs) == len(original_key_oid_info)
267267

268268
# Query application database for route entries.
@@ -651,7 +651,7 @@ def test_IPv6WithWcmpRouteAddUpdateDeletePass(self, dvs, testlog):
651651

652652
# Verify that P4RT key to OID count is same as original count.
653653
status, fvs = key_to_oid_helper.get_db_info()
654-
assert status == True
654+
assert status == False
655655
assert len(fvs) == len(original_key_oid_info)
656656

657657
# Query application database for route entries.
@@ -1148,7 +1148,7 @@ def test_PruneAndRestoreNextHop(self, dvs, testlog):
11481148

11491149
# Verify that P4RT key to OID count is same as the original count.
11501150
status, fvs = key_to_oid_helper.get_db_info()
1151-
assert status == True
1151+
assert status == False
11521152
assert len(fvs) == len(original_key_oid_info)
11531153

11541154
def test_PruneNextHopOnWarmBoot(self, dvs, testlog):
@@ -1386,7 +1386,7 @@ def test_PruneNextHopOnWarmBoot(self, dvs, testlog):
13861386

13871387
# Verify that P4RT key to OID count is same as the original count.
13881388
status, fvs = key_to_oid_helper.get_db_info()
1389-
assert status == True
1389+
assert status == False
13901390
assert len(fvs) == len(original_key_oid_info)
13911391

13921392
def test_CreateWcmpMemberForOperUpWatchportOnly(self, dvs, testlog):
@@ -1620,7 +1620,7 @@ def test_CreateWcmpMemberForOperUpWatchportOnly(self, dvs, testlog):
16201620

16211621
# Verify that P4RT key to OID count is same as the original count.
16221622
status, fvs = key_to_oid_helper.get_db_info()
1623-
assert status == True
1623+
assert status == False
16241624
assert len(fvs) == len(original_key_oid_info)
16251625

16261626
def test_RemovePrunedWcmpGroupMember(self, dvs, testlog):
@@ -1841,5 +1841,5 @@ def test_RemovePrunedWcmpGroupMember(self, dvs, testlog):
18411841

18421842
# Verify that P4RT key to OID count is same as the original count.
18431843
status, fvs = key_to_oid_helper.get_db_info()
1844-
assert status == True
1844+
assert status == False
18451845
assert len(fvs) == len(original_key_oid_info)

tests/p4rt/test_p4rt_acl.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,17 @@ def test_AclRulesAddUpdateDelPass(self, dvs, testlog):
257257
assert status == True
258258
util.verify_attr(fvs, attr_list)
259259

260+
asic_udf_matches = util.get_keys(
261+
self._p4rt_udf_match_obj.asic_db, self._p4rt_udf_match_obj.ASIC_DB_TBL_NAME
262+
)
263+
260264
# query ASIC database for default UDF wildcard match
261-
udf_match_asic_db_key = original_asic_udf_matches[0]
265+
udf_match_asic_db_keys = [
266+
key for key in asic_udf_matches if key not in original_asic_udf_matches
267+
]
268+
269+
assert len(udf_match_asic_db_keys) == 1
270+
udf_match_asic_db_key = udf_match_asic_db_keys[0]
262271

263272
(status, fvs) = util.get_key(
264273
self._p4rt_udf_match_obj.asic_db,

0 commit comments

Comments
 (0)