From 2164db23d530dd8015ad251d5c21c6b91eefc12b Mon Sep 17 00:00:00 2001 From: kcudnik Date: Mon, 24 Jun 2019 19:39:25 +0200 Subject: [PATCH 1/7] Make sairedis/syncd synchronous --- lib/inc/sai_redis.h | 3 ++ lib/src/sai_redis_generic_create.cpp | 4 +- lib/src/sai_redis_generic_get.cpp | 2 +- lib/src/sai_redis_generic_remove.cpp | 6 +-- lib/src/sai_redis_generic_set.cpp | 69 +++++++++++++++++++++++++++- lib/src/sai_redis_generic_stats.cpp | 2 +- lib/src/sai_redis_interfacequery.cpp | 2 + lib/src/sai_redis_switch.cpp | 2 +- meta/saiattributelist.cpp | 2 +- meta/saiserialize.cpp | 6 ++- syncd/syncd.cpp | 35 +++++++++++++- vslib/src/sai_vs_hostintf.cpp | 4 ++ 12 files changed, 124 insertions(+), 13 deletions(-) diff --git a/lib/inc/sai_redis.h b/lib/inc/sai_redis.h index bf29a8dead..c980c41d0a 100644 --- a/lib/inc/sai_redis.h +++ b/lib/inc/sai_redis.h @@ -54,6 +54,9 @@ extern void recordLine(std::string s); extern std::string joinFieldValues( _In_ const std::vector &values); +extern sai_status_t internal_api_wait_for_response( + _In_ sai_common_api_t api); + // other global declarations extern volatile bool g_record; diff --git a/lib/src/sai_redis_generic_create.cpp b/lib/src/sai_redis_generic_create.cpp index 49361c5a66..60debd8ccd 100644 --- a/lib/src/sai_redis_generic_create.cpp +++ b/lib/src/sai_redis_generic_create.cpp @@ -234,9 +234,7 @@ sai_status_t internal_redis_generic_create( g_asicState->set(key, entry, "create"); - // we assume create will always succeed which may not be true - // we should make this synchronous call - return SAI_STATUS_SUCCESS; + return internal_api_wait_for_response(SAI_COMMON_API_CREATE); } sai_status_t redis_generic_create( diff --git a/lib/src/sai_redis_generic_get.cpp b/lib/src/sai_redis_generic_get.cpp index 0c79293dc5..8eb3522192 100644 --- a/lib/src/sai_redis_generic_get.cpp +++ b/lib/src/sai_redis_generic_get.cpp @@ -205,7 +205,7 @@ sai_status_t internal_redis_generic_get( const std::string &op = kfvOp(kco); const std::string &opkey = kfvKey(kco); - SWSS_LOG_DEBUG("response: op = %s, key = %s", opkey.c_str(), op.c_str()); + SWSS_LOG_INFO("response: op = %s, key = %s", opkey.c_str(), op.c_str()); if (op != "getresponse") // ignore non response messages { diff --git a/lib/src/sai_redis_generic_remove.cpp b/lib/src/sai_redis_generic_remove.cpp index 372aa2f47f..006d26d19e 100644 --- a/lib/src/sai_redis_generic_remove.cpp +++ b/lib/src/sai_redis_generic_remove.cpp @@ -21,7 +21,7 @@ sai_status_t internal_redis_generic_remove( g_asicState->del(key, "remove"); - return SAI_STATUS_SUCCESS; + return internal_api_wait_for_response(SAI_COMMON_API_REMOVE); } sai_status_t redis_generic_remove( @@ -118,10 +118,10 @@ sai_status_t internal_redis_bulk_generic_remove( } /* - * Capital 'C' stands for bulk CREATE operation. + * Capital 'R' stands for bulk CREATE operation. */ - recordLine("C|" + str_object_type + joined); + recordLine("R|" + str_object_type + joined); } // key: object_type:count diff --git a/lib/src/sai_redis_generic_set.cpp b/lib/src/sai_redis_generic_set.cpp index 1bd7ad80eb..32aaa67e20 100644 --- a/lib/src/sai_redis_generic_set.cpp +++ b/lib/src/sai_redis_generic_set.cpp @@ -2,6 +2,73 @@ #include "meta/sai_serialize.h" #include "meta/saiattributelist.h" +sai_status_t internal_api_wait_for_response( + _In_ sai_common_api_t api) +{ + SWSS_LOG_ENTER(); + + SWSS_LOG_INFO("waiting for response %d", api); + + swss::Select s; + + s.addSelectable(g_redisGetConsumer.get()); + + while (true) + { + SWSS_LOG_INFO("wait for %d api response", api); + + swss::Selectable *sel; + + // get timeout and selector is used for all quad api's + int result = s.select(&sel, GET_RESPONSE_TIMEOUT); + + if (result == swss::Select::OBJECT) + { + swss::KeyOpFieldsValuesTuple kco; + + g_redisGetConsumer->pop(kco); + + const std::string &op = kfvOp(kco); + const std::string &opkey = kfvKey(kco); + + SWSS_LOG_INFO("response: op = %s, key = %s", opkey.c_str(), op.c_str()); + + if (op != "getresponse") // ignore non response messages + { + continue; + } + + sai_status_t status; + sai_deserialize_status(opkey, status); + + if (g_record) + { + const std::string &str_status = kfvKey(kco); + const std::vector &values = kfvFieldsValues(kco); + + // first serialized is status + recordLine("G|" + str_status + "|" + joinFieldValues(values)); + } + + SWSS_LOG_DEBUG("generic %d api status: %d", api, status); + + return status; + } + + SWSS_LOG_ERROR("generic %d api failed due to SELECT operation result: %s", api, getSelectResultAsString(result).c_str()); + break; + } + + if (g_record) + { + recordLine("G|SAI_STATUS_FAILURE"); + } + + SWSS_LOG_ERROR("generic %d api failed to get response", api); + + return SAI_STATUS_FAILURE; +} + sai_status_t internal_redis_generic_set( _In_ sai_object_type_t object_type, _In_ const std::string &serialized_object_id, @@ -28,7 +95,7 @@ sai_status_t internal_redis_generic_set( g_asicState->set(key, entry, "set"); - return SAI_STATUS_SUCCESS; + return internal_api_wait_for_response(SAI_COMMON_API_SET); } sai_status_t internal_redis_bulk_generic_set( diff --git a/lib/src/sai_redis_generic_stats.cpp b/lib/src/sai_redis_generic_stats.cpp index 82888a8ef3..14e98633b4 100644 --- a/lib/src/sai_redis_generic_stats.cpp +++ b/lib/src/sai_redis_generic_stats.cpp @@ -244,7 +244,7 @@ std::vector serialize_counter_id_list( values.emplace_back(name, ""); } - return std::move(values); + return values; } sai_status_t internal_redis_generic_get_stats( diff --git a/lib/src/sai_redis_interfacequery.cpp b/lib/src/sai_redis_interfacequery.cpp index 16fb96accc..8a9761f069 100644 --- a/lib/src/sai_redis_interfacequery.cpp +++ b/lib/src/sai_redis_interfacequery.cpp @@ -124,6 +124,8 @@ sai_status_t sai_api_initialize( g_redisNotifications = std::make_shared(g_dbNtf.get(), "NOTIFICATIONS"); g_redisClient = std::make_shared(g_db.get()); + g_asicState->setBuffered(false); // in sync mode, always false + clear_local_state(); g_asicInitViewMode = false; diff --git a/lib/src/sai_redis_switch.cpp b/lib/src/sai_redis_switch.cpp index f664232d25..b24004df2f 100644 --- a/lib/src/sai_redis_switch.cpp +++ b/lib/src/sai_redis_switch.cpp @@ -267,7 +267,7 @@ sai_status_t redis_set_switch_attribute( return SAI_STATUS_SUCCESS; case SAI_REDIS_SWITCH_ATTR_USE_PIPELINE: - g_asicState->setBuffered(attr->value.booldata); + // g_asicState->setBuffered(attr->value.booldata); // this is ignored in sync mode return SAI_STATUS_SUCCESS; case SAI_REDIS_SWITCH_ATTR_FLUSH: diff --git a/meta/saiattributelist.cpp b/meta/saiattributelist.cpp index 6d365e376b..e7526ac134 100644 --- a/meta/saiattributelist.cpp +++ b/meta/saiattributelist.cpp @@ -116,7 +116,7 @@ std::vector SaiAttributeList::serialize_attr_list( entry.push_back(fvt); } - return std::move(entry); + return entry; } sai_attribute_t* SaiAttributeList::get_attr_list() diff --git a/meta/saiserialize.cpp b/meta/saiserialize.cpp index 26de768c66..176b72ef41 100644 --- a/meta/saiserialize.cpp +++ b/meta/saiserialize.cpp @@ -1,7 +1,11 @@ #include "sai_serialize.h" #include "meta/sai_meta.h" #include "swss/tokenize.h" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" #include "swss/json.hpp" +#pragma GCC diagnostic pop + #include #include @@ -2359,7 +2363,7 @@ void sai_deserialize_acl_capability( if (pos == std::string::npos) { - SWSS_LOG_THROW("Invalid acl capability %s", s); + SWSS_LOG_THROW("Invalid acl capability %s", s.c_str()); } auto mandatory_on_create_str = s.substr(0, pos); diff --git a/syncd/syncd.cpp b/syncd/syncd.cpp index ff83fbee74..625ac32aed 100644 --- a/syncd/syncd.cpp +++ b/syncd/syncd.cpp @@ -1000,6 +1000,23 @@ void internal_syncd_get_send( SWSS_LOG_INFO("response for GET api was send"); } +void internal_syncd_api_send_response( + _In_ sai_common_api_t api, + _In_ sai_status_t status) +{ + SWSS_LOG_ENTER(); + + std::vector entry; + + std::string str_status = sai_serialize_status(status); + + SWSS_LOG_INFO("sending response for %d api with status: %s", api, str_status.c_str()); + + getResponse->set(str_status, entry, "getresponse"); + + SWSS_LOG_INFO("response for %d api was send", api); +} + const char* profile_get_value( _In_ sai_switch_profile_id_t profile_id, _In_ const char* variable) @@ -1462,7 +1479,7 @@ void sendNotifyResponse( std::vector entry; - SWSS_LOG_NOTICE("sending response: %s", str_status.c_str()); + SWSS_LOG_INFO("sending response: %s", str_status.c_str()); getResponse->set(str_status, entry, "notify"); } @@ -2235,6 +2252,8 @@ sai_status_t processEventInInitViewMode( } } + internal_syncd_api_send_response(api, SAI_STATUS_SUCCESS); + return SAI_STATUS_SUCCESS; case SAI_COMMON_API_REMOVE: @@ -2272,6 +2291,8 @@ sai_status_t processEventInInitViewMode( initViewRemovedVidSet.insert(object_vid); } + internal_syncd_api_send_response(api, SAI_STATUS_SUCCESS); + return SAI_STATUS_SUCCESS; case SAI_COMMON_API_SET: @@ -2280,6 +2301,8 @@ sai_status_t processEventInInitViewMode( * We support SET api on all objects in init view mode. */ + internal_syncd_api_send_response(api, SAI_STATUS_SUCCESS); + return SAI_STATUS_SUCCESS; case SAI_COMMON_API_GET: @@ -2474,6 +2497,7 @@ sai_status_t handle_bulk_generic( if (status != SAI_STATUS_SUCCESS) { + internal_syncd_api_send_response(api, status); return status; } } @@ -2582,6 +2606,8 @@ sai_status_t processBulkEvent( sai_serialize_status(status).c_str()); } + internal_syncd_api_send_response(api, status); + return status; } @@ -2845,6 +2871,8 @@ sai_status_t processEvent( } else if (status != SAI_STATUS_SUCCESS) { + internal_syncd_api_send_response(api, status); + if (!info->isnonobjectid && api == SAI_COMMON_API_SET) { sai_object_id_t vid; @@ -2867,6 +2895,11 @@ sai_status_t processEvent( key.c_str(), sai_serialize_status(status).c_str()); } + else // non GET api, status is SUCCESS + { + internal_syncd_api_send_response(api, status); + } + } while (!consumer.empty()); return status; diff --git a/vslib/src/sai_vs_hostintf.cpp b/vslib/src/sai_vs_hostintf.cpp index ae69b1a1eb..3a21039721 100644 --- a/vslib/src/sai_vs_hostintf.cpp +++ b/vslib/src/sai_vs_hostintf.cpp @@ -21,7 +21,11 @@ #include #include +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wshadow" #include "swss/json.hpp" +#pragma GCC diagnostic pop + using json = nlohmann::json; From 1ac4181d2611b0895c52b7589b16a3433a9c4085 Mon Sep 17 00:00:00 2001 From: kcudnik Date: Mon, 24 Jun 2019 20:05:52 +0200 Subject: [PATCH 2/7] Add wait for response for bulk api --- lib/src/sai_redis_generic_create.cpp | 2 +- lib/src/sai_redis_generic_remove.cpp | 2 +- lib/src/sai_redis_generic_set.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/src/sai_redis_generic_create.cpp b/lib/src/sai_redis_generic_create.cpp index 60debd8ccd..e9dbfd3d18 100644 --- a/lib/src/sai_redis_generic_create.cpp +++ b/lib/src/sai_redis_generic_create.cpp @@ -387,7 +387,7 @@ sai_status_t internal_redis_bulk_generic_create( g_asicState->set(key, entries, "bulkcreate"); } - return SAI_STATUS_SUCCESS; + return internal_api_wait_for_response(SAI_COMMON_API_CREATE); } #define REDIS_ENTRY_CREATE(OT,ot) \ diff --git a/lib/src/sai_redis_generic_remove.cpp b/lib/src/sai_redis_generic_remove.cpp index 006d26d19e..d6afc1c69b 100644 --- a/lib/src/sai_redis_generic_remove.cpp +++ b/lib/src/sai_redis_generic_remove.cpp @@ -134,7 +134,7 @@ sai_status_t internal_redis_bulk_generic_remove( g_asicState->set(key, entries, "bulkremove"); } - return SAI_STATUS_SUCCESS; + return internal_api_wait_for_response(SAI_COMMON_API_CREATE); } diff --git a/lib/src/sai_redis_generic_set.cpp b/lib/src/sai_redis_generic_set.cpp index 32aaa67e20..12489293ca 100644 --- a/lib/src/sai_redis_generic_set.cpp +++ b/lib/src/sai_redis_generic_set.cpp @@ -177,7 +177,7 @@ sai_status_t internal_redis_bulk_generic_set( g_asicState->set(key, entries, "bulkset"); } - return SAI_STATUS_SUCCESS; + return internal_api_wait_for_response(SAI_COMMON_API_CREATE); } From f0c6b977f5cf29d38bb560ea8c7a15eda38dabb6 Mon Sep 17 00:00:00 2001 From: kcudnik Date: Mon, 24 Jun 2019 20:06:54 +0200 Subject: [PATCH 3/7] Update aspell --- tests/aspell.en.pws | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/aspell.en.pws b/tests/aspell.en.pws index 3430c32b3e..21b18b89ed 100644 --- a/tests/aspell.en.pws +++ b/tests/aspell.en.pws @@ -244,3 +244,5 @@ VXLAN workaroung xoff xon +booldata +setBuffered From 5ee0f993af1b426f3af7bae5dc52623fda6e2947 Mon Sep 17 00:00:00 2001 From: kcudnik Date: Mon, 1 Jul 2019 10:58:50 +0200 Subject: [PATCH 4/7] Address comments --- lib/src/sai_redis_switch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/src/sai_redis_switch.cpp b/lib/src/sai_redis_switch.cpp index b24004df2f..3d44a4fb7f 100644 --- a/lib/src/sai_redis_switch.cpp +++ b/lib/src/sai_redis_switch.cpp @@ -268,7 +268,7 @@ sai_status_t redis_set_switch_attribute( case SAI_REDIS_SWITCH_ATTR_USE_PIPELINE: // g_asicState->setBuffered(attr->value.booldata); // this is ignored in sync mode - return SAI_STATUS_SUCCESS; + return SAI_STATUS_NOT_SUPPORTED; case SAI_REDIS_SWITCH_ATTR_FLUSH: g_asicState->flush(); From 485cd00eb5f3e8306f222b42d1b12ea1483f2175 Mon Sep 17 00:00:00 2001 From: kcudnik Date: Mon, 1 Jul 2019 16:36:01 +0200 Subject: [PATCH 5/7] Add support for bulk route create in saiplayer --- saiplayer/saiplayer.cpp | 54 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/saiplayer/saiplayer.cpp b/saiplayer/saiplayer.cpp index a15bab185c..3e7780df8c 100644 --- a/saiplayer/saiplayer.cpp +++ b/saiplayer/saiplayer.cpp @@ -964,6 +964,54 @@ sai_status_t handle_bulk_route( return status; } + else if (api == (sai_common_api_t)SAI_COMMON_API_BULK_CREATE) + { + std::vector attr_count; + + std::vector attr_list; + + // route can have multiple attributes, so we need to hangle them all + for (const auto &alist: attributes) + { + attr_list.push_back(alist->get_attr_list()); + attr_count.push_back(alist->get_attr_count()); + } + + SWSS_LOG_NOTICE("executing BULK route create with %zu routes", attr_count.size()); + + sai_status_t status = sai_bulk_create_route_entry( + (uint32_t)routes.size(), + routes.data(), + attr_count.data(), + attr_list.data(), + SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR, // TODO we need to get that from recording + statuses.data()); + + if (status != SAI_STATUS_SUCCESS) + { + // Entire API fails, so no need to compare statuses. + return status; + } + + for (size_t i = 0; i < statuses.size(); ++i) + { + if (statuses[i] != recorded_statuses[i]) + { + /* + * If recorded statuses are different than received, throw + * exception since data don't match. + */ + + SWSS_LOG_THROW("recorded status is %s but returned is %s on %s", + sai_serialize_status(recorded_statuses[i]).c_str(), + sai_serialize_status(statuses[i]).c_str(), + object_ids[i].c_str()); + } + } + + return status; + + } else { SWSS_LOG_THROW("api %d is not supported in bulk route", api); @@ -981,7 +1029,8 @@ void processBulk( return; } - if (api != (sai_common_api_t)SAI_COMMON_API_BULK_SET) + if (api != (sai_common_api_t)SAI_COMMON_API_BULK_SET && + api != (sai_common_api_t)SAI_COMMON_API_BULK_CREATE) { SWSS_LOG_THROW("bulk common api %d is not supported yet, FIXME", api); } @@ -1154,6 +1203,9 @@ int replay(int argc, char **argv) case 'S': processBulk((sai_common_api_t)SAI_COMMON_API_BULK_SET, line); continue; + case 'C': + processBulk((sai_common_api_t)SAI_COMMON_API_BULK_CREATE, line); + continue; case 'g': api = SAI_COMMON_API_GET; break; From 475a78a43da35400799c45a9a5affe953bde4252 Mon Sep 17 00:00:00 2001 From: kcudnik Date: Tue, 2 Jul 2019 14:33:19 +0200 Subject: [PATCH 6/7] Fix spelling --- saiplayer/saiplayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/saiplayer/saiplayer.cpp b/saiplayer/saiplayer.cpp index 3e7780df8c..0eb1f6235b 100644 --- a/saiplayer/saiplayer.cpp +++ b/saiplayer/saiplayer.cpp @@ -970,7 +970,7 @@ sai_status_t handle_bulk_route( std::vector attr_list; - // route can have multiple attributes, so we need to hangle them all + // route can have multiple attributes, so we need to handle them all for (const auto &alist: attributes) { attr_list.push_back(alist->get_attr_list()); From 72d9f708bcd78f83f0bce25b8568dbfe2e82a544 Mon Sep 17 00:00:00 2001 From: kcudnik Date: Mon, 15 Jul 2019 12:01:48 +0200 Subject: [PATCH 7/7] Make synchronous mode optional and disabled by default --- lib/inc/sai_redis.h | 1 + lib/inc/sairedis.h | 13 +++++++++++++ lib/src/sai_redis_generic_set.cpp | 10 ++++++++++ lib/src/sai_redis_switch.cpp | 24 ++++++++++++++++++++++-- syncd/syncd.cpp | 24 ++++++++++++++++++++++-- 5 files changed, 68 insertions(+), 4 deletions(-) diff --git a/lib/inc/sai_redis.h b/lib/inc/sai_redis.h index c980c41d0a..e0fd780f63 100644 --- a/lib/inc/sai_redis.h +++ b/lib/inc/sai_redis.h @@ -63,6 +63,7 @@ extern volatile bool g_record; extern volatile bool g_useTempView; extern volatile bool g_asicInitViewMode; extern volatile bool g_logrotate; +extern volatile bool g_syncMode; extern sai_service_method_table_t g_services; extern std::shared_ptr g_asicState; diff --git a/lib/inc/sairedis.h b/lib/inc/sairedis.h index e70a03ad75..610e3952e5 100644 --- a/lib/inc/sairedis.h +++ b/lib/inc/sairedis.h @@ -104,6 +104,19 @@ typedef enum _sai_redis_switch_attr_t */ SAI_REDIS_SWITCH_ATTR_PERFORM_LOG_ROTATE, + /** + * @brief Synchronous mode. + * + * Enable or disable synchronous mode. When enabled syncd also needs to be + * running in synchronous mode. Command pipeline will be disabled when this + * flag will be set to true. + * + * @type bool + * @flags CREATE_AND_SET + * @default false + */ + SAI_REDIS_SWITCH_ATTR_SYNC_MODE, + } sai_redis_switch_attr_t; /* diff --git a/lib/src/sai_redis_generic_set.cpp b/lib/src/sai_redis_generic_set.cpp index 12489293ca..e084d94402 100644 --- a/lib/src/sai_redis_generic_set.cpp +++ b/lib/src/sai_redis_generic_set.cpp @@ -7,6 +7,16 @@ sai_status_t internal_api_wait_for_response( { SWSS_LOG_ENTER(); + if (!g_syncMode) + { + /* + * By default sync mode is disabled and all create/set/remove are + * considered success operations. + */ + + return SAI_STATUS_SUCCESS; + } + SWSS_LOG_INFO("waiting for response %d", api); swss::Select s; diff --git a/lib/src/sai_redis_switch.cpp b/lib/src/sai_redis_switch.cpp index 3d44a4fb7f..36248ccc79 100644 --- a/lib/src/sai_redis_switch.cpp +++ b/lib/src/sai_redis_switch.cpp @@ -7,6 +7,7 @@ volatile bool g_asicInitViewMode = false; // default mode is apply mode volatile bool g_useTempView = false; +volatile bool g_syncMode = false; sai_status_t sai_redis_internal_notify_syncd( _In_ const std::string& key) @@ -266,9 +267,28 @@ sai_status_t redis_set_switch_attribute( g_useTempView = attr->value.booldata; return SAI_STATUS_SUCCESS; + case SAI_REDIS_SWITCH_ATTR_SYNC_MODE: + + g_syncMode = attr->value.booldata; + + if (g_syncMode) + { + SWSS_LOG_NOTICE("disabling buffered pipeline in sync mode"); + g_asicState->setBuffered(false); + } + + return SAI_STATUS_SUCCESS; + case SAI_REDIS_SWITCH_ATTR_USE_PIPELINE: - // g_asicState->setBuffered(attr->value.booldata); // this is ignored in sync mode - return SAI_STATUS_NOT_SUPPORTED; + + if (g_syncMode) + { + SWSS_LOG_WARN("use pipeline is not supported in sync mode"); + return SAI_STATUS_NOT_SUPPORTED; + } + + g_asicState->setBuffered(attr->value.booldata); + return SAI_STATUS_SUCCESS; case SAI_REDIS_SWITCH_ATTR_FLUSH: g_asicState->flush(); diff --git a/syncd/syncd.cpp b/syncd/syncd.cpp index 625ac32aed..e18682d4d1 100644 --- a/syncd/syncd.cpp +++ b/syncd/syncd.cpp @@ -98,6 +98,7 @@ struct cmdOptions bool run_rpc_server; std::string portMapFile; #endif // SAITHRIFT + bool syncMode; ~cmdOptions() {} }; @@ -1006,6 +1007,16 @@ void internal_syncd_api_send_response( { SWSS_LOG_ENTER(); + /* + * By default synchronous mode is disabled and can be enabled by command + * line on syncd start. This will also require to enable synchronous mode + * in OA/sairedis because same GET RESPONSE channel is used to generate + * response for sairedis quad API. + */ + + if (!options.syncMode) + return; + std::vector entry; std::string str_status = sai_serialize_status(status); @@ -3015,7 +3026,7 @@ void processFlexCounterEvent( if (!try_translate_vid_to_rid(vid, rid)) { - SWSS_LOG_WARN("port VID %s, was not found (probably port was removed/splitted) and will remove from counters now", + SWSS_LOG_WARN("port VID %s, was not found (probably port was removed/splitted) and will remove from counters now", sai_serialize_object_id(vid).c_str()); op = DEL_COMMAND; @@ -3158,7 +3169,7 @@ void printUsage() { SWSS_LOG_ENTER(); - std::cout << "Usage: syncd [-N] [-U] [-d] [-p profile] [-i interval] [-t [cold|warm|fast|fastfast]] [-h] [-u] [-S]" << std::endl; + std::cout << "Usage: syncd [-N] [-U] [-d] [-p profile] [-i interval] [-t [cold|warm|fast|fastfast]] [-h] [-u] [-S] [-s]" << std::endl; std::cout << " -N --nocounters" << std::endl; std::cout << " Disable counter thread" << std::endl; std::cout << " -d --diag" << std::endl; @@ -3183,6 +3194,8 @@ void printUsage() std::cout << " -m --portmap" << std::endl; std::cout << " Specify port map file" << std::endl; #endif // SAITHRIFT + std::cout << " -s --syncMode" << std::endl; + std::cout << " Enable synchronous mode" << std::endl; std::cout << " -h --help" << std::endl; std::cout << " Print out this message" << std::endl; } @@ -3193,6 +3206,7 @@ void handleCmdLine(int argc, char **argv) options.disableExitSleep = false; options.enableUnittests = false; + options.syncMode = false; #ifdef SAITHRIFT options.run_rpc_server = false; @@ -3217,6 +3231,7 @@ void handleCmdLine(int argc, char **argv) { "rpcserver", no_argument, 0, 'r' }, { "portmap", required_argument, 0, 'm' }, #endif // SAITHRIFT + { "syncMode", no_argument, 0, 's' }, { 0, 0, 0, 0 } }; @@ -3297,6 +3312,11 @@ void handleCmdLine(int argc, char **argv) break; #endif // SAITHRIFT + case 's': + SWSS_LOG_NOTICE("enable synchronous mode"); + options.syncMode = true; + break; + case 'h': printUsage(); exit(EXIT_SUCCESS);