Skip to content

Commit 362b34e

Browse files
authored
[sairedis] Fail get/clear api on objects created in init view mode (#930)
1 parent db403f4 commit 362b34e

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

syncd/Syncd.cpp

+55-1
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,17 @@ sai_status_t Syncd::processClearStatsEvent(
629629
sai_object_meta_key_t metaKey;
630630
sai_deserialize_object_meta_key(key, metaKey);
631631

632+
if (isInitViewMode() && m_createdInInitView.find(metaKey.objectkey.key.object_id) != m_createdInInitView.end())
633+
{
634+
SWSS_LOG_WARN("CLEAR STATS api can't be used on %s since it's created in INIT_VIEW mode", key.c_str());
635+
636+
sai_status_t status = SAI_STATUS_INVALID_OBJECT_ID;
637+
638+
m_selectableChannel->set(sai_serialize_status(status), {}, REDIS_ASIC_STATE_COMMAND_GETRESPONSE);
639+
640+
return status;
641+
}
642+
632643
if (!m_translator->tryTranslateVidToRid(metaKey))
633644
{
634645
SWSS_LOG_WARN("VID to RID translation failure: %s", key.c_str());
@@ -675,7 +686,16 @@ sai_status_t Syncd::processGetStatsEvent(
675686
sai_object_meta_key_t metaKey;
676687
sai_deserialize_object_meta_key(key, metaKey);
677688

678-
// TODO get stats on created object in init view mode could fail
689+
if (isInitViewMode() && m_createdInInitView.find(metaKey.objectkey.key.object_id) != m_createdInInitView.end())
690+
{
691+
SWSS_LOG_WARN("GET STATS api can't be used on %s since it's created in INIT_VIEW mode", key.c_str());
692+
693+
sai_status_t status = SAI_STATUS_INVALID_OBJECT_ID;
694+
695+
m_selectableChannel->set(sai_serialize_status(status), {}, REDIS_ASIC_STATE_COMMAND_GETRESPONSE);
696+
697+
return status;
698+
}
679699

680700
m_translator->translateVidToRid(metaKey);
681701

@@ -867,6 +887,16 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode(
867887

868888
syncUpdateRedisBulkQuadEvent(api, statuses, objectType, objectIds, strAttributes);
869889

890+
for (auto& str: objectIds)
891+
{
892+
sai_object_id_t objectVid;
893+
sai_deserialize_object_id(str, objectVid);
894+
895+
// in init view mode insert every created object except switch
896+
897+
m_createdInInitView.insert(objectVid);
898+
}
899+
870900
return SAI_STATUS_SUCCESS;
871901
}
872902

@@ -1471,6 +1501,7 @@ sai_status_t Syncd::processBulkOidCreate(
14711501
if (statuses[idx] == SAI_STATUS_SUCCESS)
14721502
{
14731503
m_translator->insertRidAndVid(objectRids[idx], objectVids[idx]);
1504+
14741505
SWSS_LOG_INFO("saved VID %s to RID %s",
14751506
sai_serialize_object_id(objectVids[idx]).c_str(),
14761507
sai_serialize_object_id(objectRids[idx]).c_str());
@@ -1722,6 +1753,12 @@ sai_status_t Syncd::processQuadInInitViewModeCreate(
17221753
{
17231754
onSwitchCreateInInitViewMode(objectVid, attr_count, attr_list);
17241755
}
1756+
else
1757+
{
1758+
// in init view mode insert every created object except switch
1759+
1760+
m_createdInInitView.insert(objectVid);
1761+
}
17251762
}
17261763

17271764
sendApiResponse(SAI_COMMON_API_CREATE, SAI_STATUS_SUCCESS);
@@ -1837,6 +1874,19 @@ sai_status_t Syncd::processQuadInInitViewModeGet(
18371874
sai_object_id_t objectVid;
18381875
sai_deserialize_object_id(strObjectId, objectVid);
18391876

1877+
if (isInitViewMode() && m_createdInInitView.find(objectVid) != m_createdInInitView.end())
1878+
{
1879+
SWSS_LOG_WARN("GET api can't be used on %s (%s) since it's created in INIT_VIEW mode",
1880+
strObjectId.c_str(),
1881+
sai_serialize_object_type(objectType).c_str());
1882+
1883+
status = SAI_STATUS_INVALID_OBJECT_ID;
1884+
1885+
sendGetResponse(objectType, strObjectId, switchVid, status, attr_count, attr_list);
1886+
1887+
return status;
1888+
}
1889+
18401890
switchVid = VidManager::switchIdQuery(objectVid);
18411891

18421892
SWSS_LOG_DEBUG("generic get (init view) for object type %s:%s",
@@ -3211,6 +3261,8 @@ sai_status_t Syncd::processNotifySyncd(
32113261

32123262
clearTempView();
32133263

3264+
m_createdInInitView.clear();
3265+
32143266
// NOTE: Currently as WARN to be easier to spot, later should be NOTICE.
32153267

32163268
SWSS_LOG_WARN("syncd switched to INIT VIEW mode, all op will be saved to TEMP view");
@@ -3263,6 +3315,8 @@ sai_status_t Syncd::processNotifySyncd(
32633315
*/
32643316

32653317
m_translator->clearLocalCache();
3318+
3319+
m_createdInInitView.clear();
32663320
}
32673321
else
32683322
{

syncd/Syncd.h

+2
Original file line numberDiff line numberDiff line change
@@ -492,5 +492,7 @@ namespace syncd
492492
std::shared_ptr<BreakConfig> m_breakConfig;
493493

494494
TimerWatchdog m_timerWatchdog;
495+
496+
std::set<sai_object_id_t> m_createdInInitView;
495497
};
496498
}

0 commit comments

Comments
 (0)