Skip to content

Commit ffe371d

Browse files
authored
[syncd] Support bulk set in INIT_VIEW mode (sonic-net#1517)
Support bulk set in INIT_VIEW mode.
1 parent b39b9a6 commit ffe371d

File tree

2 files changed

+325
-1
lines changed

2 files changed

+325
-1
lines changed

syncd/Syncd.cpp

+21-1
Original file line numberDiff line numberDiff line change
@@ -921,7 +921,6 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode(
921921
{
922922
case SAI_COMMON_API_BULK_CREATE:
923923
case SAI_COMMON_API_BULK_REMOVE:
924-
case SAI_COMMON_API_BULK_SET:
925924

926925
if (info->isnonobjectid)
927926
{
@@ -961,6 +960,27 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode(
961960
return SAI_STATUS_SUCCESS;
962961
}
963962

963+
case SAI_COMMON_API_BULK_SET:
964+
965+
switch (objectType)
966+
{
967+
case SAI_OBJECT_TYPE_SWITCH:
968+
case SAI_OBJECT_TYPE_SCHEDULER_GROUP:
969+
970+
SWSS_LOG_THROW("%s is not supported in init view mode",
971+
sai_serialize_object_type(objectType).c_str());
972+
973+
default:
974+
975+
break;
976+
}
977+
978+
sendApiResponse(api, SAI_STATUS_SUCCESS, (uint32_t)statuses.size(), statuses.data());
979+
980+
syncUpdateRedisBulkQuadEvent(api, statuses, objectType, objectIds, strAttributes);
981+
982+
return SAI_STATUS_SUCCESS;
983+
964984
case SAI_COMMON_API_BULK_GET:
965985
SWSS_LOG_THROW("GET bulk api is not implemented in init view mode, FIXME");
966986

syncd/tests/TestSyncdBrcm.cpp

+304
Original file line numberDiff line numberDiff line change
@@ -683,4 +683,308 @@ TEST_F(SyncdBrcmTest, portBufferBulkSet)
683683

684684
status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
685685
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
686+
}
687+
688+
TEST_F(SyncdBrcmTest, portBulkSetInInitView)
689+
{
690+
sai_object_id_t switchId;
691+
sai_attribute_t attrs[1];
692+
693+
struct
694+
{
695+
std::vector<sai_object_id_t> oids;
696+
std::vector<sai_attribute_t> attrs;
697+
std::vector<sai_status_t> statuses;
698+
699+
void resize(size_t size)
700+
{
701+
SWSS_LOG_ENTER();
702+
703+
oids.resize(size);
704+
attrs.resize(size);
705+
statuses.resize(size, SAI_STATUS_NOT_EXECUTED);
706+
}
707+
} ports;
708+
709+
// init view
710+
711+
attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
712+
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
713+
714+
auto status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
715+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
716+
717+
// create switch
718+
719+
attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
720+
attrs[0].value.booldata = true;
721+
722+
status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
723+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
724+
725+
// apply view
726+
727+
attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
728+
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW;
729+
730+
status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
731+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
732+
733+
// init view
734+
735+
attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
736+
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
737+
738+
status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
739+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
740+
741+
// create switch
742+
743+
attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
744+
attrs[0].value.booldata = true;
745+
746+
status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
747+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
748+
749+
attrs[0].id = SAI_SWITCH_ATTR_PORT_NUMBER;
750+
status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs);
751+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
752+
753+
ports.resize(attrs[0].value.u32);
754+
755+
ASSERT_TRUE(ports.oids.size() > 1);
756+
757+
attrs[0].id = SAI_SWITCH_ATTR_PORT_LIST;
758+
attrs[0].value.objlist.count = static_cast<uint32_t>(ports.oids.size());
759+
attrs[0].value.objlist.list = ports.oids.data();
760+
status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs);
761+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
762+
763+
// Set port admin status in bulk
764+
765+
for (size_t i = 0; i < ports.oids.size(); i++)
766+
{
767+
ports.attrs[i].id = SAI_PORT_ATTR_ADMIN_STATE;
768+
ports.attrs[i].value.booldata = true;
769+
}
770+
771+
status = m_sairedis->bulkSet(SAI_OBJECT_TYPE_PORT, static_cast<uint32_t>(ports.oids.size()), ports.oids.data(),
772+
ports.attrs.data(), SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, ports.statuses.data());
773+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
774+
775+
for (size_t i = 0; i < ports.oids.size(); i++)
776+
{
777+
ASSERT_EQ(ports.statuses[i], SAI_STATUS_SUCCESS);
778+
}
779+
}
780+
781+
TEST_F(SyncdBrcmTest, pgBulkSetInInitView)
782+
{
783+
sai_object_id_t switchId;
784+
sai_attribute_t attrs[1];
785+
786+
std::vector<sai_object_id_t> portOids;
787+
788+
struct
789+
{
790+
std::vector<sai_object_id_t> oids;
791+
std::vector<sai_attribute_t> attrs;
792+
std::vector<sai_status_t> statuses;
793+
794+
void resize(size_t size)
795+
{
796+
SWSS_LOG_ENTER();
797+
798+
oids.resize(size);
799+
attrs.resize(size);
800+
statuses.resize(size, SAI_STATUS_NOT_EXECUTED);
801+
}
802+
} pgs;
803+
804+
// init view
805+
806+
attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
807+
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
808+
809+
auto status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
810+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
811+
812+
// create switch
813+
814+
attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
815+
attrs[0].value.booldata = true;
816+
817+
status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
818+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
819+
820+
// apply view
821+
822+
attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
823+
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW;
824+
825+
status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
826+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
827+
828+
// init view
829+
830+
attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
831+
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
832+
833+
status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
834+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
835+
836+
// create switch
837+
838+
attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
839+
attrs[0].value.booldata = true;
840+
841+
status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
842+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
843+
844+
attrs[0].id = SAI_SWITCH_ATTR_PORT_NUMBER;
845+
status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs);
846+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
847+
848+
portOids.resize(attrs[0].value.u32);
849+
850+
ASSERT_TRUE(portOids.size() > 1);
851+
852+
attrs[0].id = SAI_SWITCH_ATTR_PORT_LIST;
853+
attrs[0].value.objlist.count = static_cast<uint32_t>(portOids.size());
854+
attrs[0].value.objlist.list = portOids.data();
855+
status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs);
856+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
857+
858+
attrs[0].id = SAI_SWITCH_ATTR_PORT_LIST;
859+
attrs[0].value.objlist.count = static_cast<uint32_t>(portOids.size());
860+
attrs[0].value.objlist.list = portOids.data();
861+
status = m_sairedis->get(SAI_OBJECT_TYPE_SWITCH, switchId, 1, attrs);
862+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
863+
864+
// Create buffer pool
865+
866+
std::array<sai_attribute_t, 4> buffer_pool_attrs;
867+
sai_object_id_t buffer_pool;
868+
869+
buffer_pool_attrs[0].id = SAI_BUFFER_POOL_ATTR_THRESHOLD_MODE;
870+
buffer_pool_attrs[0].value.u32 = SAI_BUFFER_POOL_THRESHOLD_MODE_DYNAMIC;
871+
872+
buffer_pool_attrs[1].id = SAI_BUFFER_POOL_ATTR_SIZE;
873+
buffer_pool_attrs[1].value.u32 = 47218432;
874+
875+
buffer_pool_attrs[2].id = SAI_BUFFER_POOL_ATTR_TYPE;
876+
buffer_pool_attrs[2].value.u32 = SAI_BUFFER_POOL_TYPE_INGRESS;
877+
878+
buffer_pool_attrs[3].id = SAI_BUFFER_POOL_ATTR_XOFF_SIZE;
879+
buffer_pool_attrs[3].value.u32 = 17708800;
880+
881+
status = m_sairedis->create(SAI_OBJECT_TYPE_BUFFER_POOL, &buffer_pool, switchId,
882+
static_cast<uint32_t>(buffer_pool_attrs.size()), buffer_pool_attrs.data());
883+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
884+
885+
// Create buffer profile
886+
887+
std::array<sai_attribute_t, 4> buffer_profile_attrs;
888+
sai_object_id_t buffer_profile;
889+
890+
buffer_profile_attrs[0].id = SAI_BUFFER_PROFILE_ATTR_POOL_ID;
891+
buffer_profile_attrs[0].value.oid = buffer_pool;
892+
893+
buffer_profile_attrs[1].id = SAI_BUFFER_PROFILE_ATTR_THRESHOLD_MODE;
894+
buffer_profile_attrs[1].value.u32 = SAI_BUFFER_PROFILE_THRESHOLD_MODE_DYNAMIC;
895+
896+
buffer_profile_attrs[2].id = SAI_BUFFER_PROFILE_ATTR_SHARED_DYNAMIC_TH;
897+
buffer_profile_attrs[2].value.s8 = -8;
898+
899+
buffer_profile_attrs[3].id = SAI_BUFFER_PROFILE_ATTR_RESERVED_BUFFER_SIZE;
900+
buffer_profile_attrs[3].value.u64 = 6755399441055744;
901+
902+
status = m_sairedis->create(SAI_OBJECT_TYPE_BUFFER_PROFILE, &buffer_profile, switchId,
903+
static_cast<uint32_t>(buffer_profile_attrs.size()), buffer_profile_attrs.data());
904+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
905+
906+
// Priority group configuration
907+
908+
attrs[0].id = SAI_PORT_ATTR_NUMBER_OF_INGRESS_PRIORITY_GROUPS;
909+
status = m_sairedis->get(SAI_OBJECT_TYPE_PORT, portOids[0], 1, attrs);
910+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
911+
912+
pgs.resize(attrs[0].value.u32);
913+
914+
attrs[0].id = SAI_PORT_ATTR_INGRESS_PRIORITY_GROUP_LIST;
915+
attrs[0].value.objlist.count = static_cast<uint32_t>(pgs.oids.size());
916+
attrs[0].value.objlist.list = pgs.oids.data();
917+
918+
status = m_sairedis->get(SAI_OBJECT_TYPE_PORT, portOids[0], 1, attrs);
919+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
920+
921+
for (size_t i = 0; i < pgs.oids.size(); i++)
922+
{
923+
pgs.attrs[i].id = SAI_INGRESS_PRIORITY_GROUP_ATTR_BUFFER_PROFILE;
924+
pgs.attrs[i].value.oid = buffer_profile;
925+
}
926+
927+
status = m_sairedis->bulkSet(SAI_OBJECT_TYPE_INGRESS_PRIORITY_GROUP, static_cast<uint32_t>(pgs.oids.size()), pgs.oids.data(),
928+
pgs.attrs.data(), SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, pgs.statuses.data());
929+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
930+
931+
for (size_t i = 0; i < pgs.oids.size(); i++)
932+
{
933+
ASSERT_EQ(pgs.statuses[i], SAI_STATUS_SUCCESS);
934+
}
935+
}
936+
937+
TEST_F(SyncdBrcmTest, bulkSetInInitViewForUnsupportedObjects)
938+
{
939+
sai_object_id_t switchId;
940+
sai_attribute_t attrs[1];
941+
942+
// init view
943+
944+
attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
945+
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
946+
947+
auto status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
948+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
949+
950+
// create switch
951+
952+
attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
953+
attrs[0].value.booldata = true;
954+
955+
status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
956+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
957+
958+
// apply view
959+
960+
attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
961+
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_APPLY_VIEW;
962+
963+
status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
964+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
965+
966+
// init view
967+
968+
attrs[0].id = SAI_REDIS_SWITCH_ATTR_NOTIFY_SYNCD;
969+
attrs[0].value.s32 = SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW;
970+
971+
status = m_sairedis->set(SAI_OBJECT_TYPE_SWITCH, SAI_NULL_OBJECT_ID, attrs);
972+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
973+
974+
// create switch
975+
976+
attrs[0].id = SAI_SWITCH_ATTR_INIT_SWITCH;
977+
attrs[0].value.booldata = true;
978+
979+
status = m_sairedis->create(SAI_OBJECT_TYPE_SWITCH, &switchId, SAI_NULL_OBJECT_ID, 1, attrs);
980+
ASSERT_EQ(status, SAI_STATUS_SUCCESS);
981+
982+
attrs[0].id = SAI_SWITCH_ATTR_UNINIT_DATA_PLANE_ON_REMOVAL;
983+
attrs[0].value.booldata = true;
984+
985+
sai_object_id_t oids[1] = {switchId};
986+
sai_status_t statuses[1] = {SAI_STATUS_NOT_EXECUTED};
987+
988+
ASSERT_THROW(m_sairedis->bulkSet(SAI_OBJECT_TYPE_SWITCH, 1, oids, attrs,
989+
SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses), std::runtime_error);
686990
}

0 commit comments

Comments
 (0)