diff --git a/orchagent/aclorch.cpp b/orchagent/aclorch.cpp index 9c9b608a06..01b6a8e0bc 100644 --- a/orchagent/aclorch.cpp +++ b/orchagent/aclorch.cpp @@ -3626,7 +3626,10 @@ sai_status_t AclOrch::createDTelWatchListTables() if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create table %s", flowWLTable.description.c_str()); - return status; + if (handleSaiCreateStatus(SAI_API_ACL, status) != task_success) + { + return status; + } } gCrmOrch->incCrmAclUsedCounter(CrmResourceType::CRM_ACL_TABLE, SAI_ACL_STAGE_INGRESS, SAI_ACL_BIND_POINT_TYPE_SWITCH); @@ -3687,14 +3690,17 @@ sai_status_t AclOrch::createDTelWatchListTables() if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create table %s", dropWLTable.description.c_str()); - return status; + if (handleSaiCreateStatus(SAI_API_ACL, status) != task_success) + { + return status; + } } gCrmOrch->incCrmAclUsedCounter(CrmResourceType::CRM_ACL_TABLE, SAI_ACL_STAGE_INGRESS, SAI_ACL_BIND_POINT_TYPE_SWITCH); m_AclTables[table_oid] = dropWLTable; SWSS_LOG_INFO("Successfully created ACL table %s, oid: %" PRIx64, dropWLTable.description.c_str(), table_oid); - return status; + return SAI_STATUS_SUCCESS; } sai_status_t AclOrch::deleteDTelWatchListTables() @@ -3719,7 +3725,10 @@ sai_status_t AclOrch::deleteDTelWatchListTables() if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to delete table %s", table_id.c_str()); - return status; + if (handleSaiRemoveStatus(SAI_API_ACL, status) != task_success) + { + return status; + } } gCrmOrch->decCrmAclUsedCounter(CrmResourceType::CRM_ACL_TABLE, SAI_ACL_STAGE_INGRESS, SAI_ACL_BIND_POINT_TYPE_SWITCH, table_oid); @@ -3739,7 +3748,10 @@ sai_status_t AclOrch::deleteDTelWatchListTables() if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to delete table %s", table_id.c_str()); - return status; + if (handleSaiRemoveStatus(SAI_API_ACL, status) != task_success) + { + return status; + } } gCrmOrch->decCrmAclUsedCounter(CrmResourceType::CRM_ACL_TABLE, SAI_ACL_STAGE_INGRESS, SAI_ACL_BIND_POINT_TYPE_SWITCH, table_oid); diff --git a/orchagent/bufferorch.cpp b/orchagent/bufferorch.cpp index bc24551ca0..f44b90f96c 100644 --- a/orchagent/bufferorch.cpp +++ b/orchagent/bufferorch.cpp @@ -375,7 +375,11 @@ task_process_status BufferOrch::processBufferPool(KeyOpFieldsValuesTuple &tuple) else if (SAI_STATUS_SUCCESS != sai_status) { SWSS_LOG_ERROR("Failed to modify buffer pool, name:%s, sai object:%" PRIx64 ", status:%d", object_name.c_str(), sai_object, sai_status); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiSetStatus(SAI_API_BUFFER, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } } SWSS_LOG_DEBUG("Modified existing pool:%" PRIx64 ", type:%s name:%s ", sai_object, map_type_name.c_str(), object_name.c_str()); @@ -386,7 +390,11 @@ task_process_status BufferOrch::processBufferPool(KeyOpFieldsValuesTuple &tuple) if (SAI_STATUS_SUCCESS != sai_status) { SWSS_LOG_ERROR("Failed to create buffer pool %s with type %s, rv:%d", object_name.c_str(), map_type_name.c_str(), sai_status); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_BUFFER, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } (*(m_buffer_type_maps[map_type_name]))[object_name].m_saiObjectId = sai_object; SWSS_LOG_NOTICE("Created buffer pool %s with type %s", object_name.c_str(), map_type_name.c_str()); @@ -412,7 +420,11 @@ task_process_status BufferOrch::processBufferPool(KeyOpFieldsValuesTuple &tuple) if (SAI_STATUS_SUCCESS != sai_status) { SWSS_LOG_ERROR("Failed to remove buffer pool %s with type %s, rv:%d", object_name.c_str(), map_type_name.c_str(), sai_status); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_BUFFER, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } SWSS_LOG_NOTICE("Removed buffer pool %s with type %s", object_name.c_str(), map_type_name.c_str()); auto it_to_delete = (m_buffer_type_maps[map_type_name])->find(object_name); @@ -566,7 +578,11 @@ task_process_status BufferOrch::processBufferProfile(KeyOpFieldsValuesTuple &tup else if (SAI_STATUS_SUCCESS != sai_status) { SWSS_LOG_ERROR("Failed to modify buffer profile, name:%s, sai object:%" PRIx64 ", status:%d", object_name.c_str(), sai_object, sai_status); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiSetStatus(SAI_API_BUFFER, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } } } @@ -576,7 +592,11 @@ task_process_status BufferOrch::processBufferProfile(KeyOpFieldsValuesTuple &tup if (SAI_STATUS_SUCCESS != sai_status) { SWSS_LOG_ERROR("Failed to create buffer profile %s with type %s, rv:%d", object_name.c_str(), map_type_name.c_str(), sai_status); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_BUFFER, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } (*(m_buffer_type_maps[map_type_name]))[object_name].m_saiObjectId = sai_object; SWSS_LOG_NOTICE("Created buffer profile %s with type %s", object_name.c_str(), map_type_name.c_str()); @@ -599,7 +619,11 @@ task_process_status BufferOrch::processBufferProfile(KeyOpFieldsValuesTuple &tup if (SAI_STATUS_SUCCESS != sai_status) { SWSS_LOG_ERROR("Failed to remove buffer profile %s with type %s, rv:%d", object_name.c_str(), map_type_name.c_str(), sai_status); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_BUFFER, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } SWSS_LOG_NOTICE("Remove buffer profile %s with type %s", object_name.c_str(), map_type_name.c_str()); @@ -702,7 +726,11 @@ task_process_status BufferOrch::processQueue(KeyOpFieldsValuesTuple &tuple) if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set queue's buffer profile attribute, status:%d", sai_status); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiSetStatus(SAI_API_QUEUE, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } } } @@ -825,7 +853,11 @@ task_process_status BufferOrch::processPriorityGroup(KeyOpFieldsValuesTuple &tup if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set port:%s pg:%zd buffer profile attribute, status:%d", port_name.c_str(), ind, sai_status); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiSetStatus(SAI_API_BUFFER, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } } } @@ -904,7 +936,11 @@ task_process_status BufferOrch::processIngressBufferProfileList(KeyOpFieldsValue if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set ingress buffer profile list on port, status:%d, key:%s", sai_status, port_name.c_str()); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } } @@ -954,7 +990,11 @@ task_process_status BufferOrch::processEgressBufferProfileList(KeyOpFieldsValues if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set egress buffer profile list on port, status:%d, key:%s", sai_status, port_name.c_str()); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } } diff --git a/orchagent/copporch.cpp b/orchagent/copporch.cpp index fa3f82d746..403fcb98d9 100644 --- a/orchagent/copporch.cpp +++ b/orchagent/copporch.cpp @@ -125,7 +125,10 @@ void CoppOrch::initDefaultHostIntfTable() if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create default host interface table, rv:%d", status); - throw "CoppOrch initialization failure"; + if (handleSaiCreateStatus(SAI_API_HOSTIF, status) != task_success) + { + throw "CoppOrch initialization failure"; + } } SWSS_LOG_NOTICE("Create default host interface table"); @@ -243,7 +246,11 @@ bool CoppOrch::createGenetlinkHostIfTable(vector &trap_i if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create hostif table entry failed, rv %d", status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_HOSTIF, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_trapid_hostif_table_map[trap_id] = hostif_table_entry; } @@ -266,7 +273,11 @@ bool CoppOrch::removeGenetlinkHostIfTable(vector &trap_i { SWSS_LOG_ERROR("Failed to delete hostif table entry %" PRId64 " \ rc=%d", m_trapid_hostif_table_map[trap_id], sai_status); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_HOSTIF, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_trapid_hostif_table_map.erase(trap_id); } @@ -294,7 +305,11 @@ bool CoppOrch::applyAttributesToTrapIds(sai_object_id_t trap_group_id, if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create trap %d, rv:%d", trap_id, status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_HOSTIF, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_syncdTrapIds[trap_id].trap_group_obj = trap_group_id; m_syncdTrapIds[trap_id].trap_obj = hostif_trap_id; @@ -323,14 +338,22 @@ bool CoppOrch::removePolicer(string trap_group_name) if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set policer to NULL for trap group %s, rc=%d", trap_group_name.c_str(), sai_status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_HOSTIF, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } sai_status = sai_policer_api->remove_policer(policer_id); if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove policer for trap group %s, rc=%d", trap_group_name.c_str(), sai_status); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_POLICER, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Remove policer for trap group %s", trap_group_name.c_str()); @@ -367,7 +390,11 @@ bool CoppOrch::createPolicer(string trap_group_name, vector &po if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create policer trap group %s, rc=%d", trap_group_name.c_str(), sai_status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_POLICER, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Create policer for trap group %s", trap_group_name.c_str()); @@ -380,7 +407,11 @@ bool CoppOrch::createPolicer(string trap_group_name, vector &po if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to bind policer to trap group %s, rc=%d", trap_group_name.c_str(), sai_status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_HOSTIF, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Bind policer to trap group %s:", trap_group_name.c_str()); @@ -402,7 +433,11 @@ bool CoppOrch::createGenetlinkHostIf(string trap_group_name, vectorsecond, trap_group_name.c_str(), sai_status); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_HOSTIF, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_trap_group_hostif_map.erase(m_trap_group_map[trap_group_name]); } @@ -489,7 +528,11 @@ task_process_status CoppOrch::processCoppRule(Consumer& consumer) if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to apply attribute:%d to trap group:%" PRIx64 ", name:%s, error:%d\n", trap_gr_attr.id, m_trap_group_map[trap_group_name], trap_group_name.c_str(), sai_status); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiSetStatus(SAI_API_HOSTIF, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } SWSS_LOG_NOTICE("Set trap group %s to host interface", trap_group_name.c_str()); } @@ -503,7 +546,11 @@ task_process_status CoppOrch::processCoppRule(Consumer& consumer) if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create host interface trap group %s, rc=%d", trap_group_name.c_str(), sai_status); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_HOSTIF, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } SWSS_LOG_NOTICE("Create host interface trap group %s", trap_group_name.c_str()); @@ -534,7 +581,11 @@ task_process_status CoppOrch::processCoppRule(Consumer& consumer) SWSS_LOG_ERROR("Failed to set attribute %d on trap %" PRIx64 "" " on group %s", i.id, m_syncdTrapIds[trap_id].trap_obj, trap_group_name.c_str()); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiSetStatus(SAI_API_HOSTIF, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } } } @@ -724,7 +775,11 @@ bool CoppOrch::trapGroupProcessTrapIdChange (string trap_group_name, { SWSS_LOG_ERROR("Failed to remove trap object %" PRId64 "", m_syncdTrapIds[i].trap_obj); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_HOSTIF, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } } @@ -773,7 +828,11 @@ bool CoppOrch::trapGroupProcessTrapIdChange (string trap_group_name, { SWSS_LOG_ERROR("Failed to remove trap object %" PRId64 "", m_syncdTrapIds[i].trap_obj); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_HOSTIF, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_syncdTrapIds.erase(i); } @@ -819,7 +878,11 @@ bool CoppOrch::processTrapGroupDel (string trap_group_name) if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove trap object %" PRId64 "", it.second.trap_obj); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_HOSTIF, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } } @@ -834,7 +897,11 @@ bool CoppOrch::processTrapGroupDel (string trap_group_name) if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove trap group %s", trap_group_name.c_str()); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_HOSTIF, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_trap_group_map.erase(it_del); @@ -1011,7 +1078,11 @@ bool CoppOrch::trapGroupUpdatePolicer (string trap_group_name, SWSS_LOG_ERROR("Failed to apply attribute[%d].id=%d to policer for trap group:" "%s, error:%d\n",ind, policer_attr.id, trap_group_name.c_str(), sai_status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_POLICER, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } } diff --git a/orchagent/dtelorch.cpp b/orchagent/dtelorch.cpp index 9a77dc7268..378a225e37 100644 --- a/orchagent/dtelorch.cpp +++ b/orchagent/dtelorch.cpp @@ -35,7 +35,10 @@ DTelOrch::DTelOrch(DBConnector *db, vector tableNames, PortsOrch *portOr if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Error creating DTel id"); - return; + if (handleSaiCreateStatus(SAI_API_DTEL, status) != task_success) + { + return; + } } attr.id = SAI_DTEL_ATTR_INT_L4_DSCP; @@ -48,7 +51,10 @@ DTelOrch::DTelOrch(DBConnector *db, vector tableNames, PortsOrch *portOr if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to set default INT L4 DSCP value/mask"); - return; + if (handleSaiSetStatus(SAI_API_DTEL, status) != task_success) + { + return; + } } } @@ -58,7 +64,10 @@ DTelOrch::~DTelOrch() if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Error deleting DTel id"); - return; + if (handleSaiRemoveStatus(SAI_API_DTEL, status) != task_success) + { + return; + } } } @@ -411,7 +420,10 @@ void DTelOrch::update(SubjectType type, void *cntx) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to update sink port list on port add"); - return; + if (handleSaiSetStatus(SAI_API_DTEL, status) != task_success) + { + return; + } } } } else { @@ -421,7 +433,10 @@ void DTelOrch::update(SubjectType type, void *cntx) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to update sink port list on port remove"); - return; + if (handleSaiSetStatus(SAI_API_DTEL, status) != task_success) + { + return; + } } } } @@ -506,7 +521,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to enable INT endpoint mode"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == INT_TRANSIT) @@ -519,7 +546,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to enable INT transit mode"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == POSTCARD) @@ -532,7 +571,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to enable DTel postcard"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == DROP_REPORT) @@ -545,7 +596,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to enable drop report"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == QUEUE_REPORT) @@ -558,7 +621,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to enable queue report"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == SWITCH_ID) @@ -571,7 +646,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to set switch id"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == FLOW_STATE_CLEAR_CYCLE) @@ -584,7 +671,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to set Dtel flow state clear cycle"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == LATENCY_SENSITIVITY) @@ -597,7 +696,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to set Dtel latency sensitivity"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == SINK_PORT_LIST) @@ -630,7 +741,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) status = updateSinkPortList(); if (status != SAI_STATUS_SUCCESS) { - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == INT_L4_DSCP) @@ -668,7 +791,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to set INT L4 DSCP value/mask"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } @@ -683,7 +818,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to disable INT endpoint mode"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == INT_TRANSIT) @@ -694,7 +841,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to disable INT transit mode"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == POSTCARD) @@ -705,7 +864,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to disable postcard mode"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == DROP_REPORT) @@ -716,7 +887,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to disable drop report"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == QUEUE_REPORT) @@ -727,7 +910,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to disable queue report"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == SWITCH_ID) @@ -740,7 +935,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to reset switch id"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == FLOW_STATE_CLEAR_CYCLE) @@ -753,7 +960,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to reset flow state clear cycle"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == LATENCY_SENSITIVITY) @@ -766,7 +985,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to reset latency sensitivity"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == SINK_PORT_LIST) @@ -776,7 +1007,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to reset sink port list"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } else if (table_attr == INT_L4_DSCP) @@ -788,7 +1031,19 @@ void DTelOrch::doDtelTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to reset INT L4 DSCP value/mask"); - goto dtel_table_continue; + task_process_status handle_status = handleSaiSetStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto dtel_table_continue; + } + else + { + it++; + continue; + } + } } } } @@ -819,7 +1074,11 @@ bool DTelOrch::deleteReportSession(const string &report_session_id) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to delete report session %s", report_session_id.c_str()); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_dTelReportSessionTable.erase(report_session_id); @@ -917,7 +1176,19 @@ void DTelOrch::doDtelReportSessionTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to set INT EP report session %s", report_session_id.c_str()); - goto report_session_table_continue; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto report_session_table_continue; + } + else + { + it++; + continue; + } + } } DTelReportSessionEntry rs_entry = { }; @@ -969,7 +1240,11 @@ bool DTelOrch::deleteINTSession(const string &int_session_id) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to delete INT session %s", int_session_id.c_str()); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_dTelINTSessionTable.erase(int_session_id); @@ -1055,7 +1330,19 @@ void DTelOrch::doDtelINTSessionTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to set INT session %s", int_session_id.c_str()); - goto int_session_table_continue; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto int_session_table_continue; + } + else + { + it++; + continue; + } + } } DTelINTSessionEntry is_entry; @@ -1116,7 +1403,11 @@ bool DTelOrch::disableQueueReport(const string &port, const string &queue) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to disable queue report for port %s, queue %s", port.c_str(), queue.c_str()); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_dTelPortTable[port].queueTable[queue].queueReportOid = 0; @@ -1144,7 +1435,11 @@ sai_status_t DTelOrch::enableQueueReport(const string& port, DTelQueueReportEntr if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to enable queue report on port %s, queue %d", port.c_str(), qreport.q_ind); - return status; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return status; @@ -1282,7 +1577,11 @@ bool DTelOrch::unConfigureEvent(string &event) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to remove event %s", event.c_str()); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } removeEvent(event); @@ -1355,7 +1654,18 @@ void DTelOrch::doDtelEventTableTask(Consumer &consumer) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("DTEL ERROR: Failed to create event %s", event.c_str()); - goto event_table_continue; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_DTEL, status); + if (handle_status != task_success) + { + if (parseHandleSaiStatusFailure(handle_status)) + { + goto event_table_continue; + } + else + { + goto event_table_skip; + } + } } addEvent(event, event_oid, report_session_id); diff --git a/orchagent/fdborch.cpp b/orchagent/fdborch.cpp index 7640e98032..cd4888bc1c 100644 --- a/orchagent/fdborch.cpp +++ b/orchagent/fdborch.cpp @@ -291,7 +291,10 @@ void FdbOrch::update(sai_fdb_event_t type, { SWSS_LOG_ERROR("Failed to create FDB %s on %s, rv:%d", existing_entry->first.mac.to_string().c_str(), update.port.m_alias.c_str(), status); - return; + if (handleSaiCreateStatus(SAI_API_FDB, status) != task_success) + { + return; + } } return; } @@ -1089,7 +1092,11 @@ bool FdbOrch::addFdbEntry(const FdbEntry& entry, const string& port_name, { SWSS_LOG_ERROR("macUpdate-Failed for attr.id=0x%x for FDB %s in %s on %s, rv:%d", itr.id, entry.mac.to_string().c_str(), vlan.m_alias.c_str(), port_name.c_str(), status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_FDB, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } if (oldPort.m_bridge_port_id != port.m_bridge_port_id) @@ -1110,7 +1117,11 @@ bool FdbOrch::addFdbEntry(const FdbEntry& entry, const string& port_name, SWSS_LOG_ERROR("Failed to create %s FDB %s in %s on %s, rv:%d", fdbData.type.c_str(), entry.mac.to_string().c_str(), vlan.m_alias.c_str(), port_name.c_str(), status); - return false; //FIXME: it should be based on status. Some could be retried, some not + task_process_status handle_status = handleSaiCreateStatus(SAI_API_FDB, status); //FIXME: it should be based on status. Some could be retried, some not + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } port.m_fdb_count++; m_portsOrch->setPort(port.m_alias, port); @@ -1225,7 +1236,11 @@ bool FdbOrch::removeFdbEntry(const FdbEntry& entry, FdbOrigin origin) { SWSS_LOG_ERROR("FdbOrch RemoveFDBEntry: Failed to remove FDB entry. mac=%s, bv_id=0x%" PRIx64, entry.mac.to_string().c_str(), entry.bv_id); - return true; //FIXME: it should be based on status. Some could be retried. some not + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_FDB, status); //FIXME: it should be based on status. Some could be retried. some not + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_INFO("Removed mac=%s bv_id=0x%" PRIx64 " port:%s", diff --git a/orchagent/fgnhgorch.cpp b/orchagent/fgnhgorch.cpp index 6ca37cad81..de791678ac 100644 --- a/orchagent/fgnhgorch.cpp +++ b/orchagent/fgnhgorch.cpp @@ -241,7 +241,11 @@ bool FgNhgOrch::writeHashBucketChange(FGNextHopGroupEntry *syncd_fg_route_entry, { SWSS_LOG_ERROR("Failed to set next hop oid %" PRIx64 " member %" PRIx64 ": %d", syncd_fg_route_entry->nhopgroup_members[index], nh_oid, status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_NEXT_HOP_GROUP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } setStateDbRouteEntry(ipPrefix, index, nextHop); @@ -318,7 +322,11 @@ bool FgNhgOrch::removeFineGrainedNextHopGroup(FGNextHopGroupEntry *syncd_fg_rout { SWSS_LOG_ERROR("Failed to remove next hop group member %" PRIx64 ", rv:%d", nhgm, status); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NEXT_HOP_GROUP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } gCrmOrch->decCrmResUsedCounter(CrmResourceType::CRM_NEXTHOP_GROUP_MEMBER); } @@ -986,7 +994,11 @@ bool FgNhgOrch::setNewNhgMembers(FGNextHopGroupEntry &syncd_fg_route_entry, FgNh SWSS_LOG_ERROR("Failed to clean-up after next-hop member creation failure"); } - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NEXT_HOP_GROUP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } setStateDbRouteEntry(ipPrefix, j, bank_nh_memb); diff --git a/orchagent/intfsorch.cpp b/orchagent/intfsorch.cpp index 783f965f3c..babf874e71 100644 --- a/orchagent/intfsorch.cpp +++ b/orchagent/intfsorch.cpp @@ -190,7 +190,11 @@ bool IntfsOrch::setRouterIntfsMtu(const Port &port) { SWSS_LOG_ERROR("Failed to set router interface %s MTU to %u, rv:%d", port.m_alias.c_str(), port.m_mtu, status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_ROUTER_INTERFACE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Set router interface %s MTU to %u", port.m_alias.c_str(), port.m_mtu); @@ -212,7 +216,11 @@ bool IntfsOrch::setRouterIntfsMac(const Port &port) { SWSS_LOG_ERROR("Failed to set router interface %s MAC to %s, rv:%d", port.m_alias.c_str(), port.m_mac.to_string().c_str(), status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_ROUTER_INTERFACE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Set router interface %s MAC to %s", port.m_alias.c_str(), port.m_mac.to_string().c_str()); @@ -241,7 +249,11 @@ bool IntfsOrch::setRouterIntfsNatZoneId(Port &port) { SWSS_LOG_ERROR("Failed to set router interface %s NAT Zone Id to %u, rv:%d", port.m_alias.c_str(), port.m_nat_zone_id, status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_ROUTER_INTERFACE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Set router interface %s NAT Zone Id to %u", port.m_alias.c_str(), port.m_nat_zone_id); @@ -262,7 +274,11 @@ bool IntfsOrch::setRouterIntfsAdminStatus(const Port &port) { SWSS_LOG_ERROR("Failed to set router interface %s V4 admin status to %s, rv:%d", port.m_alias.c_str(), port.m_admin_state_up == true ? "up" : "down", status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_ROUTER_INTERFACE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } attr.id = SAI_ROUTER_INTERFACE_ATTR_ADMIN_V6_STATE; @@ -272,7 +288,11 @@ bool IntfsOrch::setRouterIntfsAdminStatus(const Port &port) { SWSS_LOG_ERROR("Failed to set router interface %s V6 admin status to %s, rv:%d", port.m_alias.c_str(), port.m_admin_state_up == true ? "up" : "down", status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_ROUTER_INTERFACE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; @@ -296,7 +316,11 @@ bool IntfsOrch::setIntfVlanFloodType(const Port &port, sai_vlan_flood_control_ty if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set flood type for VLAN %u, rv:%d", port.m_vlan_info.vlan_id, status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_VLAN, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; @@ -826,6 +850,11 @@ void IntfsOrch::doTask(Consumer &consumer) { SWSS_LOG_ERROR("Failed to set router interface mac %s for port %s, rv:%d", mac.to_string().c_str(), port.m_alias.c_str(), status); + if (handleSaiSetStatus(SAI_API_ROUTER_INTERFACE, status) == task_need_retry) + { + it++; + continue; + } } else { @@ -1056,7 +1085,10 @@ bool IntfsOrch::addRouterIntfs(sai_object_id_t vrf_id, Port &port) { SWSS_LOG_ERROR("Failed to create router interface %s, rv:%d", port.m_alias.c_str(), status); - throw runtime_error("Failed to create router interface."); + if (handleSaiCreateStatus(SAI_API_ROUTER_INTERFACE, status) != task_success) + { + throw runtime_error("Failed to create router interface."); + } } port.m_vr_id = vrf_id; @@ -1092,7 +1124,10 @@ bool IntfsOrch::removeRouterIntfs(Port &port) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove router interface for port %s, rv:%d", port.m_alias.c_str(), status); - throw runtime_error("Failed to remove router interface."); + if (handleSaiRemoveStatus(SAI_API_ROUTER_INTERFACE, status) != task_success) + { + throw runtime_error("Failed to remove router interface."); + } } port.m_rif_id = 0; @@ -1136,7 +1171,10 @@ void IntfsOrch::addIp2MeRoute(sai_object_id_t vrf_id, const IpPrefix &ip_prefix) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create IP2me route ip:%s, rv:%d", ip_prefix.getIp().to_string().c_str(), status); - throw runtime_error("Failed to create IP2me route."); + if (handleSaiCreateStatus(SAI_API_ROUTE, status) != task_success) + { + throw runtime_error("Failed to create IP2me route."); + } } SWSS_LOG_NOTICE("Create IP2me route ip:%s", ip_prefix.getIp().to_string().c_str()); @@ -1162,7 +1200,10 @@ void IntfsOrch::removeIp2MeRoute(sai_object_id_t vrf_id, const IpPrefix &ip_pref if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove IP2me route ip:%s, rv:%d", ip_prefix.getIp().to_string().c_str(), status); - throw runtime_error("Failed to remove IP2me route."); + if (handleSaiRemoveStatus(SAI_API_ROUTE, status) != task_success) + { + throw runtime_error("Failed to remove IP2me route."); + } } SWSS_LOG_NOTICE("Remove packet action trap route ip:%s", ip_prefix.getIp().to_string().c_str()); @@ -1204,7 +1245,10 @@ void IntfsOrch::addDirectedBroadcast(const Port &port, const IpPrefix &ip_prefix { SWSS_LOG_ERROR("Failed to create broadcast entry %s rv:%d", ip_addr.to_string().c_str(), status); - return; + if (handleSaiCreateStatus(SAI_API_NEIGHBOR, status) != task_success) + { + return; + } } SWSS_LOG_NOTICE("Add broadcast route for ip:%s", ip_addr.to_string().c_str()); @@ -1233,13 +1277,17 @@ void IntfsOrch::removeDirectedBroadcast(const Port &port, const IpPrefix &ip_pre if (status == SAI_STATUS_ITEM_NOT_FOUND) { SWSS_LOG_ERROR("No broadcast entry found for %s", ip_addr.to_string().c_str()); + return; } else { SWSS_LOG_ERROR("Failed to remove broadcast entry %s rv:%d", ip_addr.to_string().c_str(), status); + if (handleSaiRemoveStatus(SAI_API_NEIGHBOR, status) != task_success) + { + return; + } } - return; } SWSS_LOG_NOTICE("Remove broadcast route ip:%s", ip_addr.to_string().c_str()); diff --git a/orchagent/macsecorch.cpp b/orchagent/macsecorch.cpp index 71e4719859..8d34975989 100644 --- a/orchagent/macsecorch.cpp +++ b/orchagent/macsecorch.cpp @@ -789,14 +789,19 @@ bool MACsecOrch::initMACsecObject(sai_object_id_t switch_id) attr.id = SAI_MACSEC_ATTR_DIRECTION; attr.value.s32 = SAI_MACSEC_DIRECTION_EGRESS; attrs.push_back(attr); - if (sai_macsec_api->create_macsec( - &macsec_obj.first->second.m_egress_id, - switch_id, - static_cast(attrs.size()), - attrs.data()) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_macsec_api->create_macsec( + &macsec_obj.first->second.m_egress_id, + switch_id, + static_cast(attrs.size()), + attrs.data()); + if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_WARN("Cannot initialize MACsec egress object at the switch 0x%" PRIx64, switch_id); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_MACSEC, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } recover.add_action([&]() { sai_macsec_api->remove_macsec(macsec_obj.first->second.m_egress_id); }); @@ -804,14 +809,19 @@ bool MACsecOrch::initMACsecObject(sai_object_id_t switch_id) attr.id = SAI_MACSEC_ATTR_DIRECTION; attr.value.s32 = SAI_MACSEC_DIRECTION_INGRESS; attrs.push_back(attr); - if (sai_macsec_api->create_macsec( - &macsec_obj.first->second.m_ingress_id, - switch_id, - static_cast(attrs.size()), - attrs.data()) != SAI_STATUS_SUCCESS) + status = sai_macsec_api->create_macsec( + &macsec_obj.first->second.m_ingress_id, + switch_id, + static_cast(attrs.size()), + attrs.data()); + if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_WARN("Cannot initialize MACsec ingress object at the switch 0x%" PRIx64, switch_id); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_MACSEC, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } recover.add_action([&]() { sai_macsec_api->remove_macsec(macsec_obj.first->second.m_ingress_id); }); @@ -847,18 +857,18 @@ bool MACsecOrch::deinitMACsecObject(sai_object_id_t switch_id) bool result = true; - if (sai_macsec_api->remove_macsec( - macsec_obj->second.m_egress_id) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_macsec_api->remove_macsec(macsec_obj->second.m_egress_id); + if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_WARN("Cannot deinitialize MACsec egress object at the switch 0x%" PRIx64, macsec_obj->first); - result &= false; + result &= (handleSaiRemoveStatus(SAI_API_MACSEC, status) == task_success); } - if (sai_macsec_api->remove_macsec( - macsec_obj->second.m_ingress_id) != SAI_STATUS_SUCCESS) + status = sai_macsec_api->remove_macsec(macsec_obj->second.m_ingress_id); + if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_WARN("Cannot deinitialize MACsec ingress object at the switch 0x%" PRIx64, macsec_obj->first); - result &= false; + result &= (handleSaiRemoveStatus(SAI_API_MACSEC, status) == task_success); } m_macsec_objs.erase(macsec_obj); @@ -1005,13 +1015,18 @@ bool MACsecOrch::createMACsecPort( attr.id = SAI_MACSEC_PORT_ATTR_PORT_ID; attr.value.oid = line_port_id; attrs.push_back(attr); - if (sai_macsec_api->create_macsec_port( - &macsec_port_id, - switch_id, - static_cast(attrs.size()), - attrs.data()) != SAI_STATUS_SUCCESS) - { - return false; + sai_status_t status = sai_macsec_api->create_macsec_port( + &macsec_port_id, + switch_id, + static_cast(attrs.size()), + attrs.data()); + if (status != SAI_STATUS_SUCCESS) + { + task_process_status handle_status = handleSaiCreateStatus(SAI_API_MACSEC, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; @@ -1169,10 +1184,14 @@ bool MACsecOrch::deleteMACsecPort( bool MACsecOrch::deleteMACsecPort(sai_object_id_t macsec_port_id) { - if (sai_macsec_api->remove_macsec_port( - macsec_port_id) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_macsec_api->remove_macsec_port(macsec_port_id); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_MACSEC, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -1195,23 +1214,32 @@ bool MACsecOrch::createMACsecFlow( attr.id = SAI_MACSEC_FLOW_ATTR_MACSEC_DIRECTION; attr.value.s32 = direction; attrs.push_back(attr); - if (sai_macsec_api->create_macsec_flow( - &flow_id, - switch_id, - static_cast(attrs.size()), - attrs.data()) != SAI_STATUS_SUCCESS) - { - return false; + sai_status_t status = sai_macsec_api->create_macsec_flow( + &flow_id, + switch_id, + static_cast(attrs.size()), + attrs.data()); + if (status != SAI_STATUS_SUCCESS) + { + task_process_status handle_status = handleSaiCreateStatus(SAI_API_MACSEC, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } bool MACsecOrch::deleteMACsecFlow(sai_object_id_t flow_id) { - if (sai_macsec_api->remove_macsec_flow( - flow_id) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_macsec_api->remove_macsec_flow(flow_id); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_MACSEC, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -1441,14 +1469,19 @@ bool MACsecOrch::createMACsecSC( attr.value.s32 = cipher_suite; attrs.push_back(attr); - if (sai_macsec_api->create_macsec_sc( - &sc_id, - switch_id, - static_cast(attrs.size()), - attrs.data()) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_macsec_api->create_macsec_sc( + &sc_id, + switch_id, + static_cast(attrs.size()), + attrs.data()); + if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_WARN("Cannot create MACsec egress SC 0x%" PRIx64, sci); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_MACSEC, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -1525,10 +1558,14 @@ bool MACsecOrch::deleteMACsecSC(sai_object_id_t sc_id) { SWSS_LOG_ENTER(); - if (sai_macsec_api->remove_macsec_sc( - sc_id) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_macsec_api->remove_macsec_sc(sc_id); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_MACSEC, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -1812,13 +1849,18 @@ bool MACsecOrch::createMACsecSA( attrs.push_back(attr); } - if (sai_macsec_api->create_macsec_sa( - &sa_id, - switch_id, - static_cast(attrs.size()), - attrs.data()) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_macsec_api->create_macsec_sa( + &sa_id, + switch_id, + static_cast(attrs.size()), + attrs.data()); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_MACSEC, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -1826,10 +1868,15 @@ bool MACsecOrch::createMACsecSA( bool MACsecOrch::deleteMACsecSA(sai_object_id_t sa_id) { SWSS_LOG_ENTER(); - if (sai_macsec_api->remove_macsec_sa( - sa_id) != SAI_STATUS_SUCCESS) + + sai_status_t status = sai_macsec_api->remove_macsec_sa(sa_id); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_MACSEC, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -1992,22 +2039,32 @@ bool MACsecOrch::createMACsecACLTable( attr.value.booldata = sci_in_sectag; attrs.push_back(attr); - if (sai_acl_api->create_acl_table( - &table_id, - switch_id, - static_cast(attrs.size()), - attrs.data()) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_acl_api->create_acl_table( + &table_id, + switch_id, + static_cast(attrs.size()), + attrs.data()); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_ACL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } bool MACsecOrch::deleteMACsecACLTable(sai_object_id_t table_id) { - if (sai_acl_api->remove_acl_table(table_id) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_acl_api->remove_acl_table(table_id); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_ACL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -2029,11 +2086,14 @@ bool MACsecOrch::bindMACsecACLTabletoPort( } attr.value.oid = table_id; - if (sai_port_api->set_port_attribute( - port_id, - &attr) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_port_api->set_port_attribute(port_id, &attr); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -2054,11 +2114,14 @@ bool MACsecOrch::unbindMACsecACLTable( } attr.value.oid = SAI_NULL_OBJECT_ID; - if (sai_port_api->set_port_attribute( - port_id, - &attr) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_port_api->set_port_attribute(port_id, &attr); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -2100,13 +2163,18 @@ bool MACsecOrch::createMACsecACLEAPOLEntry( attr.value.aclaction.parameter.s32 = SAI_PACKET_ACTION_FORWARD; attr.value.aclaction.enable = true; attrs.push_back(attr); - if (sai_acl_api->create_acl_entry( - &entry_id, - switch_id, - static_cast(attrs.size()), - attrs.data()) != SAI_STATUS_SUCCESS) - { - return false; + sai_status_t status = sai_acl_api->create_acl_entry( + &entry_id, + switch_id, + static_cast(attrs.size()), + attrs.data()); + if (status != SAI_STATUS_SUCCESS) + { + task_process_status handle_status = handleSaiCreateStatus(SAI_API_ACL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -2141,13 +2209,19 @@ bool MACsecOrch::createMACsecACLDataEntry( attr.value.u64 = sci; attrs.push_back(attr); } - if (sai_acl_api->create_acl_entry( - &entry_id, - switch_id, - static_cast(attrs.size()), - attrs.data()) != SAI_STATUS_SUCCESS) + + sai_status_t status = sai_acl_api->create_acl_entry( + &entry_id, + switch_id, + static_cast(attrs.size()), + attrs.data()); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_ACL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -2160,21 +2234,27 @@ bool MACsecOrch::setMACsecFlowActive(sai_object_id_t entry_id, sai_object_id_t f attr.value.aclaction.parameter.oid = flow_id; attr.value.aclaction.enable = active; - if (sai_acl_api->set_acl_entry_attribute( - entry_id, - &attr) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_acl_api->set_acl_entry_attribute(entry_id, &attr); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_ACL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } attr.id = SAI_ACL_ENTRY_ATTR_ACTION_PACKET_ACTION; attr.value.aclaction.parameter.s32 = SAI_PACKET_ACTION_DROP; attr.value.aclaction.enable = !active; - if (sai_acl_api->set_acl_entry_attribute( - entry_id, - &attr) != SAI_STATUS_SUCCESS) + status = sai_acl_api->set_acl_entry_attribute(entry_id, &attr); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_ACL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; @@ -2182,10 +2262,14 @@ bool MACsecOrch::setMACsecFlowActive(sai_object_id_t entry_id, sai_object_id_t f bool MACsecOrch::deleteMACsecACLEntry(sai_object_id_t entry_id) { - if (sai_acl_api->remove_acl_entry( - entry_id) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_acl_api->remove_acl_entry(entry_id); + if (status != SAI_STATUS_SUCCESS) { - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_ACL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } diff --git a/orchagent/mirrororch.cpp b/orchagent/mirrororch.cpp index 8a19df52e4..f62a1cf256 100644 --- a/orchagent/mirrororch.cpp +++ b/orchagent/mirrororch.cpp @@ -756,7 +756,11 @@ bool MirrorOrch::setUnsetPortMirror(Port port, SWSS_LOG_ERROR("Failed to configure %s session on port %s: %s, status %d, sessionId %x", ingress ? "RX" : "TX", port.m_alias.c_str(), p.m_alias.c_str(), status, sessionId); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } } @@ -767,7 +771,11 @@ bool MirrorOrch::setUnsetPortMirror(Port port, { SWSS_LOG_ERROR("Failed to configure %s session on port %s, status %d, sessionId %x", ingress ? "RX" : "TX", port.m_alias.c_str(), status, sessionId); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } return true; @@ -940,7 +948,11 @@ bool MirrorOrch::activateSession(const string& name, MirrorEntry& session) SWSS_LOG_ERROR("Failed to activate mirroring session %s", name.c_str()); session.status = false; - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_MIRROR, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } session.status = true; @@ -991,7 +1003,11 @@ bool MirrorOrch::deactivateSession(const string& name, MirrorEntry& session) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to deactivate mirroring session %s", name.c_str()); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_MIRROR, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } session.status = false; @@ -1019,7 +1035,11 @@ bool MirrorOrch::updateSessionDstMac(const string& name, MirrorEntry& session) { SWSS_LOG_ERROR("Failed to update mirror session %s destination MAC to %s, rv:%d", name.c_str(), session.neighborInfo.mac.to_string().c_str(), status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_MIRROR, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Update mirror session %s destination MAC to %s", @@ -1049,7 +1069,11 @@ bool MirrorOrch::updateSessionDstPort(const string& name, MirrorEntry& session) { SWSS_LOG_ERROR("Failed to update mirror session %s monitor port to %s, rv:%d", name.c_str(), port.m_alias.c_str(), status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_MIRROR, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Update mirror session %s monitor port to %s", @@ -1106,7 +1130,11 @@ bool MirrorOrch::updateSessionType(const string& name, MirrorEntry& session) { SWSS_LOG_ERROR("Failed to update mirror session %s VLAN to %s, rv:%d", name.c_str(), session.neighborInfo.port.m_alias.c_str(), status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_MIRROR, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } diff --git a/orchagent/natorch.cpp b/orchagent/natorch.cpp index 6bec777083..0eefbad6a2 100644 --- a/orchagent/natorch.cpp +++ b/orchagent/natorch.cpp @@ -778,7 +778,11 @@ bool NatOrch::addHwDnatEntry(const IpAddress &ip_address) SWSS_LOG_ERROR("Failed to create %s DNAT NAT entry with ip %s and it's translated ip %s", entry.entry_type.c_str(), ip_address.to_string().c_str(), entry.translated_ip.to_string().c_str()); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Created %s DNAT NAT entry with ip %s and it's translated ip %s", @@ -859,7 +863,11 @@ bool NatOrch::addHwDnaptEntry(const NaptEntryKey &key) SWSS_LOG_ERROR("Failed to create %s DNAT NAPT entry with ip %s, port %d, prototype %s and it's translated ip %s, translated port %d", entry.entry_type.c_str(), key.ip_address.to_string().c_str(), key.l4_port, key.prototype.c_str(), entry.translated_ip.to_string().c_str(), entry.translated_l4_port); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Created %s DNAT NAPT entry with ip %s, port %d, prototype %s and it's translated ip %s, translated port %d", @@ -928,7 +936,11 @@ bool NatOrch::removeHwDnatEntry(const IpAddress &dstIp) SWSS_LOG_INFO("Failed to remove %s DNAT NAT entry with ip %s and it's translated ip %s", entry.entry_type.c_str(), dstIp.to_string().c_str(), entry.translated_ip.to_string().c_str()); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Removed %s DNAT NAT entry with ip %s and it's translated ip %s", @@ -1014,7 +1026,11 @@ bool NatOrch::removeHwTwiceNatEntry(const TwiceNatEntryKey &key) SWSS_LOG_INFO("Failed to remove Twice NAT entry with src-ip %s, dst-ip %s", key.src_ip.to_string().c_str(), key.dst_ip.to_string().c_str()); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Removed Twice NAT entry with src-ip %s, dst-ip %s", key.src_ip.to_string().c_str(), key.dst_ip.to_string().c_str()); @@ -1110,7 +1126,11 @@ bool NatOrch::removeHwDnaptEntry(const NaptEntryKey &key) entry.translated_ip.to_string().c_str(), entry.translated_l4_port); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Removed %s DNAT NAPT entry with ip %s, port %d, prototype %s and it's translated ip %s, translated port %d", @@ -1205,7 +1225,11 @@ bool NatOrch::removeHwTwiceNaptEntry(const TwiceNaptEntryKey &key) SWSS_LOG_INFO("Failed to remove Twice NAPT entry with prototype %s, src-ip %s, src port %d, dst-ip %s, dst port %d", key.prototype.c_str(), key.src_ip.to_string().c_str(), key.src_l4_port, key.dst_ip.to_string().c_str(), key.dst_l4_port); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Removed Twice NAPT entry with prototype %s, src-ip %s, src port %d, dst-ip %s, dst port %d", @@ -1299,7 +1323,11 @@ bool NatOrch::addHwSnatEntry(const IpAddress &ip_address) SWSS_LOG_ERROR("Failed to create %s SNAT NAT entry with ip %s and it's translated ip %s", entry.entry_type.c_str(), ip_address.to_string().c_str(), entry.translated_ip.to_string().c_str()); - return true; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Created %s SNAT NAT entry with ip %s and it's translated ip %s", @@ -1379,7 +1407,11 @@ bool NatOrch::addHwTwiceNatEntry(const TwiceNatEntryKey &key) value.entry_type.c_str(), key.src_ip.to_string().c_str(), key.dst_ip.to_string().c_str(), value.translated_src_ip.to_string().c_str(), value.translated_dst_ip.to_string().c_str()); - return true; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Created %s Twice NAT entry with src ip %s, dst ip %s, translated src ip %s, translated dst ip %s", @@ -1467,7 +1499,11 @@ bool NatOrch::addHwSnaptEntry(const NaptEntryKey &keyEntry) entry.entry_type.c_str(), keyEntry.ip_address.to_string().c_str(), keyEntry.l4_port, keyEntry.prototype.c_str(), entry.translated_ip.to_string().c_str(), entry.translated_l4_port); - return true; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Created %s SNAT NAPT entry with ip %s, port %d, prototype %s and it's translated ip %s, translated port %d", @@ -1562,7 +1598,11 @@ bool NatOrch::addHwTwiceNaptEntry(const TwiceNaptEntryKey &key) key.dst_l4_port, key.prototype.c_str(), value.translated_src_ip.to_string().c_str(), value.translated_src_l4_port, value.translated_dst_ip.to_string().c_str(), value.translated_dst_l4_port); - return true; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } @@ -1796,7 +1836,11 @@ bool NatOrch::addHwDnatPoolEntry(const IpAddress &ip_address) { SWSS_LOG_ERROR("Failed to create DNAT Pool entry with ip %s", ip_address.to_string().c_str()); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Created DNAT Pool entry with ip %s", ip_address.to_string().c_str()); @@ -1826,7 +1870,11 @@ bool NatOrch::removeHwDnatPoolEntry(const IpAddress &dstIp) { SWSS_LOG_INFO("Failed to remove DNAT Pool entry with ip %s", dstIp.to_string().c_str()); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NAT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Removed DNAT Pool entry with ip %s", dstIp.to_string().c_str()); @@ -2542,6 +2590,7 @@ void NatOrch::enableNatFeature(void) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to enable NAT: %d", status); + handleSaiSetStatus(SAI_API_SWITCH, status); } SWSS_LOG_INFO("NAT Query timer start "); @@ -2580,6 +2629,7 @@ void NatOrch::disableNatFeature(void) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to disable NAT: %d", status); + handleSaiSetStatus(SAI_API_SWITCH, status); } SWSS_LOG_INFO("NAT Query timer stop "); @@ -3663,6 +3713,7 @@ bool NatOrch::setNatCounters(const NatEntry::iterator &iter) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to clear packet counter for SNAT entry [src-ip %s]", ipAddr.to_string().c_str()); + handleSaiSetStatus(SAI_API_NAT, status); } } else if (entry.nat_type == "dnat") @@ -3670,6 +3721,7 @@ bool NatOrch::setNatCounters(const NatEntry::iterator &iter) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to clear packet counter for DNAT entry [dst-ip %s]", ipAddr.to_string().c_str()); + handleSaiSetStatus(SAI_API_NAT, status); } } @@ -3680,6 +3732,7 @@ bool NatOrch::setNatCounters(const NatEntry::iterator &iter) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to clear byte counter for SNAT entry [src-ip %s]", ipAddr.to_string().c_str()); + handleSaiSetStatus(SAI_API_NAT, status); } } else if (entry.nat_type == "dnat") @@ -3687,6 +3740,7 @@ bool NatOrch::setNatCounters(const NatEntry::iterator &iter) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to clear byte counter for DNAT entry [dst-ip %s]", ipAddr.to_string().c_str()); + handleSaiSetStatus(SAI_API_NAT, status); } } /* Update the Counter values in the database */ @@ -3897,6 +3951,7 @@ bool NatOrch::setNaptCounters(const NaptEntry::iterator &iter) { SWSS_LOG_ERROR("Failed to clear packet counter for SNAPT entry for [proto %s, src-ip %s, src-port %d", naptKey.prototype.c_str(), naptKey.ip_address.to_string().c_str(), naptKey.l4_port); + handleSaiSetStatus(SAI_API_NAT, status); } } else if (entry.nat_type == "dnat") @@ -3905,6 +3960,7 @@ bool NatOrch::setNaptCounters(const NaptEntry::iterator &iter) { SWSS_LOG_ERROR("Failed to clear packet counter for DNAPT entry for [proto %s, dst-ip %s, dst-port %d]", naptKey.prototype.c_str(), naptKey.ip_address.to_string().c_str(), naptKey.l4_port); + handleSaiSetStatus(SAI_API_NAT, status); } } @@ -3916,6 +3972,7 @@ bool NatOrch::setNaptCounters(const NaptEntry::iterator &iter) { SWSS_LOG_ERROR("Failed to clear byte counter for SNAPT entry for [proto %s, src-ip %s, src-port %d", naptKey.prototype.c_str(), naptKey.ip_address.to_string().c_str(), naptKey.l4_port); + handleSaiSetStatus(SAI_API_NAT, status); } } else if (entry.nat_type == "dnat") @@ -3924,6 +3981,7 @@ bool NatOrch::setNaptCounters(const NaptEntry::iterator &iter) { SWSS_LOG_ERROR("Failed to clear byte counter for DNAPT entry for [proto %s, dst-ip %s, dst-port %d]", naptKey.prototype.c_str(), naptKey.ip_address.to_string().c_str(), naptKey.l4_port); + handleSaiSetStatus(SAI_API_NAT, status); } } @@ -3971,6 +4029,7 @@ bool NatOrch::setTwiceNatCounters(const TwiceNatEntry::iterator &iter) { SWSS_LOG_ERROR("Failed to clear packet counters for Twice NAT entry [src-ip %s, dst-ip %s]", key.src_ip.to_string().c_str(), key.dst_ip.to_string().c_str()); + handleSaiSetStatus(SAI_API_NAT, status); } status = sai_nat_api->set_nat_entry_attribute(&dbl_nat_entry, &nat_entry_attr_byte); @@ -3979,6 +4038,7 @@ bool NatOrch::setTwiceNatCounters(const TwiceNatEntry::iterator &iter) { SWSS_LOG_ERROR("Failed to clear byte counters for Twice NAT entry [src-ip %s, dst-ip %s]", key.src_ip.to_string().c_str(), key.dst_ip.to_string().c_str()); + handleSaiSetStatus(SAI_API_NAT, status); } /* Update the Counter values in the database */ @@ -4032,6 +4092,7 @@ bool NatOrch::setTwiceNaptCounters(const TwiceNaptEntry::iterator &iter) { SWSS_LOG_ERROR("Failed to clear packet counters for Twice NAPT entry [src-ip %s, src port %d, dst-ip %s, dst port %d]", key.src_ip.to_string().c_str(), key.src_l4_port, key.dst_ip.to_string().c_str(), key.dst_l4_port); + handleSaiSetStatus(SAI_API_NAT, status); } status = sai_nat_api->set_nat_entry_attribute(&dbl_nat_entry, &nat_entry_attr_byte); @@ -4040,6 +4101,7 @@ bool NatOrch::setTwiceNaptCounters(const TwiceNaptEntry::iterator &iter) { SWSS_LOG_ERROR("Failed to clear byte counters for Twice NAPT entry [src-ip %s, src port %d, dst-ip %s, dst port %d]", key.src_ip.to_string().c_str(), key.src_l4_port, key.dst_ip.to_string().c_str(), key.dst_l4_port); + handleSaiSetStatus(SAI_API_NAT, status); } /* Update the Counter values in the database */ diff --git a/orchagent/neighorch.cpp b/orchagent/neighorch.cpp index cc3ee64401..dfc2ded2ec 100644 --- a/orchagent/neighorch.cpp +++ b/orchagent/neighorch.cpp @@ -204,7 +204,11 @@ bool NeighOrch::addNextHop(const IpAddress &ipAddress, const string &alias) { SWSS_LOG_ERROR("Failed to create next hop %s on %s, rv:%d", ipAddress.to_string().c_str(), alias.c_str(), status); - return handleSaiCreateStatus(SAI_API_NEXT_HOP, status); + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NEXT_HOP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Created next hop %s on %s", @@ -678,7 +682,11 @@ bool NeighOrch::addNeighbor(const NeighborEntry &neighborEntry, const MacAddress { SWSS_LOG_ERROR("Failed to create neighbor %s on %s, rv:%d", macAddress.to_string().c_str(), alias.c_str(), status); - return handleSaiCreateStatus(SAI_API_NEIGHBOR, status); + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NEIGHBOR, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } SWSS_LOG_NOTICE("Created neighbor ip %s, %s on %s", ip_address.to_string().c_str(), @@ -701,7 +709,11 @@ bool NeighOrch::addNeighbor(const NeighborEntry &neighborEntry, const MacAddress { SWSS_LOG_ERROR("Failed to remove neighbor %s on %s, rv:%d", macAddress.to_string().c_str(), alias.c_str(), status); - return handleSaiRemoveStatus(SAI_API_NEIGHBOR, status); + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NEIGHBOR, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_intfsOrch->decreaseRouterIntfsRefCount(alias); @@ -725,7 +737,11 @@ bool NeighOrch::addNeighbor(const NeighborEntry &neighborEntry, const MacAddress { SWSS_LOG_ERROR("Failed to update neighbor %s on %s, rv:%d", macAddress.to_string().c_str(), alias.c_str(), status); - return handleSaiSetStatus(SAI_API_NEIGHBOR, status); + task_process_status handle_status = handleSaiSetStatus(SAI_API_NEIGHBOR, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Updated neighbor %s on %s", macAddress.to_string().c_str(), alias.c_str()); } @@ -798,7 +814,11 @@ bool NeighOrch::removeNeighbor(const NeighborEntry &neighborEntry, bool disable) { SWSS_LOG_ERROR("Failed to remove next hop %s on %s, rv:%d", ip_address.to_string().c_str(), alias.c_str(), status); - return handleSaiRemoveStatus(SAI_API_NEXT_HOP, status); + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NEXT_HOP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } @@ -830,7 +850,11 @@ bool NeighOrch::removeNeighbor(const NeighborEntry &neighborEntry, bool disable) { SWSS_LOG_ERROR("Failed to remove neighbor %s on %s, rv:%d", m_syncdNeighbors[neighborEntry].mac.to_string().c_str(), alias.c_str(), status); - return handleSaiRemoveStatus(SAI_API_NEIGHBOR, status); + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NEIGHBOR, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } diff --git a/orchagent/orch.cpp b/orchagent/orch.cpp index 6de6f189f7..464e6aa688 100644 --- a/orchagent/orch.cpp +++ b/orchagent/orch.cpp @@ -686,13 +686,14 @@ Executor *Orch::getExecutor(string executorName) return NULL; } -bool Orch::handleSaiCreateStatus(sai_api_t api, sai_status_t status, void *context) +task_process_status Orch::handleSaiCreateStatus(sai_api_t api, sai_status_t status, void *context) { /* * This function aims to provide coarse handling of failures in sairedis create * operation (i.e., notify users by throwing excepions when failures happen). - * Return value: true - Handled the status successfully. No need to retry this SAI operation. - * false - Cannot handle the status. Need to retry the SAI operation. + * Return value: task_success - Handled the status successfully. No need to retry this SAI operation. + * task_need_retry - Cannot handle the status. Need to retry the SAI operation. + * task_failed - Failed to handle the status but another attempt is unlikely to resolve the failure. * TODO: 1. Add general handling logic for specific statuses (e.g., SAI_STATUS_ITEM_ALREADY_EXISTS) * 2. Develop fine-grain failure handling mechanisms and replace this coarse handling * in each orch. @@ -702,22 +703,23 @@ bool Orch::handleSaiCreateStatus(sai_api_t api, sai_status_t status, void *conte { case SAI_STATUS_SUCCESS: SWSS_LOG_WARN("SAI_STATUS_SUCCESS is not expected in handleSaiCreateStatus"); - return true; + return task_success; default: SWSS_LOG_ERROR("Encountered failure in create operation, exiting orchagent, SAI API: %s, status: %s", sai_serialize_api(api).c_str(), sai_serialize_status(status).c_str()); exit(EXIT_FAILURE); } - return false; + return task_need_retry; } -bool Orch::handleSaiSetStatus(sai_api_t api, sai_status_t status, void *context) +task_process_status Orch::handleSaiSetStatus(sai_api_t api, sai_status_t status, void *context) { /* * This function aims to provide coarse handling of failures in sairedis set * operation (i.e., notify users by throwing excepions when failures happen). - * Return value: true - Handled the status successfully. No need to retry this SAI operation. - * false - Cannot handle the status. Need to retry the SAI operation. + * Return value: task_success - Handled the status successfully. No need to retry this SAI operation. + * task_need_retry - Cannot handle the status. Need to retry the SAI operation. + * task_failed - Failed to handle the status but another attempt is unlikely to resolve the failure. * TODO: 1. Add general handling logic for specific statuses * 2. Develop fine-grain failure handling mechanisms and replace this coarse handling * in each orch. @@ -727,22 +729,23 @@ bool Orch::handleSaiSetStatus(sai_api_t api, sai_status_t status, void *context) { case SAI_STATUS_SUCCESS: SWSS_LOG_WARN("SAI_STATUS_SUCCESS is not expected in handleSaiSetStatus"); - return true; + return task_success; default: SWSS_LOG_ERROR("Encountered failure in set operation, exiting orchagent, SAI API: %s, status: %s", sai_serialize_api(api).c_str(), sai_serialize_status(status).c_str()); exit(EXIT_FAILURE); } - return false; + return task_need_retry; } -bool Orch::handleSaiRemoveStatus(sai_api_t api, sai_status_t status, void *context) +task_process_status Orch::handleSaiRemoveStatus(sai_api_t api, sai_status_t status, void *context) { /* * This function aims to provide coarse handling of failures in sairedis remove * operation (i.e., notify users by throwing excepions when failures happen). - * Return value: true - Handled the status successfully. No need to retry this SAI operation. - * false - Cannot handle the status. Need to retry the SAI operation. + * Return value: task_success - Handled the status successfully. No need to retry this SAI operation. + * task_need_retry - Cannot handle the status. Need to retry the SAI operation. + * task_failed - Failed to handle the status but another attempt is unlikely to resolve the failure. * TODO: 1. Add general handling logic for specific statuses (e.g., SAI_STATUS_OBJECT_IN_USE, * SAI_STATUS_ITEM_NOT_FOUND) * 2. Develop fine-grain failure handling mechanisms and replace this coarse handling @@ -753,13 +756,32 @@ bool Orch::handleSaiRemoveStatus(sai_api_t api, sai_status_t status, void *conte { case SAI_STATUS_SUCCESS: SWSS_LOG_WARN("SAI_STATUS_SUCCESS is not expected in handleSaiRemoveStatus"); - return true; + return task_success; default: SWSS_LOG_ERROR("Encountered failure in remove operation, exiting orchagent, SAI API: %s, status: %s", sai_serialize_api(api).c_str(), sai_serialize_status(status).c_str()); exit(EXIT_FAILURE); } - return false; + return task_need_retry; +} + +bool Orch::parseHandleSaiStatusFailure(task_process_status status) +{ + /* + * This function parses task process status from SAI failure handling function to whether a retry is needed. + * Return value: true - no retry is needed. + * false - retry is needed. + */ + switch (status) + { + case task_need_retry: + return false; + case task_failed: + return true; + default: + SWSS_LOG_WARN("task_process_status %d is not expected in parseHandleSaiStatusFailure", status); + } + return true; } void Orch2::doTask(Consumer &consumer) diff --git a/orchagent/orch.h b/orchagent/orch.h index fcecf98a22..b61cdb53e2 100644 --- a/orchagent/orch.h +++ b/orchagent/orch.h @@ -237,9 +237,10 @@ class Orch Executor *getExecutor(std::string executorName); /* Handling SAI status*/ - virtual bool handleSaiCreateStatus(sai_api_t api, sai_status_t status, void *context = nullptr); - virtual bool handleSaiSetStatus(sai_api_t api, sai_status_t status, void *context = nullptr); - virtual bool handleSaiRemoveStatus(sai_api_t api, sai_status_t status, void *context = nullptr); + virtual task_process_status handleSaiCreateStatus(sai_api_t api, sai_status_t status, void *context = nullptr); + virtual task_process_status handleSaiSetStatus(sai_api_t api, sai_status_t status, void *context = nullptr); + virtual task_process_status handleSaiRemoveStatus(sai_api_t api, sai_status_t status, void *context = nullptr); + bool parseHandleSaiStatusFailure(task_process_status status); private: void removeMeFromObjsReferencedByMe(type_map &type_maps, const std::string &table, const std::string &obj_name, const std::string &field, const std::string &old_referenced_obj_name); void addConsumer(swss::DBConnector *db, std::string tableName, int pri = default_orch_pri); diff --git a/orchagent/policerorch.cpp b/orchagent/policerorch.cpp index 14b97f4ac8..c4528f6330 100644 --- a/orchagent/policerorch.cpp +++ b/orchagent/policerorch.cpp @@ -224,8 +224,11 @@ void PolicerOrch::doTask(Consumer &consumer) { SWSS_LOG_ERROR("Failed to create policer %s, rv:%d", key.c_str(), status); - it++; - continue; + if (handleSaiCreateStatus(SAI_API_POLICER, status) == task_need_retry) + { + it++; + continue; + } } SWSS_LOG_NOTICE("Created policer %s", key.c_str()); @@ -258,8 +261,11 @@ void PolicerOrch::doTask(Consumer &consumer) { SWSS_LOG_ERROR("Failed to update policer %s attribute, rv:%d", key.c_str(), status); - it++; - continue; + if (handleSaiSetStatus(SAI_API_POLICER, status) == task_need_retry) + { + it++; + continue; + } } } @@ -290,8 +296,11 @@ void PolicerOrch::doTask(Consumer &consumer) { SWSS_LOG_ERROR("Failed to remove policer %s, rv:%d", key.c_str(), status); - it++; - continue; + if (handleSaiRemoveStatus(SAI_API_POLICER, status) == task_need_retry) + { + it++; + continue; + } } SWSS_LOG_NOTICE("Removed policer %s", key.c_str()); diff --git a/orchagent/portsorch.cpp b/orchagent/portsorch.cpp index 57b3df9555..fb9817ec5b 100755 --- a/orchagent/portsorch.cpp +++ b/orchagent/portsorch.cpp @@ -830,11 +830,16 @@ bool PortsOrch::setPortAdminStatus(Port &port, bool state) attr.id = SAI_PORT_ATTR_ADMIN_STATE; attr.value.booldata = state; - if (sai_port_api->set_port_attribute(port.m_port_id, &attr) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_port_api->set_port_attribute(port.m_port_id, &attr); + if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set admin status %s to port pid:%" PRIx64, state ? "UP" : "DOWN", port.m_port_id); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_INFO("Set admin status %s to port pid:%" PRIx64, @@ -880,7 +885,11 @@ bool PortsOrch::setPortMtu(sai_object_id_t id, sai_uint32_t mtu) { SWSS_LOG_ERROR("Failed to set MTU %u to port pid:%" PRIx64 ", rv:%d", attr.value.u32, id, status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_INFO("Set MTU %u to port pid:%" PRIx64, attr.value.u32, id); return true; @@ -894,10 +903,15 @@ bool PortsOrch::setPortFec(Port &port, sai_port_fec_mode_t mode) attr.id = SAI_PORT_ATTR_FEC_MODE; attr.value.s32 = mode; - if (sai_port_api->set_port_attribute(port.m_port_id, &attr) != SAI_STATUS_SUCCESS) + sai_status_t status = sai_port_api->set_port_attribute(port.m_port_id, &attr); + if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set fec mode %d to port pid:%" PRIx64, mode, port.m_port_id); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_INFO("Set fec mode %d to port pid:%" PRIx64, mode, port.m_port_id); @@ -957,7 +971,11 @@ bool PortsOrch::setPortPfc(sai_object_id_t portId, uint8_t pfc_bitmask) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set PFC 0x%x to port id 0x%" PRIx64 " (rc:%d)", attr.value.u8, portId, status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } if (p.m_pfc_bitmask != pfc_bitmask) @@ -1005,7 +1023,11 @@ bool PortsOrch::setPortPfcAsym(Port &port, string pfc_asym) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set PFC mode %d to port id 0x%" PRIx64 " (rc:%d)", port.m_pfc_asym, port.m_port_id, status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } if (!setPortPfc(port.m_port_id, pfc)) @@ -1022,7 +1044,11 @@ bool PortsOrch::setPortPfcAsym(Port &port, string pfc_asym) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set RX PFC 0x%x to port id 0x%" PRIx64 " (rc:%d)", attr.value.u8, port.m_port_id, status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } @@ -1068,6 +1094,16 @@ bool PortsOrch::bindUnbindAclTableGroup(Port &port, attr.id = ingress ? SAI_PORT_ATTR_INGRESS_ACL : SAI_PORT_ATTR_EGRESS_ACL; status = sai_port_api->set_port_attribute(port.m_port_id, &attr); + if (SAI_STATUS_SUCCESS != status) + { + SWSS_LOG_ERROR("Failed to %s %s to ACL table group %" PRIx64 ", rv:%d", + bind_str.c_str(), port.m_alias.c_str(), attr.value.oid, status); + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } + } break; } case Port::LAG: @@ -1075,6 +1111,16 @@ bool PortsOrch::bindUnbindAclTableGroup(Port &port, attr.id = ingress ? SAI_LAG_ATTR_INGRESS_ACL : SAI_LAG_ATTR_EGRESS_ACL; status = sai_lag_api->set_lag_attribute(port.m_lag_id, &attr); + if (SAI_STATUS_SUCCESS != status) + { + SWSS_LOG_ERROR("Failed to %s %s to ACL table group %" PRIx64 ", rv:%d", + bind_str.c_str(), port.m_alias.c_str(), attr.value.oid, status); + task_process_status handle_status = handleSaiSetStatus(SAI_API_LAG, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } + } break; } case Port::VLAN: @@ -1084,6 +1130,16 @@ bool PortsOrch::bindUnbindAclTableGroup(Port &port, status = sai_vlan_api->set_vlan_attribute(port.m_vlan_info.vlan_oid, &attr); + if (SAI_STATUS_SUCCESS != status) + { + SWSS_LOG_ERROR("Failed to %s %s to ACL table group %" PRIx64 ", rv:%d", + bind_str.c_str(), port.m_alias.c_str(), attr.value.oid, status); + task_process_status handle_status = handleSaiSetStatus(SAI_API_VLAN, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } + } break; } default: @@ -1094,13 +1150,6 @@ bool PortsOrch::bindUnbindAclTableGroup(Port &port, } } - if (SAI_STATUS_SUCCESS != status) - { - SWSS_LOG_ERROR("Failed to %s %s to ACL table group %" PRIx64 ", rv:%d", - bind_str.c_str(), port.m_alias.c_str(), attr.value.oid, status); - return false; - } - return true; } @@ -1158,7 +1207,11 @@ bool PortsOrch::unbindRemoveAclTableGroup(sai_object_id_t port_oid, if (SAI_STATUS_SUCCESS != status) { SWSS_LOG_ERROR("Failed to remove ACL table group, rv:%d", status); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_ACL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } sai_acl_bind_point_type_t bind_type; if (!getSaiAclBindPointType(port.m_type, bind_type)) @@ -1241,7 +1294,11 @@ bool PortsOrch::createBindAclTableGroup(sai_object_id_t port_oid, if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create ACL table group, rv:%d", status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_ACL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } assert(group_oid_ref != SAI_NULL_OBJECT_ID); @@ -1284,7 +1341,11 @@ bool PortsOrch::unbindAclTable(sai_object_id_t port_oid, if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove ACL group member: %" PRIu64 " ", acl_group_member_oid); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_ACL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } @@ -1351,7 +1412,11 @@ bool PortsOrch::bindAclTable(sai_object_id_t port_oid, { SWSS_LOG_ERROR("Failed to create member in ACL table group %" PRIx64 " for ACL table %" PRIx64 ", rv:%d", group_oid, table_oid, status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_ACL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } Port port; @@ -1390,7 +1455,11 @@ bool PortsOrch::setPortPvid(Port &port, sai_uint32_t pvid) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set pvid %u to port: %s", attr.value.u32, port.m_alias.c_str()); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Set pvid %u to port: %s", attr.value.u32, port.m_alias.c_str()); } @@ -1404,7 +1473,11 @@ bool PortsOrch::setPortPvid(Port &port, sai_uint32_t pvid) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set pvid %u to lag: %s", attr.value.u32, port.m_alias.c_str()); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_LAG, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Set pvid %u to lag: %s", attr.value.u32, port.m_alias.c_str()); } @@ -1472,7 +1545,11 @@ bool PortsOrch::setHostIntfsStripTag(Port &port, sai_hostif_vlan_tag_t strip) { SWSS_LOG_ERROR("Failed to set %s to host interface %s", hostif_vlan_tag[strip], p.m_alias.c_str()); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_HOSTIF, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Set %s to host interface: %s", hostif_vlan_tag[strip], p.m_alias.c_str()); @@ -1660,11 +1737,16 @@ bool PortsOrch::setGearboxPortAttr(Port &port, dest_port_type_t port_type, sai_p else { SWSS_LOG_ERROR("BOX: Failed to set %s port attribute %d", port.m_alias.c_str(), id); + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } } - return status == SAI_STATUS_SUCCESS; + return true; } bool PortsOrch::setPortSpeed(Port &port, sai_uint32_t speed) @@ -1678,13 +1760,17 @@ bool PortsOrch::setPortSpeed(Port &port, sai_uint32_t speed) attr.value.u32 = speed; status = sai_port_api->set_port_attribute(port.m_port_id, &attr); - - if (status == SAI_STATUS_SUCCESS) + if (status != SAI_STATUS_SUCCESS) { - setGearboxPortsAttr(port, SAI_PORT_ATTR_SPEED, &speed); + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } - return status == SAI_STATUS_SUCCESS; + setGearboxPortsAttr(port, SAI_PORT_ATTR_SPEED, &speed); + return true; } bool PortsOrch::getPortSpeed(sai_object_id_t id, sai_uint32_t &speed) @@ -1720,8 +1806,16 @@ bool PortsOrch::setPortAdvSpeed(sai_object_id_t port_id, sai_uint32_t speed) attr.value.u32list.count = static_cast(speeds.size()); status = sai_port_api->set_port_attribute(port_id, &attr); + if (status != SAI_STATUS_SUCCESS) + { + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } + } - return status == SAI_STATUS_SUCCESS; + return true; } bool PortsOrch::getQueueTypeAndIndex(sai_object_id_t queue_id, string &type, uint8_t &index) @@ -1779,7 +1873,11 @@ bool PortsOrch::setPortAutoNeg(sai_object_id_t id, int an) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set AutoNeg %u to port pid:%" PRIx64, attr.value.booldata, id); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_INFO("Set AutoNeg %u to port pid:%" PRIx64, attr.value.booldata, id); return true; @@ -1861,7 +1959,11 @@ bool PortsOrch::addPort(const set &lane_set, uint32_t speed, int an, string if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create port with the speed %u, rv:%d", speed, status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_portListLaneMap[lane_set] = port_id; @@ -3447,7 +3549,11 @@ bool PortsOrch::addHostIntfs(Port &port, string alias, sai_object_id_t &host_int if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create host interface for port %s", alias.c_str()); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_HOSTIF, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Create host interface for port %s", alias.c_str()); @@ -3470,7 +3576,11 @@ bool PortsOrch::setBridgePortLearningFDB(Port &port, sai_bridge_port_fdb_learnin if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set bridge port %" PRIx64 " learning_mode attribute: %d", bridge_port_id, status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_BRIDGE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Disable FDB learning on bridge port %s(%" PRIx64 ")", port.m_alias.c_str(), bridge_port_id); return true; @@ -3552,7 +3662,11 @@ bool PortsOrch::addBridgePort(Port &port) { SWSS_LOG_ERROR("Failed to add bridge port %s to default 1Q bridge, rv:%d", port.m_alias.c_str(), status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_BRIDGE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } if (!setHostIntfsStripTag(port, SAI_HOSTIF_VLAN_TAG_KEEP)) @@ -3585,7 +3699,11 @@ bool PortsOrch::removeBridgePort(Port &port) { SWSS_LOG_ERROR("Failed to set bridge port %s admin status to DOWN, rv:%d", port.m_alias.c_str(), status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_BRIDGE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } if (!setHostIntfsStripTag(port, SAI_HOSTIF_VLAN_TAG_STRIP)) @@ -3605,7 +3723,11 @@ bool PortsOrch::removeBridgePort(Port &port) { SWSS_LOG_ERROR("Failed to remove bridge port %s from default 1Q bridge, rv:%d", port.m_alias.c_str(), status); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_BRIDGE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } port.m_bridge_port_id = SAI_NULL_OBJECT_ID; @@ -3641,7 +3763,11 @@ bool PortsOrch::setBridgePortLearnMode(Port &port, string learn_mode) { SWSS_LOG_ERROR("Failed to set bridge port %s learning mode, rv:%d", port.m_alias.c_str(), status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_BRIDGE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Set bridge port %s learning mode %s", port.m_alias.c_str(), learn_mode.c_str()); @@ -3664,7 +3790,11 @@ bool PortsOrch::addVlan(string vlan_alias) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create VLAN %s vid:%hu", vlan_alias.c_str(), vlan_id); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_VLAN, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Create an empty VLAN %s vid:%hu", vlan_alias.c_str(), vlan_id); @@ -3710,7 +3840,11 @@ bool PortsOrch::removeVlan(Port vlan) { SWSS_LOG_ERROR("Failed to remove VLAN %s vid:%hu", vlan.m_alias.c_str(), vlan.m_vlan_info.vlan_id); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_VLAN, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } removeAclTableGroup(vlan); @@ -3773,7 +3907,11 @@ bool PortsOrch::addVlanMember(Port &vlan, Port &port, string &tagging_mode) { SWSS_LOG_ERROR("Failed to add member %s to VLAN %s vid:%hu pid:%" PRIx64, port.m_alias.c_str(), vlan.m_alias.c_str(), vlan.m_vlan_info.vlan_id, port.m_port_id); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_VLAN, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Add member %s to VLAN %s vid:%hu pid%" PRIx64, port.m_alias.c_str(), vlan.m_alias.c_str(), vlan.m_vlan_info.vlan_id, port.m_port_id); @@ -3818,7 +3956,11 @@ bool PortsOrch::removeVlanMember(Port &vlan, Port &port) { SWSS_LOG_ERROR("Failed to remove member %s from VLAN %s vid:%hx vmid:%" PRIx64, port.m_alias.c_str(), vlan.m_alias.c_str(), vlan.m_vlan_info.vlan_id, vlan_member_id); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_VLAN, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } port.m_vlan_members.erase(vlan_member); SWSS_LOG_NOTICE("Remove member %s from VLAN %s lid:%hx vmid:%" PRIx64, @@ -3861,7 +4003,11 @@ bool PortsOrch::addLag(string lag_alias) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create LAG %s lid:%" PRIx64, lag_alias.c_str(), lag_id); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_LAG, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Create an empty LAG %s lid:%" PRIx64, lag_alias.c_str(), lag_id); @@ -3911,7 +4057,11 @@ bool PortsOrch::removeLag(Port lag) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove LAG %s lid:%" PRIx64, lag.m_alias.c_str(), lag.m_lag_id); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_LAG, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Remove LAG %s lid:%" PRIx64, lag.m_alias.c_str(), lag.m_lag_id); @@ -3981,7 +4131,11 @@ bool PortsOrch::addLagMember(Port &lag, Port &port, bool enableForwarding) { SWSS_LOG_ERROR("Failed to add member %s to LAG %s lid:%" PRIx64 " pid:%" PRIx64, port.m_alias.c_str(), lag.m_alias.c_str(), lag.m_lag_id, port.m_port_id); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_LAG, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Add member %s to LAG %s lid:%" PRIx64 " pid:%" PRIx64, @@ -4018,7 +4172,11 @@ bool PortsOrch::removeLagMember(Port &lag, Port &port) { SWSS_LOG_ERROR("Failed to remove member %s from LAG %s lid:%" PRIx64 " lmid:%" PRIx64, port.m_alias.c_str(), lag.m_alias.c_str(), lag.m_lag_id, port.m_lag_member_id); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_LAG, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Remove member %s from LAG %s lid:%" PRIx64 " lmid:%" PRIx64, @@ -4062,7 +4220,11 @@ bool PortsOrch::setCollectionOnLagMember(Port &lagMember, bool enableCollection) SWSS_LOG_ERROR("Failed to %s collection on LAG member %s", enableCollection ? "enable" : "disable", lagMember.m_alias.c_str()); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_LAG, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("%s collection on LAG member %s", @@ -4089,7 +4251,11 @@ bool PortsOrch::setDistributionOnLagMember(Port &lagMember, bool enableDistribut SWSS_LOG_ERROR("Failed to %s distribution on LAG member %s", enableDistribution ? "enable" : "disable", lagMember.m_alias.c_str()); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_LAG, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("%s distribution on LAG member %s", @@ -4477,7 +4643,11 @@ bool PortsOrch::removeAclTableGroup(const Port &p) if (ret != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove ingress acl table group for %s", p.m_alias.c_str()); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_ACL, ret); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } gCrmOrch->decCrmAclUsedCounter(CrmResourceType::CRM_ACL_GROUP, SAI_ACL_STAGE_INGRESS, bind_type, p.m_ingress_acl_table_group_id); } @@ -4488,7 +4658,11 @@ bool PortsOrch::removeAclTableGroup(const Port &p) if (ret != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove egress acl table group for %s", p.m_alias.c_str()); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_ACL, ret); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } gCrmOrch->decCrmAclUsedCounter(CrmResourceType::CRM_ACL_GROUP, SAI_ACL_STAGE_EGRESS, bind_type, p.m_egress_acl_table_group_id); } @@ -4522,7 +4696,11 @@ bool PortsOrch::setPortSerdesAttribute(sai_object_id_t port_id, { SWSS_LOG_ERROR("Failed to remove existing port serdes attr 0x%" PRIx64 " port 0x%" PRIx64, port_attr.value.oid, port_id); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } @@ -4547,7 +4725,11 @@ bool PortsOrch::setPortSerdesAttribute(sai_object_id_t port_id, { SWSS_LOG_ERROR("Failed to create port serdes for port 0x%" PRIx64, port_id); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Created port serdes object 0x%" PRIx64 " for port 0x%" PRIx64, port_serdes_id, port_id); return true; @@ -4578,6 +4760,7 @@ void PortsOrch::removePortSerdesAttribute(sai_object_id_t port_id) { SWSS_LOG_ERROR("Failed to remove existing port serdes attr 0x%" PRIx64 " port 0x%" PRIx64, port_attr.value.oid, port_id); + handleSaiRemoveStatus(SAI_API_PORT, status); return; } } @@ -4753,7 +4936,11 @@ bool PortsOrch::initGearboxPort(Port &port) { SWSS_LOG_ERROR("BOX: Failed to create Gearbox system-side port for alias:%s port_id:0x%" PRIx64 " index:%d status:%d", port.m_alias.c_str(), port.m_port_id, port.m_index, status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("BOX: Created Gearbox system-side port 0x%" PRIx64 " for alias:%s index:%d", systemPort, port.m_alias.c_str(), port.m_index); @@ -4836,7 +5023,11 @@ bool PortsOrch::initGearboxPort(Port &port) { SWSS_LOG_ERROR("BOX: Failed to create Gearbox line-side port for alias:%s port_id:0x%" PRIx64 " index:%d status:%d", port.m_alias.c_str(), port.m_port_id, port.m_index, status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("BOX: Created Gearbox line-side port 0x%" PRIx64 " for alias:%s index:%d", linePort, port.m_alias.c_str(), port.m_index); @@ -4855,7 +5046,11 @@ bool PortsOrch::initGearboxPort(Port &port) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("BOX: Failed to connect Gearbox system-side:0x%" PRIx64 " to line-side:0x%" PRIx64 "; status:%d", systemPort, linePort, status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("BOX: Connected Gearbox ports; system-side:0x%" PRIx64 " to line-side:0x%" PRIx64, systemPort, linePort); diff --git a/orchagent/qosorch.cpp b/orchagent/qosorch.cpp index eae00c27dc..b4b208e1b3 100644 --- a/orchagent/qosorch.cpp +++ b/orchagent/qosorch.cpp @@ -864,7 +864,11 @@ task_process_status QosOrch::handleSchedulerTable(Consumer& consumer) if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("fail to set scheduler attribute, id:%d", attr.id); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiSetStatus(SAI_API_SCHEDULER, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } } } @@ -875,7 +879,11 @@ task_process_status QosOrch::handleSchedulerTable(Consumer& consumer) { SWSS_LOG_ERROR("Failed to create scheduler profile [%s:%s], rv:%d", qos_map_type_name.c_str(), qos_object_name.c_str(), sai_status); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_SCHEDULER, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } SWSS_LOG_NOTICE("Created [%s:%s]", qos_map_type_name.c_str(), qos_object_name.c_str()); (*(m_qos_maps[qos_map_type_name]))[qos_object_name].m_saiObjectId = sai_object; @@ -892,7 +900,11 @@ task_process_status QosOrch::handleSchedulerTable(Consumer& consumer) if (SAI_STATUS_SUCCESS != sai_status) { SWSS_LOG_ERROR("Failed to remove scheduler profile. db name:%s sai object:%" PRIx64, qos_object_name.c_str(), sai_object); - return task_process_status::task_failed; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_SCHEDULER, sai_status); + if (handle_status != task_process_status::task_success) + { + return handle_status; + } } auto it_to_delete = (m_qos_maps[qos_map_type_name])->find(qos_object_name); (m_qos_maps[qos_map_type_name])->erase(it_to_delete); @@ -1024,7 +1036,11 @@ bool QosOrch::applySchedulerToQueueSchedulerGroup(Port &port, size_t queue_ind, if (SAI_STATUS_SUCCESS != sai_status) { SWSS_LOG_ERROR("Failed applying scheduler profile:0x%" PRIx64 " to scheduler group:0x%" PRIx64 ", port:%s", scheduler_profile_id, group_id, port.m_alias.c_str()); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_SCHEDULER_GROUP, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_DEBUG("port:%s, scheduler_profile_id:0x%" PRIx64 " applied to scheduler group:0x%" PRIx64, port.m_alias.c_str(), scheduler_profile_id, group_id); @@ -1052,7 +1068,11 @@ bool QosOrch::applyWredProfileToQueue(Port &port, size_t queue_ind, sai_object_i if (sai_status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set queue attribute:%d", sai_status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_QUEUE, sai_status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -1206,7 +1226,11 @@ bool QosOrch::applyMapToPort(Port &port, sai_attr_id_t attr_id, sai_object_id_t if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed setting sai object:%" PRIx64 " for port:%s, status:%d", map_id, port.m_alias.c_str(), status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -1326,7 +1350,11 @@ task_process_status QosOrch::handlePortQosMapTable(Consumer& consumer) { SWSS_LOG_ERROR("Failed to apply %s to port %s, rv:%d", it->second.first.c_str(), port_name.c_str(), status); - return task_process_status::task_invalid_entry; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, status); + if (handle_status != task_process_status::task_success) + { + return task_process_status::task_invalid_entry; + } } SWSS_LOG_INFO("Applied %s to port %s", it->second.first.c_str(), port_name.c_str()); } diff --git a/orchagent/routeorch.cpp b/orchagent/routeorch.cpp index 641f81589d..21e63f88c9 100644 --- a/orchagent/routeorch.cpp +++ b/orchagent/routeorch.cpp @@ -331,7 +331,11 @@ bool RouteOrch::validnexthopinNextHopGroup(const NextHopKey &nexthop, uint32_t& { SWSS_LOG_ERROR("Failed to add next hop member to group %" PRIx64 ": %d\n", nhopgroup->second.next_hop_group_id, status); - return handleSaiCreateStatus(SAI_API_NEXT_HOP_GROUP, status); + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NEXT_HOP_GROUP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } ++count; @@ -371,7 +375,11 @@ bool RouteOrch::invalidnexthopinNextHopGroup(const NextHopKey &nexthop, uint32_t { SWSS_LOG_ERROR("Failed to remove next hop member %" PRIx64 " from group %" PRIx64 ": %d\n", nexthop_id, nhopgroup->second.next_hop_group_id, status); - return handleSaiRemoveStatus(SAI_API_NEXT_HOP_GROUP, status); + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NEXT_HOP_GROUP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } ++count; @@ -950,7 +958,11 @@ bool RouteOrch::createFineGrainedNextHopGroup(sai_object_id_t &next_hop_group_id if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create next hop group rv:%d", status); - return handleSaiCreateStatus(SAI_API_NEXT_HOP_GROUP, status); + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NEXT_HOP_GROUP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } gCrmOrch->incCrmResUsedCounter(CrmResourceType::CRM_NEXTHOP_GROUP); @@ -968,7 +980,11 @@ bool RouteOrch::removeFineGrainedNextHopGroup(sai_object_id_t &next_hop_group_id { SWSS_LOG_ERROR("Failed to remove next hop group %" PRIx64 ", rv:%d", next_hop_group_id, status); - return handleSaiRemoveStatus(SAI_API_NEXT_HOP_GROUP, status); + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NEXT_HOP_GROUP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } gCrmOrch->decCrmResUsedCounter(CrmResourceType::CRM_NEXTHOP_GROUP); @@ -1033,7 +1049,11 @@ bool RouteOrch::addNextHopGroup(const NextHopGroupKey &nexthops) { SWSS_LOG_ERROR("Failed to create next hop group %s, rv:%d", nexthops.to_string().c_str(), status); - return handleSaiCreateStatus(SAI_API_NEXT_HOP_GROUP, status); + task_process_status handle_status = handleSaiCreateStatus(SAI_API_NEXT_HOP_GROUP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_nextHopGroupCount ++; @@ -1150,7 +1170,11 @@ bool RouteOrch::removeNextHopGroup(const NextHopGroupKey &nexthops) { SWSS_LOG_ERROR("Failed to remove next hop group member[%zu] %" PRIx64 ", rv:%d", i, next_hop_ids[i], statuses[i]); - return handleSaiRemoveStatus(SAI_API_NEXT_HOP_GROUP, statuses[i]); + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NEXT_HOP_GROUP, statuses[i]); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } gCrmOrch->decCrmResUsedCounter(CrmResourceType::CRM_NEXTHOP_GROUP_MEMBER); @@ -1160,7 +1184,11 @@ bool RouteOrch::removeNextHopGroup(const NextHopGroupKey &nexthops) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove next hop group %" PRIx64 ", rv:%d", next_hop_group_id, status); - return handleSaiRemoveStatus(SAI_API_NEXT_HOP_GROUP, status); + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NEXT_HOP_GROUP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } m_nextHopGroupCount --; @@ -1636,7 +1664,11 @@ bool RouteOrch::addRoutePost(const RouteBulkContext& ctx, const NextHopGroupKey { removeNextHopGroup(nextHops); } - return handleSaiCreateStatus(SAI_API_ROUTE, status); + task_process_status handle_status = handleSaiCreateStatus(SAI_API_ROUTE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } if (ipPrefix.isV4()) @@ -1666,7 +1698,11 @@ bool RouteOrch::addRoutePost(const RouteBulkContext& ctx, const NextHopGroupKey { SWSS_LOG_ERROR("Failed to set route %s with packet action forward, %d", ipPrefix.to_string().c_str(), status); - return handleSaiSetStatus(SAI_API_ROUTE, status); + task_process_status handle_status = handleSaiSetStatus(SAI_API_ROUTE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } @@ -1675,7 +1711,11 @@ bool RouteOrch::addRoutePost(const RouteBulkContext& ctx, const NextHopGroupKey { SWSS_LOG_ERROR("Failed to set route %s with next hop(s) %s", ipPrefix.to_string().c_str(), nextHops.to_string().c_str()); - return handleSaiSetStatus(SAI_API_ROUTE, status); + task_process_status handle_status = handleSaiSetStatus(SAI_API_ROUTE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } /* Increase the ref_count for the next hop (group) entry */ @@ -1793,7 +1833,11 @@ bool RouteOrch::removeRoutePost(const RouteBulkContext& ctx) { SWSS_LOG_ERROR("Failed to set route %s packet action to drop, rv:%d", ipPrefix.to_string().c_str(), status); - return handleSaiSetStatus(SAI_API_ROUTE, status); + task_process_status handle_status = handleSaiSetStatus(SAI_API_ROUTE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_INFO("Set route %s packet action to drop", ipPrefix.to_string().c_str()); @@ -1803,7 +1847,11 @@ bool RouteOrch::removeRoutePost(const RouteBulkContext& ctx) { SWSS_LOG_ERROR("Failed to set route %s next hop ID to NULL, rv:%d", ipPrefix.to_string().c_str(), status); - return handleSaiSetStatus(SAI_API_ROUTE, status); + task_process_status handle_status = handleSaiSetStatus(SAI_API_ROUTE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_INFO("Set route %s next hop ID to NULL", ipPrefix.to_string().c_str()); @@ -1814,7 +1862,11 @@ bool RouteOrch::removeRoutePost(const RouteBulkContext& ctx) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove route prefix:%s\n", ipPrefix.to_string().c_str()); - return handleSaiRemoveStatus(SAI_API_ROUTE, status); + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_ROUTE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } if (ipPrefix.isV4()) diff --git a/orchagent/sfloworch.cpp b/orchagent/sfloworch.cpp index 97e3bf855b..ac76d23004 100644 --- a/orchagent/sfloworch.cpp +++ b/orchagent/sfloworch.cpp @@ -31,7 +31,11 @@ bool SflowOrch::sflowCreateSession(uint32_t rate, SflowSession &session) if (sai_rc != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create sample packet session with rate %d", rate); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_SAMPLEPACKET, sai_rc); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } session.m_sample_id = session_id; session.ref_count = 0; @@ -47,7 +51,11 @@ bool SflowOrch::sflowDestroySession(SflowSession &session) { SWSS_LOG_ERROR("Failed to destroy sample packet session with id %" PRIx64 "", session.m_sample_id); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_SAMPLEPACKET, sai_rc); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -111,7 +119,11 @@ bool SflowOrch::sflowAddPort(sai_object_id_t sample_id, sai_object_id_t port_id) if (sai_rc != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set session %" PRIx64 " on port %" PRIx64 , sample_id, port_id); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, sai_rc); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } @@ -128,7 +140,11 @@ bool SflowOrch::sflowDelPort(sai_object_id_t port_id) if (sai_rc != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to delete session on port %" PRIx64 , port_id); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_PORT, sai_rc); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } return true; } diff --git a/orchagent/switchorch.cpp b/orchagent/switchorch.cpp index 8e8c0cf429..8b105384cd 100644 --- a/orchagent/switchorch.cpp +++ b/orchagent/switchorch.cpp @@ -205,7 +205,7 @@ void SwitchOrch::doAppSwitchTableTask(Consumer &consumer) { SWSS_LOG_ERROR("Failed to set switch attribute %s to %s, rv:%d", attribute.c_str(), value.c_str(), status); - retry = true; + retry = (handleSaiSetStatus(SAI_API_SWITCH, status) == task_need_retry); break; } @@ -306,7 +306,11 @@ bool SwitchOrch::setAgingFDB(uint32_t sec) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set switch %" PRIx64 " fdb_aging_time attribute: %d", gSwitchId, status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_SWITCH, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Set switch %" PRIx64 " fdb_aging_time %u sec", gSwitchId, sec); return true; diff --git a/orchagent/tunneldecaporch.cpp b/orchagent/tunneldecaporch.cpp index 6f293493b5..bde3651881 100644 --- a/orchagent/tunneldecaporch.cpp +++ b/orchagent/tunneldecaporch.cpp @@ -232,7 +232,11 @@ bool TunnelDecapOrch::addDecapTunnel(string key, string type, IpAddresses dst_ip if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create overlay router interface %d", status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_ROUTER_INTERFACE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Create overlay loopback router interface oid:%" PRIx64, overlayIfId); @@ -308,7 +312,11 @@ bool TunnelDecapOrch::addDecapTunnel(string key, string type, IpAddresses dst_ip if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create tunnel"); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_TUNNEL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } tunnelTable[key] = { tunnel_id, overlayIfId, dst_ip, {} }; @@ -384,7 +392,11 @@ bool TunnelDecapOrch::addDecapTunnelTermEntries(string tunnelKey, IpAddresses ds if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create tunnel entry table for ip: %s", ip.c_str()); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_TUNNEL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } // insert into ip to entry mapping @@ -476,7 +488,11 @@ bool TunnelDecapOrch::setTunnelAttribute(string field, string value, sai_object_ if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to set attribute %s with value %s\n", field.c_str(), value.c_str()); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_TUNNEL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } SWSS_LOG_NOTICE("Set attribute %s with value %s\n", field.c_str(), value.c_str()); return true; @@ -563,7 +579,11 @@ bool TunnelDecapOrch::removeDecapTunnel(string key) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove tunnel: %" PRIu64, tunnel_info->tunnel_id); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_TUNNEL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } // delete overlay loopback interface @@ -571,7 +591,11 @@ bool TunnelDecapOrch::removeDecapTunnel(string key) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove tunnel overlay interface: %" PRIu64, tunnel_info->overlay_intf_id); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_ROUTER_INTERFACE, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } tunnelTable.erase(key); @@ -596,7 +620,11 @@ bool TunnelDecapOrch::removeDecapTunnelTermEntry(sai_object_id_t tunnel_term_id, if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove tunnel table entry: %" PRIu64, tunnel_term_id); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_TUNNEL, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } // making sure to remove all instances of the ip address @@ -676,6 +704,7 @@ sai_object_id_t TunnelDecapOrch::createNextHopTunnel(std::string tunnelKey, IpAd { SWSS_LOG_ERROR("Tunnel NH create failed %s, ip %s", tunnelKey.c_str(), ipAddr.to_string().c_str()); + handleSaiCreateStatus(SAI_API_NEXT_HOP, status); } else { @@ -731,7 +760,11 @@ bool TunnelDecapOrch::removeNextHopTunnel(std::string tunnelKey, IpAddress& ipAd { SWSS_LOG_ERROR("Failed to remove next hop %s on %s, rv:%d", ipAddr.to_string().c_str(), tunnelKey.c_str(), status); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_NEXT_HOP, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } else diff --git a/orchagent/vrforch.cpp b/orchagent/vrforch.cpp index ee0d9d4ac2..60117c366d 100644 --- a/orchagent/vrforch.cpp +++ b/orchagent/vrforch.cpp @@ -89,7 +89,11 @@ bool VRFOrch::addOperation(const Request& request) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to create virtual router name: %s, rv: %d", vrf_name.c_str(), status); - return false; + task_process_status handle_status = handleSaiCreateStatus(SAI_API_VIRTUAL_ROUTER, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } vrf_table_[vrf_name].vrf_id = router_id; @@ -119,7 +123,11 @@ bool VRFOrch::addOperation(const Request& request) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to update virtual router attribute. vrf name: %s, rv: %d", vrf_name.c_str(), status); - return false; + task_process_status handle_status = handleSaiSetStatus(SAI_API_VIRTUAL_ROUTER, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } } @@ -156,7 +164,11 @@ bool VRFOrch::delOperation(const Request& request) if (status != SAI_STATUS_SUCCESS) { SWSS_LOG_ERROR("Failed to remove virtual router name: %s, rv:%d", vrf_name.c_str(), status); - return false; + task_process_status handle_status = handleSaiRemoveStatus(SAI_API_VIRTUAL_ROUTER, status); + if (handle_status != task_success) + { + return parseHandleSaiStatusFailure(handle_status); + } } vrf_table_.erase(vrf_name);