@@ -85,6 +85,8 @@ Syncd::Syncd(
8585 m_asicState = std::make_shared<swss::ConsumerTable>(m_dbAsic.get (), ASIC_STATE_TABLE);
8686 m_restartQuery = std::make_shared<swss::NotificationConsumer>(m_dbAsic.get (), SYNCD_NOTIFICATION_CHANNEL_RESTARTQUERY);
8787
88+ m_asicState->setModifyRedis (m_commandLineOptions->m_enableSyncMode ? false : true );
89+
8890 // TODO to be moved to ASIC_DB
8991 m_dbFlexCounter = std::make_shared<swss::DBConnector>(m_contextConfig->m_dbFlex , 0 );
9092 m_flexCounter = std::make_shared<swss::ConsumerTable>(m_dbFlexCounter.get (), FLEX_COUNTER_TABLE);
@@ -663,6 +665,13 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode(
663665{
664666 SWSS_LOG_ENTER ();
665667
668+ std::vector<sai_status_t > statuses (object_ids.size ());
669+
670+ for (auto &a: statuses)
671+ {
672+ a = SAI_STATUS_SUCCESS;
673+ }
674+
666675 auto info = sai_metadata_get_object_type_info (objectType);
667676
668677 switch (api)
@@ -673,7 +682,7 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode(
673682
674683 if (info->isnonobjectid )
675684 {
676- sendApiResponse (api, SAI_STATUS_SUCCESS);
685+ sendApiResponse (api, SAI_STATUS_SUCCESS, ( uint32_t )statuses. size (), statuses. data () );
677686 return SAI_STATUS_SUCCESS;
678687 }
679688
@@ -689,7 +698,7 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode(
689698
690699 default :
691700
692- sendApiResponse (api, SAI_STATUS_SUCCESS);
701+ sendApiResponse (api, SAI_STATUS_SUCCESS, ( uint32_t )statuses. size (), statuses. data () );
693702 return SAI_STATUS_SUCCESS;
694703 }
695704
@@ -1280,6 +1289,88 @@ void Syncd::processFlexCounterEvent( // TODO must be moved to go via ASIC channe
12801289 }
12811290}
12821291
1292+ void Syncd::syncUpdateRedisQuadEvent (
1293+ _In_ sai_status_t status,
1294+ _In_ sai_common_api_t api,
1295+ _In_ const swss::KeyOpFieldsValuesTuple &kco)
1296+ {
1297+ SWSS_LOG_ENTER ();
1298+
1299+ if (!m_commandLineOptions->m_enableSyncMode )
1300+ {
1301+ return ;
1302+ }
1303+
1304+ if (status != SAI_STATUS_SUCCESS)
1305+ {
1306+ return ;
1307+ }
1308+
1309+ // When in synchronous mode, we need to modify redis database when status
1310+ // is success, since consumer table on synchronous mode is not making redis
1311+ // changes and we only want to apply changes when api succeeded. This
1312+ // applies to init view mode and apply view mode.
1313+
1314+ const std::string& key = kfvKey (kco);
1315+
1316+ auto & values = kfvFieldsValues (kco);
1317+
1318+ const std::string& strObjectId = key.substr (key.find (" :" ) + 1 );
1319+
1320+ sai_object_meta_key_t metaKey;
1321+ sai_deserialize_object_meta_key (key, metaKey);
1322+
1323+ const bool initView = isInitViewMode ();
1324+
1325+ switch (api)
1326+ {
1327+ case SAI_COMMON_API_CREATE:
1328+
1329+ {
1330+ if (initView)
1331+ m_client->createTempAsicObject (metaKey, values);
1332+ else
1333+ m_client->createAsicObject (metaKey, values);
1334+
1335+ return ;
1336+ }
1337+
1338+ case SAI_COMMON_API_REMOVE:
1339+
1340+ {
1341+ if (initView)
1342+ m_client->removeTempAsicObject (metaKey);
1343+ else
1344+ m_client->removeAsicObject (metaKey);
1345+
1346+ return ;
1347+ }
1348+
1349+ case SAI_COMMON_API_SET:
1350+
1351+ {
1352+ auto & first = values.at (0 );
1353+
1354+ auto & attr = fvField (first);
1355+ auto & value = fvValue (first);
1356+
1357+ if (initView)
1358+ m_client->setTempAsicObject (metaKey, attr, value);
1359+ else
1360+ m_client->setAsicObject (metaKey, attr, value);
1361+
1362+ return ;
1363+ }
1364+
1365+ case SAI_COMMON_API_GET:
1366+ return ; // ignore get since get is not modifying db
1367+
1368+ default :
1369+
1370+ SWSS_LOG_THROW (" api %d is not supported" , api);
1371+ }
1372+ }
1373+
12831374sai_status_t Syncd::processQuadEvent (
12841375 _In_ sai_common_api_t api,
12851376 _In_ const swss::KeyOpFieldsValuesTuple &kco)
@@ -1338,7 +1429,11 @@ sai_status_t Syncd::processQuadEvent(
13381429
13391430 if (isInitViewMode ())
13401431 {
1341- return processQuadEventInInitViewMode (metaKey.objecttype , strObjectId, api, attr_count, attr_list);
1432+ sai_status_t status = processQuadEventInInitViewMode (metaKey.objecttype , strObjectId, api, attr_count, attr_list);
1433+
1434+ syncUpdateRedisQuadEvent (status, api, kco);
1435+
1436+ return status;
13421437 }
13431438
13441439 if (api != SAI_COMMON_API_GET)
@@ -1402,16 +1497,23 @@ sai_status_t Syncd::processQuadEvent(
14021497 SWSS_LOG_ERROR (" attr: %s: %s" , fvField (v).c_str (), fvValue (v).c_str ());
14031498 }
14041499
1405- SWSS_LOG_THROW (" failed to execute api: %s, key: %s, status: %s" ,
1406- op.c_str (),
1407- key.c_str (),
1408- sai_serialize_status (status).c_str ());
1500+ if (!m_commandLineOptions->m_enableSyncMode )
1501+ {
1502+ // throw only when sync mode is not enabled
1503+
1504+ SWSS_LOG_THROW (" failed to execute api: %s, key: %s, status: %s" ,
1505+ op.c_str (),
1506+ key.c_str (),
1507+ sai_serialize_status (status).c_str ());
1508+ }
14091509 }
14101510 else // non GET api, status is SUCCESS
14111511 {
14121512 sendApiResponse (api, status);
14131513 }
14141514
1515+ syncUpdateRedisQuadEvent (status, api, kco);
1516+
14151517 return status;
14161518}
14171519
0 commit comments