From 3e8f83b3081317e323d6d588b2c1bab06bf91835 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 af5a68f45..5e5ab1627 100644 --- a/syncd/Syncd.cpp +++ b/syncd/Syncd.cpp @@ -625,6 +625,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()); @@ -671,7 +682,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); @@ -863,6 +883,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; } @@ -1457,6 +1487,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()); @@ -1703,6 +1734,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); @@ -1818,6 +1855,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", @@ -3188,6 +3238,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"); @@ -3240,6 +3292,8 @@ sai_status_t Syncd::processNotifySyncd( */ m_translator->clearLocalCache(); + + m_createdInInitView.clear(); } else { diff --git a/syncd/Syncd.h b/syncd/Syncd.h index dc3c5b996..753789a31 100644 --- a/syncd/Syncd.h +++ b/syncd/Syncd.h @@ -489,5 +489,7 @@ namespace syncd std::shared_ptr m_contextConfig; std::shared_ptr m_breakConfig; + + std::set m_createdInInitView; }; }