From 362b34e0e39923baf001d8482d38a214759d4a2b Mon Sep 17 00:00:00 2001 From: Kamil Cudnik Date: Fri, 24 Sep 2021 12:20:09 +0200 Subject: [PATCH] [sairedis] Fail get/clear api on objects created in init view mode (#930) --- syncd/Syncd.cpp | 56 ++++++++++++++++++++++++++++++++++++++++++++++++- syncd/Syncd.h | 2 ++ 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/syncd/Syncd.cpp b/syncd/Syncd.cpp index b2a371434..26a5a8d10 100644 --- a/syncd/Syncd.cpp +++ b/syncd/Syncd.cpp @@ -629,6 +629,17 @@ sai_status_t Syncd::processClearStatsEvent( sai_object_meta_key_t metaKey; sai_deserialize_object_meta_key(key, metaKey); + if (isInitViewMode() && m_createdInInitView.find(metaKey.objectkey.key.object_id) != m_createdInInitView.end()) + { + SWSS_LOG_WARN("CLEAR STATS api can't be used on %s since it's created in INIT_VIEW mode", key.c_str()); + + sai_status_t status = SAI_STATUS_INVALID_OBJECT_ID; + + m_selectableChannel->set(sai_serialize_status(status), {}, REDIS_ASIC_STATE_COMMAND_GETRESPONSE); + + return status; + } + if (!m_translator->tryTranslateVidToRid(metaKey)) { SWSS_LOG_WARN("VID to RID translation failure: %s", key.c_str()); @@ -675,7 +686,16 @@ sai_status_t Syncd::processGetStatsEvent( sai_object_meta_key_t metaKey; sai_deserialize_object_meta_key(key, metaKey); - // TODO get stats on created object in init view mode could fail + if (isInitViewMode() && m_createdInInitView.find(metaKey.objectkey.key.object_id) != m_createdInInitView.end()) + { + SWSS_LOG_WARN("GET STATS api can't be used on %s since it's created in INIT_VIEW mode", key.c_str()); + + sai_status_t status = SAI_STATUS_INVALID_OBJECT_ID; + + m_selectableChannel->set(sai_serialize_status(status), {}, REDIS_ASIC_STATE_COMMAND_GETRESPONSE); + + return status; + } m_translator->translateVidToRid(metaKey); @@ -867,6 +887,16 @@ sai_status_t Syncd::processBulkQuadEventInInitViewMode( syncUpdateRedisBulkQuadEvent(api, statuses, objectType, objectIds, strAttributes); + for (auto& str: objectIds) + { + sai_object_id_t objectVid; + sai_deserialize_object_id(str, objectVid); + + // in init view mode insert every created object except switch + + m_createdInInitView.insert(objectVid); + } + return SAI_STATUS_SUCCESS; } @@ -1471,6 +1501,7 @@ sai_status_t Syncd::processBulkOidCreate( if (statuses[idx] == SAI_STATUS_SUCCESS) { m_translator->insertRidAndVid(objectRids[idx], objectVids[idx]); + SWSS_LOG_INFO("saved VID %s to RID %s", sai_serialize_object_id(objectVids[idx]).c_str(), sai_serialize_object_id(objectRids[idx]).c_str()); @@ -1722,6 +1753,12 @@ sai_status_t Syncd::processQuadInInitViewModeCreate( { onSwitchCreateInInitViewMode(objectVid, attr_count, attr_list); } + else + { + // in init view mode insert every created object except switch + + m_createdInInitView.insert(objectVid); + } } sendApiResponse(SAI_COMMON_API_CREATE, SAI_STATUS_SUCCESS); @@ -1837,6 +1874,19 @@ sai_status_t Syncd::processQuadInInitViewModeGet( sai_object_id_t objectVid; sai_deserialize_object_id(strObjectId, objectVid); + if (isInitViewMode() && m_createdInInitView.find(objectVid) != m_createdInInitView.end()) + { + SWSS_LOG_WARN("GET api can't be used on %s (%s) since it's created in INIT_VIEW mode", + strObjectId.c_str(), + sai_serialize_object_type(objectType).c_str()); + + status = SAI_STATUS_INVALID_OBJECT_ID; + + sendGetResponse(objectType, strObjectId, switchVid, status, attr_count, attr_list); + + return status; + } + switchVid = VidManager::switchIdQuery(objectVid); SWSS_LOG_DEBUG("generic get (init view) for object type %s:%s", @@ -3211,6 +3261,8 @@ sai_status_t Syncd::processNotifySyncd( clearTempView(); + m_createdInInitView.clear(); + // NOTE: Currently as WARN to be easier to spot, later should be NOTICE. 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( */ m_translator->clearLocalCache(); + + m_createdInInitView.clear(); } else { diff --git a/syncd/Syncd.h b/syncd/Syncd.h index 5aa8a82fd..d84153703 100644 --- a/syncd/Syncd.h +++ b/syncd/Syncd.h @@ -492,5 +492,7 @@ namespace syncd std::shared_ptr m_breakConfig; TimerWatchdog m_timerWatchdog; + + std::set m_createdInInitView; }; }