@@ -85,6 +85,8 @@ Syncd::Syncd(
85
85
m_asicState = std::make_shared<swss::ConsumerTable>(m_dbAsic.get (), ASIC_STATE_TABLE);
86
86
m_restartQuery = std::make_shared<swss::NotificationConsumer>(m_dbAsic.get (), SYNCD_NOTIFICATION_CHANNEL_RESTARTQUERY);
87
87
88
+ m_asicState->setModifyRedis (m_commandLineOptions->m_enableSyncMode ? false : true );
89
+
88
90
// TODO to be moved to ASIC_DB
89
91
m_dbFlexCounter = std::make_shared<swss::DBConnector>(m_contextConfig->m_dbFlex , 0 );
90
92
m_flexCounter = std::make_shared<swss::ConsumerTable>(m_dbFlexCounter.get (), FLEX_COUNTER_TABLE);
@@ -663,6 +665,13 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode(
663
665
{
664
666
SWSS_LOG_ENTER ();
665
667
668
+ std::vector<sai_status_t > statuses (object_ids.size ());
669
+
670
+ for (auto &a: statuses)
671
+ {
672
+ a = SAI_STATUS_SUCCESS;
673
+ }
674
+
666
675
auto info = sai_metadata_get_object_type_info (objectType);
667
676
668
677
switch (api)
@@ -673,7 +682,7 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode(
673
682
674
683
if (info->isnonobjectid )
675
684
{
676
- sendApiResponse (api, SAI_STATUS_SUCCESS);
685
+ sendApiResponse (api, SAI_STATUS_SUCCESS, ( uint32_t )statuses. size (), statuses. data () );
677
686
return SAI_STATUS_SUCCESS;
678
687
}
679
688
@@ -689,7 +698,7 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode(
689
698
690
699
default :
691
700
692
- sendApiResponse (api, SAI_STATUS_SUCCESS);
701
+ sendApiResponse (api, SAI_STATUS_SUCCESS, ( uint32_t )statuses. size (), statuses. data () );
693
702
return SAI_STATUS_SUCCESS;
694
703
}
695
704
@@ -1280,6 +1289,88 @@ void Syncd::processFlexCounterEvent( // TODO must be moved to go via ASIC channe
1280
1289
}
1281
1290
}
1282
1291
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
+
1283
1374
sai_status_t Syncd::processQuadEvent (
1284
1375
_In_ sai_common_api_t api,
1285
1376
_In_ const swss::KeyOpFieldsValuesTuple &kco)
@@ -1338,7 +1429,11 @@ sai_status_t Syncd::processQuadEvent(
1338
1429
1339
1430
if (isInitViewMode ())
1340
1431
{
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;
1342
1437
}
1343
1438
1344
1439
if (api != SAI_COMMON_API_GET)
@@ -1402,16 +1497,23 @@ sai_status_t Syncd::processQuadEvent(
1402
1497
SWSS_LOG_ERROR (" attr: %s: %s" , fvField (v).c_str (), fvValue (v).c_str ());
1403
1498
}
1404
1499
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
+ }
1409
1509
}
1410
1510
else // non GET api, status is SUCCESS
1411
1511
{
1412
1512
sendApiResponse (api, status);
1413
1513
}
1414
1514
1515
+ syncUpdateRedisQuadEvent (status, api, kco);
1516
+
1415
1517
return status;
1416
1518
}
1417
1519
0 commit comments