From dc9ece94cbbbf9b9a34c250f48400f1c7da28bca Mon Sep 17 00:00:00 2001 From: Shi Su <67605788+shi-su@users.noreply.github.com> Date: Wed, 12 May 2021 11:33:35 -0700 Subject: [PATCH] [Bulk mode] Improve log in bulk failures (#1740) What I did Log error with failure status when bulk API fails. Why I did it Allow better understanding about bulk failures. --- orchagent/bulker.h | 72 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/orchagent/bulker.h b/orchagent/bulker.h index 4f6e9cc5cb2e..0578c6cc316e 100644 --- a/orchagent/bulker.h +++ b/orchagent/bulker.h @@ -9,6 +9,7 @@ #include #include "sai.h" #include "logger.h" +#include "sai_serialize.h" static inline bool operator==(const sai_ip_prefix_t& a, const sai_ip_prefix_t& b) { @@ -282,8 +283,16 @@ class EntityBulker } size_t count = rs.size(); std::vector statuses(count); - (*remove_entries)((uint32_t)count, rs.data(), SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses.data()); - SWSS_LOG_INFO("EntityBulker.flush removing_entries %zu\n", removing_entries.size()); + sai_status_t status = (*remove_entries)((uint32_t)count, rs.data(), SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses.data()); + if (status == SAI_STATUS_SUCCESS) + { + SWSS_LOG_INFO("EntityBulker.flush removing_entries %zu\n", removing_entries.size()); + } + else + { + SWSS_LOG_ERROR("EntityBulker.flush remove entries failed, number of entries to remove: %zu, status: %s", + removing_entries.size(), sai_serialize_status(status).c_str()); + } for (size_t ir = 0; ir < count; ir++) { @@ -318,9 +327,17 @@ class EntityBulker } size_t count = rs.size(); std::vector statuses(count); - (*create_entries)((uint32_t)count, rs.data(), cs.data(), tss.data() + sai_status_t status = (*create_entries)((uint32_t)count, rs.data(), cs.data(), tss.data() , SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses.data()); - SWSS_LOG_INFO("EntityBulker.flush creating_entries %zu\n", creating_entries.size()); + if (status == SAI_STATUS_SUCCESS) + { + SWSS_LOG_INFO("EntityBulker.flush creating_entries %zu\n", creating_entries.size()); + } + else + { + SWSS_LOG_ERROR("EntityBulker.flush create entries failed, number of entries to create: %zu, status: %s", + creating_entries.size(), sai_serialize_status(status).c_str()); + } for (size_t ir = 0; ir < count; ir++) { @@ -359,9 +376,17 @@ class EntityBulker } size_t count = rs.size(); std::vector statuses(count); - (*set_entries_attribute)((uint32_t)count, rs.data(), ts.data() + sai_status_t status = (*set_entries_attribute)((uint32_t)count, rs.data(), ts.data() , SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, statuses.data()); - SWSS_LOG_INFO("EntityBulker.flush setting_entries %zu, count %zu\n", setting_entries.size(), count); + if (status == SAI_STATUS_SUCCESS) + { + SWSS_LOG_INFO("EntityBulker.flush setting_entries %zu, count %zu\n", setting_entries.size(), count); + } + else + { + SWSS_LOG_ERROR("EntityBulker.flush set entry attribute failed, number of entries to set: %zu, status: %s", + setting_entries.size(), sai_serialize_status(status).c_str()); + } for (size_t ir = 0; ir < count; ir++) { @@ -544,7 +569,15 @@ class ObjectBulker size_t count = rs.size(); std::vector statuses(count); sai_status_t status = (*remove_entries)((uint32_t)count, rs.data(), SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses.data()); - SWSS_LOG_INFO("ObjectBulker.flush removing_entries %zu rc=%d statuses[0]=%d\n", removing_entries.size(), status, statuses[0]); + if (status == SAI_STATUS_SUCCESS) + { + SWSS_LOG_INFO("ObjectBulker.flush removing_entries %zu rc=%d statuses[0]=%d\n", removing_entries.size(), status, statuses[0]); + } + else + { + SWSS_LOG_ERROR("ObjectBulker.flush remove entries failed, number of entries to remove: %zu, status: %s", + removing_entries.size(), sai_serialize_status(status).c_str()); + } for (size_t i = 0; i < count; i++) { @@ -574,9 +607,17 @@ class ObjectBulker size_t count = creating_entries.size(); std::vector object_ids(count); std::vector statuses(count); - (*create_entries)(switch_id, (uint32_t)count, cs.data(), tss.data() + sai_status_t status = (*create_entries)(switch_id, (uint32_t)count, cs.data(), tss.data() , SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, object_ids.data(), statuses.data()); - SWSS_LOG_INFO("ObjectBulker.flush creating_entries %zu\n", creating_entries.size()); + if (status == SAI_STATUS_SUCCESS) + { + SWSS_LOG_INFO("ObjectBulker.flush creating_entries %zu\n", creating_entries.size()); + } + else + { + SWSS_LOG_ERROR("ObjectBulker.flush create entries failed, number of entries to create: %zu, status: %s", + creating_entries.size(), sai_serialize_status(status).c_str()); + } for (size_t i = 0; i < count; i++) { @@ -607,10 +648,17 @@ class ObjectBulker } size_t count = setting_entries.size(); std::vector statuses(count); - (*set_entries_attribute)((uint32_t)count, rs.data(), ts.data() + sai_status_t status = (*set_entries_attribute)((uint32_t)count, rs.data(), ts.data() , SAI_BULK_OP_ERROR_MODE_STOP_ON_ERROR, statuses.data()); - - SWSS_LOG_INFO("ObjectBulker.flush setting_entries %zu\n", setting_entries.size()); + if (status == SAI_STATUS_SUCCESS) + { + SWSS_LOG_INFO("ObjectBulker.flush setting_entries %zu\n", setting_entries.size()); + } + else + { + SWSS_LOG_ERROR("ObjectBulker.flush set entry attribute failed, number of entries to set: %zu, status: %s", + setting_entries.size(), sai_serialize_status(status).c_str()); + } setting_entries.clear(); }