From ffe371d66c3706fd8040de05787e25a7b347dafa Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:27:58 +0800 Subject: [PATCH 1/8] [syncd] Support bulk set in INIT_VIEW mode (#1517) Support bulk set in INIT_VIEW mode. --- syncd/Syncd.cpp | 22 ++- syncd/tests/TestSyncdBrcm.cpp | 304 ++++++++++++++++++++++++++++++++++ 2 files changed, 325 insertions(+), 1 deletion(-) diff --git a/syncd/Syncd.cpp b/syncd/Syncd.cpp index e7efff34..7ce3b9bc 100644 --- a/syncd/Syncd.cpp +++ b/syncd/Syncd.cpp @@ -921,7 +921,6 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode( { case SAI_COMMON_API_BULK_CREATE: case SAI_COMMON_API_BULK_REMOVE: - case SAI_COMMON_API_BULK_SET: if (info->isnonobjectid) { @@ -961,6 +960,27 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode( return SAI_STATUS_SUCCESS; } + case SAI_COMMON_API_BULK_SET: + + switch (objectType) + { + case SAI_OBJECT_TYPE_SWITCH: + case SAI_OBJECT_TYPE_SCHEDULER_GROUP: + + SWSS_LOG_THROW("%s is not supported in init view mode", + sai_serialize_object_type(objectType).c_str()); + + default: + + break; + } + + sendApiResponse(api, SAI_STATUS_SUCCESS, (uint32_t)statuses.size(), statuses.data()); + + syncUpdateRedisBulkQuadEvent(api, statuses, objectType, objectIds, strAttributes); + + return SAI_STATUS_SUCCESS; + case SAI_COMMON_API_BULK_GET: SWSS_LOG_THROW("GET bulk api is not implemented in init view mode, FIXME"); diff --git a/syncd/tests/TestSyncdBrcm.cpp b/syncd/tests/TestSyncdBrcm.cpp index b9998d0c..21dd0fc4 100644 --- a/syncd/tests/TestSyncdBrcm.cpp +++ b/syncd/tests/TestSyncdBrcm.cpp @@ -683,4 +683,308 @@ TEST_F(SyncdBrcmTest, portBufferBulkSet) status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs); ASSERT_EQ(status, SAI_STATUS_SUCCESS); +} + +TEST_F(SyncdBrcmTest, portBulkSetInInitView) +{ + sai_object_id_t switchId; + sai_attribute_t attrs[1]; + + struct + { + std::vector oids; + std::vector attrs; + std::vector statuses; + + void resize(size_t size) + { + SWSS_LOG_ENTER(); + + oids.resize(size); + attrs.resize(size); + statuses.resize(size, SAI_STATUS_NOT_EXECUTED); + } + } ports; + + // init view + + attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD; + attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW; + + auto status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // create switch + + attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH; + attrs[0].value.booldata = true; + + status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // apply view + + attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD; + attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW; + + status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // init view + + attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD; + attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW; + + status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // create switch + + attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH; + attrs[0].value.booldata = true; + + status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + attrs[0].id = SAI_SWITCH_ATTR_PORT_NUMBER; + status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + ports.resize(attrs[0].value.u32); + + ASSERT_TRUE(ports.oids.size() > 1); + + attrs[0].id = SAI_SWITCH_ATTR_PORT_LIST; + attrs[0].value.objlist.count = static_cast(ports.oids.size()); + attrs[0].value.objlist.list = ports.oids.data(); + status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // Set port admin status in bulk + + for (size_t i = 0; i < ports.oids.size(); i++) + { + ports.attrs[i].id = SAI_PORT_ATTR_ADMIN_STATE; + ports.attrs[i].value.booldata = true; + } + + status = m_sairedis->bulkSet(SAI_OBJECT_TYPE_PORT, static_cast(ports.oids.size()), ports.oids.data(), + ports.attrs.data(), SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, ports.statuses.data()); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + for (size_t i = 0; i < ports.oids.size(); i++) + { + ASSERT_EQ(ports.statuses[i], SAI_STATUS_SUCCESS); + } +} + +TEST_F(SyncdBrcmTest, pgBulkSetInInitView) +{ + sai_object_id_t switchId; + sai_attribute_t attrs[1]; + + std::vector portOids; + + struct + { + std::vector oids; + std::vector attrs; + std::vector statuses; + + void resize(size_t size) + { + SWSS_LOG_ENTER(); + + oids.resize(size); + attrs.resize(size); + statuses.resize(size, SAI_STATUS_NOT_EXECUTED); + } + } pgs; + + // init view + + attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD; + attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW; + + auto status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // create switch + + attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH; + attrs[0].value.booldata = true; + + status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // apply view + + attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD; + attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW; + + status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // init view + + attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD; + attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW; + + status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // create switch + + attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH; + attrs[0].value.booldata = true; + + status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + attrs[0].id = SAI_SWITCH_ATTR_PORT_NUMBER; + status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + portOids.resize(attrs[0].value.u32); + + ASSERT_TRUE(portOids.size() > 1); + + attrs[0].id = SAI_SWITCH_ATTR_PORT_LIST; + attrs[0].value.objlist.count = static_cast(portOids.size()); + attrs[0].value.objlist.list = portOids.data(); + status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + attrs[0].id = SAI_SWITCH_ATTR_PORT_LIST; + attrs[0].value.objlist.count = static_cast(portOids.size()); + attrs[0].value.objlist.list = portOids.data(); + status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // Create buffer pool + + std::array buffer_pool_attrs; + sai_object_id_t buffer_pool; + + buffer_pool_attrs[0].id = SAI_BUFFER_POOL_ATTR_THRESHOLD_MODE; + buffer_pool_attrs[0].value.u32 = SAI_BUFFER_POOL_THRESHOLD_MODE_DYNAMIC; + + buffer_pool_attrs[1].id = SAI_BUFFER_POOL_ATTR_SIZE; + buffer_pool_attrs[1].value.u32 = 47218432; + + buffer_pool_attrs[2].id = SAI_BUFFER_POOL_ATTR_TYPE; + buffer_pool_attrs[2].value.u32 = SAI_BUFFER_POOL_TYPE_INGRESS; + + buffer_pool_attrs[3].id = SAI_BUFFER_POOL_ATTR_XOFF_SIZE; + buffer_pool_attrs[3].value.u32 = 17708800; + + status = m_sairedis->create(SAI_OBJECT_TYPE_BUFFER_POOL, &buffer_pool, switchId, + static_cast(buffer_pool_attrs.size()), buffer_pool_attrs.data()); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // Create buffer profile + + std::array buffer_profile_attrs; + sai_object_id_t buffer_profile; + + buffer_profile_attrs[0].id = SAI_BUFFER_PROFILE_ATTR_POOL_ID; + buffer_profile_attrs[0].value.oid = buffer_pool; + + buffer_profile_attrs[1].id = SAI_BUFFER_PROFILE_ATTR_THRESHOLD_MODE; + buffer_profile_attrs[1].value.u32 = SAI_BUFFER_PROFILE_THRESHOLD_MODE_DYNAMIC; + + buffer_profile_attrs[2].id = SAI_BUFFER_PROFILE_ATTR_SHARED_DYNAMIC_TH; + buffer_profile_attrs[2].value.s8 = -8; + + buffer_profile_attrs[3].id = SAI_BUFFER_PROFILE_ATTR_RESERVED_BUFFER_SIZE; + buffer_profile_attrs[3].value.u64 = 6755399441055744; + + status = m_sairedis->create(SAI_OBJECT_TYPE_BUFFER_PROFILE, &buffer_profile, switchId, + static_cast(buffer_profile_attrs.size()), buffer_profile_attrs.data()); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // Priority group configuration + + attrs[0].id = SAI_PORT_ATTR_NUMBER_OF_INGRESS_PRIORITY_GROUPS; + status = m_sairedis->get(SAI_OBJECT_TYPE_PORT, portOids[0], 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + pgs.resize(attrs[0].value.u32); + + attrs[0].id = SAI_PORT_ATTR_INGRESS_PRIORITY_GROUP_LIST; + attrs[0].value.objlist.count = static_cast(pgs.oids.size()); + attrs[0].value.objlist.list = pgs.oids.data(); + + status = m_sairedis->get(SAI_OBJECT_TYPE_PORT, portOids[0], 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + for (size_t i = 0; i < pgs.oids.size(); i++) + { + pgs.attrs[i].id = SAI_INGRESS_PRIORITY_GROUP_ATTR_BUFFER_PROFILE; + pgs.attrs[i].value.oid = buffer_profile; + } + + status = m_sairedis->bulkSet(SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, static_cast(pgs.oids.size()), pgs.oids.data(), + pgs.attrs.data(), SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, pgs.statuses.data()); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + for (size_t i = 0; i < pgs.oids.size(); i++) + { + ASSERT_EQ(pgs.statuses[i], SAI_STATUS_SUCCESS); + } +} + +TEST_F(SyncdBrcmTest, bulkSetInInitViewForUnsupportedObjects) +{ + sai_object_id_t switchId; + sai_attribute_t attrs[1]; + + // init view + + attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD; + attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW; + + auto status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // create switch + + attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH; + attrs[0].value.booldata = true; + + status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // apply view + + attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD; + attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW; + + status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // init view + + attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD; + attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW; + + status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + // create switch + + attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH; + attrs[0].value.booldata = true; + + status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs); + ASSERT_EQ(status, SAI_STATUS_SUCCESS); + + attrs[0].id = SAI_SWITCH_ATTR_UNINIT_DATA_PLANE_ON_REMOVAL; + attrs[0].value.booldata = true; + + sai_object_id_t oids[1] = {switchId}; + sai_status_t statuses[1] = {SAI_STATUS_NOT_EXECUTED}; + + ASSERT_THROW(m_sairedis->bulkSet(SAI_OBJECT_TYPE_SWITCH, 1, oids, attrs, + SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses), std::runtime_error); } \ No newline at end of file From bf049ed21a7c6cf700482957c11ef5b51dc02ff4 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Wed, 5 Feb 2025 13:28:04 +0800 Subject: [PATCH 2/8] Use sonictest pool instead of sonic-common and fix arm64 issue. (#1516) 1. Use sonictest pool instead of sonic-common 2. Fix arm64 build error. --- .azure-pipelines/test-docker-sonic-vs-template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.azure-pipelines/test-docker-sonic-vs-template.yml b/.azure-pipelines/test-docker-sonic-vs-template.yml index 95845a6b..d5f2b7d1 100644 --- a/.azure-pipelines/test-docker-sonic-vs-template.yml +++ b/.azure-pipelines/test-docker-sonic-vs-template.yml @@ -23,7 +23,7 @@ jobs: displayName: vstest timeoutInMinutes: ${{ parameters.timeout }} - pool: sonic-common + pool: sonictest steps: - script: | From f35e743a764b0c65f33743f43da7afa31de0c538 Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Fri, 7 Feb 2025 10:05:17 +0800 Subject: [PATCH 3/8] [nvidia] Skip SAI discovery on ports (#1524) Given that modern systems have lots of ports, performing SAI discovery takes very long time, e.g. (8 sec) for 256 port system. This has a big impact of fast-boot downtime and the discovery itself is not required for Nvidia platform fast-boot. Same applies to Nvidia fastfast-boot (aka warm-boot), yet needs to be tested separately. --- syncd/Makefile.am | 4 ++++ syncd/SaiDiscovery.cpp | 7 +++++++ syncd/Syncd.cpp | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/syncd/Makefile.am b/syncd/Makefile.am index 3c546fb7..1a969e73 100644 --- a/syncd/Makefile.am +++ b/syncd/Makefile.am @@ -82,6 +82,10 @@ if SONIC_ASIC_PLATFORM_BROADCOM libSyncd_a_CXXFLAGS += -DMDIO_ACCESS_USE_NPU endif +if SONIC_ASIC_PLATFORM_MELLANOX +libSyncd_a_CPPFLAGS += -DSKIP_SAI_PORT_DISCOVERY +endif + libSyncdRequestShutdown_a_SOURCES = \ RequestShutdown.cpp \ RequestShutdownCommandLineOptions.cpp \ diff --git a/syncd/SaiDiscovery.cpp b/syncd/SaiDiscovery.cpp index 8615526b..b75f490d 100644 --- a/syncd/SaiDiscovery.cpp +++ b/syncd/SaiDiscovery.cpp @@ -87,6 +87,13 @@ void SaiDiscovery::discover( discovered.insert(rid); } +#ifdef SKIP_SAI_PORT_DISCOVERY + if (ot == SAI_OBJECT_TYPE_PORT) + { + return; + } +#endif + const sai_object_type_info_t *info = sai_metadata_get_object_type_info(ot); /* diff --git a/syncd/Syncd.cpp b/syncd/Syncd.cpp index 7ce3b9bc..09795cf4 100644 --- a/syncd/Syncd.cpp +++ b/syncd/Syncd.cpp @@ -223,6 +223,10 @@ Syncd::Syncd( m_breakConfig = BreakConfigParser::parseBreakConfig(m_commandLineOptions->m_breakConfig); +#ifdef SKIP_SAI_PORT_DISCOVERY + SWSS_LOG_WARN("SAI discovery is skipped on ports"); +#endif + SWSS_LOG_NOTICE("syncd started"); } From 7ae00e53dad5036a0abc446105e9ce6fb7d781eb Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Tue, 11 Feb 2025 07:03:00 +0800 Subject: [PATCH 4/8] Define bulk chunk size and bulk chunk size per counter ID (#1528) Define bulk chunk size and bulk chunk size per counter ID. This is to resolve the VS test failure in #1457, which is caused by loop dependency. In PR #1457, new fields `bulk_chunk_size` and `bulk_chunk_size_per_prefix` have been introduced to `sai_redis_flex_counter_group_parameter_t` whose instances are initialized by orchagent. However, the orchagent is still compiled with the old sairedis header, which prevents both new fields from being uninitialized which in turn fails vs test. We have to split this PR into two: 1. #1519 which updates the header sairedis.h only. the motivation is to compile swss(orchagent) with both new fields initiated. 2. #1457 contains all the rest of code The order to merge: 1. #1519 2. https://github.com/sonic-net/sonic-swss/pull/3391 3. #1457 --- lib/sairedis.h | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/sairedis.h b/lib/sairedis.h index 56a21bd4..3481de3d 100644 --- a/lib/sairedis.h +++ b/lib/sairedis.h @@ -140,6 +140,20 @@ typedef struct _sai_redis_flex_counter_group_parameter_t */ sai_s8_list_t plugins; + /** + * @brief The bulk chunk size of the counter group + * + * It should be a number representing the bulk chunk size. + */ + sai_s8_list_t bulk_chunk_size; + + /** + * @brief The bulk counter prefix map the counter group + * + * It should be a string representing bulk chunk size of each sub counter group. + */ + sai_s8_list_t bulk_chunk_size_per_prefix; + } sai_redis_flex_counter_group_parameter_t; typedef struct _sai_redis_flex_counter_parameter_t From e53489e58b67edacc9b66e1f8187a6fa88611df1 Mon Sep 17 00:00:00 2001 From: Jianyue Wu Date: Wed, 19 Feb 2025 02:17:46 +0800 Subject: [PATCH 5/8] [syncd] Update log level for bulk api (#1532) [syncd] Update log level for bulk api --- syncd/Syncd.cpp | 6 +- unittest/syncd/TestSyncd.cpp | 293 +++++++++++++++++++++++++++++++++++ 2 files changed, 296 insertions(+), 3 deletions(-) diff --git a/syncd/Syncd.cpp b/syncd/Syncd.cpp index 09795cf4..5afb9873 100644 --- a/syncd/Syncd.cpp +++ b/syncd/Syncd.cpp @@ -2019,7 +2019,7 @@ sai_status_t Syncd::processBulkOidCreate( if (status == SAI_STATUS_NOT_IMPLEMENTED || status == SAI_STATUS_NOT_SUPPORTED) { - SWSS_LOG_ERROR("bulkCreate api is not implemented or not supported, object_type = %s", + SWSS_LOG_WARN("bulkCreate api is not implemented or not supported, object_type = %s", sai_serialize_object_type(objectType).c_str()); return status; } @@ -2095,7 +2095,7 @@ sai_status_t Syncd::processBulkOidSet( if (status == SAI_STATUS_NOT_IMPLEMENTED || status == SAI_STATUS_NOT_SUPPORTED) { - SWSS_LOG_ERROR("bulkSet api is not implemented or not supported, object_type = %s", + SWSS_LOG_WARN("bulkSet api is not implemented or not supported, object_type = %s", sai_serialize_object_type(objectType).c_str()); } @@ -2143,7 +2143,7 @@ sai_status_t Syncd::processBulkOidRemove( if (status == SAI_STATUS_NOT_IMPLEMENTED || status == SAI_STATUS_NOT_SUPPORTED) { - SWSS_LOG_ERROR("bulkRemove api is not implemented or not supported, object_type = %s", + SWSS_LOG_WARN("bulkRemove api is not implemented or not supported, object_type = %s", sai_serialize_object_type(objectType).c_str()); return status; } diff --git a/unittest/syncd/TestSyncd.cpp b/unittest/syncd/TestSyncd.cpp index 9816aa91..eb876e26 100644 --- a/unittest/syncd/TestSyncd.cpp +++ b/unittest/syncd/TestSyncd.cpp @@ -21,6 +21,7 @@ using namespace syncd; using namespace saivs; +using namespace testing; static void syncd_thread( _In_ std::shared_ptr syncd) @@ -230,17 +231,39 @@ void clearDB() r.checkStatusOK(); } +class MockSaiSwitch : public SaiSwitch { +public: + MockSaiSwitch(sai_object_id_t switchVid, sai_object_id_t switchRid, + std::shared_ptr client, + std::shared_ptr translator, + std::shared_ptr sai, bool warmBoot) + : SaiSwitch(switchVid, switchRid, client, translator, sai, warmBoot) {} + MOCK_METHOD(void, postPortRemove, (sai_object_id_t portRid), (override)); + MOCK_METHOD(void, removeExistingObjectReference, (sai_object_id_t rid), (override)); + MOCK_METHOD(void, eraseRidAndVid, (sai_object_id_t rid, sai_object_id_t vid)); +}; + class SyncdTest : public ::testing::Test { protected: void SetUp() override { + m_sai = std::make_shared(); + m_opt = std::make_shared(); + m_syncd = std::make_shared(m_sai, m_opt, false); + + m_opt->m_enableTempView = true; + m_opt->m_startType = SAI_START_TYPE_FASTFAST_BOOT; clearDB(); } void TearDown() override { clearDB(); } + + std::shared_ptr m_sai; + std::shared_ptr m_opt; + std::shared_ptr m_syncd; }; TEST_F(SyncdTest, processNotifySyncd) @@ -259,4 +282,274 @@ TEST_F(SyncdTest, processNotifySyncd) })); syncd_object.processEvent(consumer); } + +TEST_F(SyncdTest, BulkCreateTest) +{ + m_opt->m_enableSaiBulkSupport = true; + sai_object_id_t switchVid = 0x21000000000000; + sai_object_id_t switchRid = 0x11000000000001; + sai_object_id_t portVid = 0x10000000000002; + sai_object_id_t portRid = 0x11000000000002; + auto translator = m_syncd->m_translator; + translator->insertRidAndVid(switchRid, switchVid); + translator->insertRidAndVid(portRid, portVid); + std::vector lanes = {52, 53}; + m_syncd->m_client->setPortLanes(switchVid, portRid, lanes); + m_sai->mock_objectTypeQuery = [switchRid, portRid](sai_object_id_t oid) { + sai_object_type_t ot = SAI_OBJECT_TYPE_NULL; + if (oid == switchRid) + ot = SAI_OBJECT_TYPE_SWITCH; + else if (oid == portRid) + ot = SAI_OBJECT_TYPE_PORT; + else + ot = SAI_OBJECT_TYPE_QUEUE; + return ot; + }; + m_sai->mock_switchIdQuery = [switchVid](sai_object_id_t oid) { + return switchVid; + }; + m_sai->mock_get = [switchRid, portVid, portRid](sai_object_type_t objectType, sai_object_id_t objectId, uint32_t attrCount, sai_attribute_t* attrList) -> sai_status_t { + if (attrCount != 1) { + return SAI_STATUS_INVALID_PARAMETER; + } + if (attrList[0].id == SAI_SWITCH_ATTR_PORT_LIST) { + if (objectType == SAI_OBJECT_TYPE_SWITCH && objectId == switchRid) { + attrList[0].value.objlist.count = 1; + attrList[0].value.objlist.list[0] = portRid; + return SAI_STATUS_SUCCESS; + } + return SAI_STATUS_INVALID_PARAMETER; + } + if (attrList[0].id == SAI_SWITCH_ATTR_PORT_NUMBER) { + attrList[0].value.u32 = 1; + return SAI_STATUS_SUCCESS; + } + if (objectType == SAI_OBJECT_TYPE_PORT) { + if (attrList[0].id == SAI_PORT_ATTR_HW_LANE_LIST) { + if (objectId == portRid) { + if (attrList[0].value.u32list.list != nullptr) { + attrList[0].value.u32list.count = 2; + static uint32_t hw_lanes[2] = {52, 53}; + memcpy(attrList[0].value.u32list.list, hw_lanes, sizeof(uint32_t) * 2); + } else { + return SAI_STATUS_BUFFER_OVERFLOW; + } + } + } + if (attrList[0].id == SAI_PORT_ATTR_PORT_SERDES_ID) { + attrList[0].value.oid = SAI_NULL_OBJECT_ID; + return SAI_STATUS_SUCCESS; + } + return SAI_STATUS_SUCCESS; + } + if (attrList[0].id == SAI_SWITCH_ATTR_SRC_MAC_ADDRESS) { + if (objectType == SAI_OBJECT_TYPE_SWITCH && objectId == switchRid) { + static sai_mac_t mac = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55}; + memcpy(attrList[0].value.mac, mac, sizeof(sai_mac_t)); + return SAI_STATUS_SUCCESS; + } + return SAI_STATUS_INVALID_PARAMETER; + } + return SAI_STATUS_NOT_SUPPORTED; + }; + // Create a mock switch and set expectations + auto mockSwitch = std::make_shared(switchVid, switchRid, m_syncd->m_client, translator, m_sai, false); + m_syncd->m_switches[switchVid] = mockSwitch; + EXPECT_CALL(*mockSwitch, postPortRemove(testing::_)) + .WillRepeatedly(testing::Invoke([](sai_object_id_t rid) { + })); + EXPECT_CALL(*mockSwitch, removeExistingObjectReference(testing::_)) + .WillRepeatedly(testing::Invoke([](sai_object_id_t rid) { + })); + EXPECT_CALL(*mockSwitch, eraseRidAndVid(testing::_, testing::_)) + .WillRepeatedly(testing::Invoke([](sai_object_id_t rid, sai_object_id_t vid) { + })); + swss::KeyOpFieldsValuesTuple kco; + std::string key = "SAI_OBJECT_TYPE_PORT:bulk:1"; + std::string op = "bulkcreate"; + std::vector values = { + {"oid:0x10000000000002", "SAI_PORT_ATTR_ADMIN_STATE=true"} + }; + kco = std::make_tuple(key, op, values); + auto channel = std::make_shared(); + int popCallCount = 0; + EXPECT_CALL(*channel, empty()) + .WillRepeatedly([&popCallCount]() { + return popCallCount > 0; // Return true after the first pop call + }); + EXPECT_CALL(*channel, pop(testing::_, testing::_)) + .Times(testing::AnyNumber()) + .WillRepeatedly(testing::DoAll( + testing::SetArgReferee<0>(kco), + testing::Invoke([&popCallCount](swss::KeyOpFieldsValuesTuple&, bool) { + popCallCount++; + }) + )); + m_sai->mock_bulkCreate = []( + sai_object_type_t, + sai_object_id_t, + uint32_t, + const uint32_t*, + const sai_attribute_t**, + sai_bulk_op_error_mode_t, + sai_object_id_t*, + sai_status_t*) -> sai_status_t { + return SAI_STATUS_NOT_IMPLEMENTED; + }; + m_syncd->processEvent(*channel); +} + +TEST_F(SyncdTest, BulkSetTest) +{ + m_opt->m_enableSaiBulkSupport = true; + auto translator = m_syncd->m_translator; + translator->insertRidAndVid(0x11000000000001, 0x21000000000000); // Switch + translator->insertRidAndVid(0x1100000000000d, 0x1000000000000d); // Port 1 + translator->insertRidAndVid(0x1100000000000e, 0x1000000000000e); // Port 2 + swss::KeyOpFieldsValuesTuple kco; + std::string key = "SAI_OBJECT_TYPE_PORT:bulk:1"; + std::string op = "bulkset"; + std::vector values = { + {"oid:0x1000000000000d", "SAI_PORT_ATTR_ADMIN_STATE=true"}, + {"oid:0x1000000000000e", "SAI_PORT_ATTR_ADMIN_STATE=false"} + }; + kco = std::make_tuple(key, op, values); + auto channel = std::make_shared(); + EXPECT_CALL(*channel, empty()) + .WillOnce(testing::Return(false)) + .WillRepeatedly(testing::Return(true)); + EXPECT_CALL(*channel, pop(testing::_, testing::_)) + .Times(testing::AnyNumber()) + .WillRepeatedly(testing::DoAll( + testing::SetArgReferee<0>(kco), + testing::Return() + )); + m_sai->mock_bulkSet = []( + sai_object_type_t, + uint32_t, + const sai_object_id_t*, + const sai_attribute_t*, + sai_bulk_op_error_mode_t, + sai_status_t*) -> sai_status_t { + return SAI_STATUS_NOT_IMPLEMENTED; + }; + m_syncd->processEvent(*channel); +} + +TEST_F(SyncdTest, BulkRemoveTest) +{ + m_opt->m_enableSaiBulkSupport = true; + sai_object_id_t switchVid = 0x21000000000000; + sai_object_id_t switchRid = 0x11000000000001; + sai_object_id_t portVid = 0x10000000000002; + sai_object_id_t portRid = 0x11000000000002; + auto translator = m_syncd->m_translator; + translator->insertRidAndVid(switchRid, switchVid); + translator->insertRidAndVid(portRid, portVid); + std::vector lanes = {52, 53}; + m_syncd->m_client->setPortLanes(switchVid, portRid, lanes); + std::set removedRids; + m_sai->mock_objectTypeQuery = [switchRid, portRid, &removedRids](sai_object_id_t oid) { + sai_object_type_t ot = SAI_OBJECT_TYPE_NULL; + if (removedRids.find(oid) != removedRids.end()) { + return SAI_OBJECT_TYPE_NULL; + } + if (oid == switchRid) + ot = SAI_OBJECT_TYPE_SWITCH; + else if (oid == portRid) + ot = SAI_OBJECT_TYPE_PORT; + else + ot = SAI_OBJECT_TYPE_QUEUE; + return ot; + }; + m_sai->mock_switchIdQuery = [switchVid](sai_object_id_t oid) { + return switchVid; + }; + m_sai->mock_get = [switchRid, portVid, portRid](sai_object_type_t objectType, sai_object_id_t objectId, uint32_t attrCount, sai_attribute_t* attrList) -> sai_status_t { + if (attrCount != 1) { + return SAI_STATUS_INVALID_PARAMETER; + } + if (attrList[0].id == SAI_SWITCH_ATTR_PORT_LIST) { + if (objectType == SAI_OBJECT_TYPE_SWITCH && objectId == switchRid) { + attrList[0].value.objlist.count = 1; + attrList[0].value.objlist.list[0] = portRid; + return SAI_STATUS_SUCCESS; + } + return SAI_STATUS_INVALID_PARAMETER; + } + if (attrList[0].id == SAI_SWITCH_ATTR_PORT_NUMBER) { + attrList[0].value.u32 = 1; + return SAI_STATUS_SUCCESS; + } + if (objectType == SAI_OBJECT_TYPE_PORT) { + if (attrList[0].id == SAI_PORT_ATTR_HW_LANE_LIST) { + if (objectId == portRid) { + if (attrList[0].value.u32list.list != nullptr) { + attrList[0].value.u32list.count = 2; + static uint32_t hw_lanes[2] = {52, 53}; + memcpy(attrList[0].value.u32list.list, hw_lanes, sizeof(uint32_t) * 2); + } else { + return SAI_STATUS_BUFFER_OVERFLOW; + } + } + } + if (attrList[0].id == SAI_PORT_ATTR_PORT_SERDES_ID) { + attrList[0].value.oid = SAI_NULL_OBJECT_ID; + return SAI_STATUS_SUCCESS; + } + return SAI_STATUS_SUCCESS; + } + if (attrList[0].id == SAI_SWITCH_ATTR_SRC_MAC_ADDRESS) { + if (objectType == SAI_OBJECT_TYPE_SWITCH && objectId == switchRid) { + static sai_mac_t mac = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55}; + memcpy(attrList[0].value.mac, mac, sizeof(sai_mac_t)); + return SAI_STATUS_SUCCESS; + } + return SAI_STATUS_INVALID_PARAMETER; + } + return SAI_STATUS_NOT_SUPPORTED; + }; + // Create a mock switch and set expectations + auto mockSwitch = std::make_shared(switchVid, switchRid, m_syncd->m_client, translator, m_sai, false); + m_syncd->m_switches[switchVid] = mockSwitch; + EXPECT_CALL(*mockSwitch, postPortRemove(testing::_)) + .WillRepeatedly(testing::Invoke([](sai_object_id_t rid) { + })); + EXPECT_CALL(*mockSwitch, removeExistingObjectReference(testing::_)) + .WillRepeatedly(testing::Invoke([](sai_object_id_t rid) { + })); + EXPECT_CALL(*mockSwitch, eraseRidAndVid(testing::_, testing::_)) + .WillRepeatedly(testing::Invoke([](sai_object_id_t rid, sai_object_id_t vid) { + })); + swss::KeyOpFieldsValuesTuple kco; + std::string key = "SAI_OBJECT_TYPE_PORT:bulk:1"; + std::string op = "bulkremove"; + std::vector values = { + {"oid:0x10000000000002", "SAI_PORT_ATTR_ADMIN_STATE=true"} + }; + kco = std::make_tuple(key, op, values); + auto channel = std::make_shared(); + int popCallCount = 0; + EXPECT_CALL(*channel, empty()) + .WillRepeatedly([&popCallCount]() { + return popCallCount > 0; // Return true after the first pop call + }); + EXPECT_CALL(*channel, pop(testing::_, testing::_)) + .Times(testing::AnyNumber()) + .WillRepeatedly(testing::DoAll( + testing::SetArgReferee<0>(kco), + testing::Invoke([&popCallCount](swss::KeyOpFieldsValuesTuple&, bool) { + popCallCount++; + }) + )); + m_sai->mock_bulkRemove = []( + sai_object_type_t, + uint32_t, + const sai_object_id_t*, + sai_bulk_op_error_mode_t, + sai_status_t*) -> sai_status_t { + return SAI_STATUS_NOT_IMPLEMENTED; + }; + m_syncd->processEvent(*channel); +} #endif From 6b263b8e65034f7c3ce6e177f54fa380d5ef2fcc Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Wed, 19 Feb 2025 07:02:10 +0800 Subject: [PATCH 6/8] [FC] Support Policer Counter (#1533) Added the implantation for policer counter - Support in POLICER group and sai_serialize functions Unit Tests: Included unit tests to add and remove policer counter. --- meta/SaiSerialize.cpp | 8 +++++++ meta/sai_serialize.h | 3 +++ syncd/FlexCounter.cpp | 37 ++++++++++++++++++++++++++++++ unittest/syncd/TestFlexCounter.cpp | 12 ++++++++++ 4 files changed, 60 insertions(+) diff --git a/meta/SaiSerialize.cpp b/meta/SaiSerialize.cpp index 0916cac0..d2743820 100644 --- a/meta/SaiSerialize.cpp +++ b/meta/SaiSerialize.cpp @@ -1106,6 +1106,14 @@ std::string sai_serialize_counter_stat( return sai_serialize_enum(counter, &sai_metadata_enum_sai_counter_stat_t); } +std::string sai_serialize_policer_stat( + _In_ const sai_policer_stat_t counter) +{ + SWSS_LOG_ENTER(); + + return sai_serialize_enum(counter, &sai_metadata_enum_sai_policer_stat_t); +} + std::string sai_serialize_queue_attr( _In_ const sai_queue_attr_t attr) { diff --git a/meta/sai_serialize.h b/meta/sai_serialize.h index 0ef79e9c..5e9c95e7 100644 --- a/meta/sai_serialize.h +++ b/meta/sai_serialize.h @@ -140,6 +140,9 @@ std::string sai_serialize_tunnel_stat( std::string sai_serialize_counter_stat( _In_ const sai_counter_stat_t counter); +std::string sai_serialize_policer_stat( + _In_ const sai_policer_stat_t counter); + std::string sai_serialize_queue_attr( _In_ const sai_queue_attr_t attr); diff --git a/syncd/FlexCounter.cpp b/syncd/FlexCounter.cpp index 4844b7b4..bbf1f2d9 100644 --- a/syncd/FlexCounter.cpp +++ b/syncd/FlexCounter.cpp @@ -28,6 +28,7 @@ static const std::string COUNTER_TYPE_TUNNEL = "Tunnel Counter"; static const std::string COUNTER_TYPE_BUFFER_POOL = "Buffer Pool Counter"; static const std::string COUNTER_TYPE_ENI = "DASH ENI Counter"; static const std::string COUNTER_TYPE_METER_BUCKET = "DASH Meter Bucket Counter"; +static const std::string COUNTER_TYPE_POLICER = "Policer Counter"; static const std::string ATTR_TYPE_QUEUE = "Queue Attribute"; static const std::string ATTR_TYPE_PG = "Priority Group Attribute"; static const std::string ATTR_TYPE_MACSEC_SA = "MACSEC SA Attribute"; @@ -164,6 +165,14 @@ std::string serializeStat( return sai_serialize_port_stat(stat); } +template <> +std::string serializeStat( + _In_ const sai_policer_stat_t stat) +{ + SWSS_LOG_ENTER(); + return sai_serialize_policer_stat(stat); +} + template <> std::string serializeStat( _In_ const sai_queue_stat_t stat) @@ -270,6 +279,15 @@ void deserializeStat( sai_deserialize_port_stat(name, stat); } +template <> +void deserializeStat( + _In_ const char* name, + _Out_ sai_policer_stat_t *stat) +{ + SWSS_LOG_ENTER(); + sai_deserialize_policer_stat(name, stat); +} + template <> void deserializeStat( _In_ const char* name, @@ -1714,6 +1732,10 @@ std::shared_ptr FlexCounter::createCounterContext( { return std::make_shared>(context_name, SAI_OBJECT_TYPE_ACL_COUNTER, m_vendorSai.get(), m_statsMode); } + else if (context_name == COUNTER_TYPE_POLICER) + { + return std::make_shared>(context_name, SAI_OBJECT_TYPE_POLICER, m_vendorSai.get(), m_statsMode); + } SWSS_LOG_THROW("Invalid counter type %s", context_name.c_str()); // GCC 8.3 requires a return value here @@ -1992,6 +2014,13 @@ void FlexCounter::removeCounter( removeDataFromCountersDB(vid, ":TRAP"); } } + else if (objectType == SAI_OBJECT_TYPE_POLICER) + { + if (hasCounterContext(COUNTER_TYPE_POLICER)) + { + getCounterContext(COUNTER_TYPE_POLICER)->removeObject(vid); + } + } else { SWSS_LOG_ERROR("Object type for removal not supported, %s", @@ -2126,6 +2155,14 @@ void FlexCounter::addCounter( idStrings, ""); } + else if (objectType == SAI_OBJECT_TYPE_POLICER && field == POLICER_COUNTER_ID_LIST) + { + getCounterContext(COUNTER_TYPE_POLICER)->addObject( + vid, + rid, + idStrings, + ""); + } else if (objectType == SAI_OBJECT_TYPE_BUFFER_POOL && field == BUFFER_POOL_COUNTER_ID_LIST) { counterIds = idStrings; diff --git a/unittest/syncd/TestFlexCounter.cpp b/unittest/syncd/TestFlexCounter.cpp index e5d374e1..cdcc1d20 100644 --- a/unittest/syncd/TestFlexCounter.cpp +++ b/unittest/syncd/TestFlexCounter.cpp @@ -745,6 +745,18 @@ TEST(FlexCounter, bulkCounter) {"10", "20"}, counterVerifyFunc, false); + + testAddRemoveCounter( + 2, + SAI_OBJECT_TYPE_POLICER, + POLICER_COUNTER_ID_LIST, + {"SAI_POLICER_STAT_PACKETS", "SAI_POLICER_STAT_ATTR_BYTES", + "SAI_POLICER_STAT_GREEN_PACKETS", "SAI_POLICER_STAT_GREEN_BYTES", + "SAI_POLICER_STAT_YELLOW_PACKETS", "SAI_POLICER_STAT_YELLOW_BYTES", + "SAI_POLICER_STAT_RED_PACKETS", "SAI_POLICER_STAT_RED_BYTES"}, + {"100", "200", "300", "400", "500", "600", "700", "800"}, + counterVerifyFunc, + false); // buffer pool stats does not support bulk EXPECT_EQ(false, clearCalled); } From ec8b3c30b51dbced764d15d0e751d4467a204a2f Mon Sep 17 00:00:00 2001 From: mssonicbld <79238446+mssonicbld@users.noreply.github.com> Date: Wed, 19 Feb 2025 19:02:35 +0800 Subject: [PATCH 7/8] Fix pipeline errors related to rsyslogd and libswsscommon installation (#1535) On arm64 (and maybe sometimes amd64), rsyslogd appears to need a second or two to actually fully exit. The current code expects it to exit practically instantly. Add a sleep of 2 seconds to give it some time. Also enable some logging so that the commands being run can be seen. Also, fix an error related to libswsscommon not getting installed due to new dependencies being added. Solve this by using apt install to install the package, which brings in any necessary dependencies. --- .azure-pipelines/build-template.yml | 5 +++++ .azure-pipelines/test-docker-sonic-vs-template.yml | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/.azure-pipelines/build-template.yml b/.azure-pipelines/build-template.yml index e8d855aa..a4c738bb 100644 --- a/.azure-pipelines/build-template.yml +++ b/.azure-pipelines/build-template.yml @@ -164,8 +164,13 @@ jobs: mv ../*.deb . displayName: "Compile sonic sairedis with coverage enabled" - script: | + set -ex sudo cp azsyslog.conf /etc/rsyslog.conf + cat /run/rsyslogd.pid sudo pkill -F /run/rsyslogd.pid + # Looks like arm64 (and sometimes amd64) rsyslogd needs some time to exit + sleep 2 + ps -ef sudo rsyslogd displayName: "Update rsyslog.conf" - ${{ if eq(parameters.run_unit_test, true) }}: diff --git a/.azure-pipelines/test-docker-sonic-vs-template.yml b/.azure-pipelines/test-docker-sonic-vs-template.yml index d5f2b7d1..e5cd1435 100644 --- a/.azure-pipelines/test-docker-sonic-vs-template.yml +++ b/.azure-pipelines/test-docker-sonic-vs-template.yml @@ -27,7 +27,9 @@ jobs: steps: - script: | + set -ex ls -A1 | xargs -I{} sudo rm -rf {} + sudo apt-get purge libswsscommon python3-swsscommon || true displayName: "Clean workspace" - checkout: self clean: true @@ -73,10 +75,8 @@ jobs: sudo apt-get update sudo apt-get install -y libhiredis0.14 libyang0.16 - sudo dpkg -i $(Build.ArtifactStagingDirectory)/download/libprotobuf*_amd64.deb $(Build.ArtifactStagingDirectory)/download/libprotobuf-lite*_amd64.deb $(Build.ArtifactStagingDirectory)/download/python3-protobuf*_amd64.deb - sudo dpkg -i $(Build.ArtifactStagingDirectory)/download/libdashapi*.deb - sudo dpkg -i --force-confask,confnew $(Build.ArtifactStagingDirectory)/download/libswsscommon_1.0.0_amd64.deb || apt-get install -f - sudo dpkg -i $(Build.ArtifactStagingDirectory)/download/python3-swsscommon_1.0.0_amd64.deb + sudo apt install -y $(Build.ArtifactStagingDirectory)/download/libprotobuf*_amd64.deb $(Build.ArtifactStagingDirectory)/download/libprotobuf-lite*_amd64.deb $(Build.ArtifactStagingDirectory)/download/python3-protobuf*_amd64.deb + sudo apt install -y $(Build.ArtifactStagingDirectory)/download/libdashapi*.deb $(Build.ArtifactStagingDirectory)/download/libswsscommon_1.0.0_amd64.deb $(Build.ArtifactStagingDirectory)/download/python3-swsscommon_1.0.0_amd64.deb # install packages for vs test sudo apt-get install -y net-tools bridge-utils vlan From d884ff9a950b93603ab5ade206def2e0e351febb Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Fri, 21 Feb 2025 01:09:55 +0100 Subject: [PATCH 8/8] [syncd] Move logSet logGet under mutex to prevent race condition (#1520) (#1538) [syncd] Move logSet logGet under mutex to prevent race condition --- .azure-pipelines/test-docker-sonic-vs-template.yml | 1 + syncd/VendorSai.cpp | 2 ++ unittest/syncd/TestVendorSai.cpp | 11 +++++++++++ 3 files changed, 14 insertions(+) diff --git a/.azure-pipelines/test-docker-sonic-vs-template.yml b/.azure-pipelines/test-docker-sonic-vs-template.yml index e5cd1435..b5b01bea 100644 --- a/.azure-pipelines/test-docker-sonic-vs-template.yml +++ b/.azure-pipelines/test-docker-sonic-vs-template.yml @@ -74,6 +74,7 @@ jobs: sudo sonic-sairedis/.azure-pipelines/build_and_install_module.sh sudo apt-get update + sudo apt --fix-broken install sudo apt-get install -y libhiredis0.14 libyang0.16 sudo apt install -y $(Build.ArtifactStagingDirectory)/download/libprotobuf*_amd64.deb $(Build.ArtifactStagingDirectory)/download/libprotobuf-lite*_amd64.deb $(Build.ArtifactStagingDirectory)/download/python3-protobuf*_amd64.deb sudo apt install -y $(Build.ArtifactStagingDirectory)/download/libdashapi*.deb $(Build.ArtifactStagingDirectory)/download/libswsscommon_1.0.0_amd64.deb $(Build.ArtifactStagingDirectory)/download/python3-swsscommon_1.0.0_amd64.deb diff --git a/syncd/VendorSai.cpp b/syncd/VendorSai.cpp index 68b64f07..f2fe232b 100644 --- a/syncd/VendorSai.cpp +++ b/syncd/VendorSai.cpp @@ -1885,6 +1885,7 @@ sai_status_t VendorSai::logSet( _In_ sai_api_t api, _In_ sai_log_level_t log_level) { + MUTEX(); SWSS_LOG_ENTER(); m_logLevelMap[api] = log_level; @@ -1903,6 +1904,7 @@ sai_status_t VendorSai::queryApiVersion( sai_log_level_t VendorSai::logGet( _In_ sai_api_t api) { + MUTEX(); SWSS_LOG_ENTER(); auto it = m_logLevelMap.find(api); diff --git a/unittest/syncd/TestVendorSai.cpp b/unittest/syncd/TestVendorSai.cpp index 63977e71..f237bc00 100644 --- a/unittest/syncd/TestVendorSai.cpp +++ b/unittest/syncd/TestVendorSai.cpp @@ -1543,3 +1543,14 @@ TEST(VendorSai, bulk_meter_rules) EXPECT_EQ(SAI_STATUS_SUCCESS, sai.remove((sai_object_type_t)SAI_OBJECT_TYPE_METER_POLICY, meter_policy0)); EXPECT_EQ(SAI_STATUS_SUCCESS, sai.remove((sai_object_type_t)SAI_OBJECT_TYPE_METER_POLICY, meter_policy1)); } + +TEST(VendorSai, logSet_logGet) +{ + VendorSai sai; + sai.apiInitialize(0, &test_services); + + EXPECT_EQ(SAI_STATUS_SUCCESS, sai.logSet(SAI_API_PORT, SAI_LOG_LEVEL_DEBUG)); + + EXPECT_EQ(SAI_LOG_LEVEL_DEBUG, sai.logGet(SAI_API_PORT)); + EXPECT_EQ(SAI_LOG_LEVEL_NOTICE, sai.logGet(SAI_API_SWITCH)); +}