-
Notifications
You must be signed in to change notification settings - Fork 278
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[sairedis/syncd] Implement bulk get support #1509
base: master
Are you sure you want to change the base?
Conversation
Signed-off-by: Stepan Blyschak <[email protected]>
Signed-off-by: Stepan Blyschak <[email protected]>
Signed-off-by: Stepan Blyschak <[email protected]>
Signed-off-by: Stepan Blyschak <[email protected]>
Signed-off-by: Stepan Blyschak <[email protected]>
/azp run |
Azure Pipelines successfully started running 1 pipeline(s). |
/azp run |
Azure Pipelines successfully started running 1 pipeline(s). |
|
||
status = meta_generic_validation_get(meta_key, attr_count[idx], attr_list[idx]); | ||
|
||
// FIXME: This macro returns on failure. |
Check notice
Code scanning / CodeQL
FIXME comment Note
switch (api) | ||
{ | ||
case SAI_COMMON_API_BULK_CREATE: | ||
|
||
{ | ||
sai_object_id_t switch_id = m_sai->switchIdQuery(local_ids[0]); | ||
std::vector<sai_object_id_t> ids(object_count); | ||
|
||
for (uint32_t it = 0; it < object_count; it++) | ||
{ | ||
if (m_sai->switchIdQuery(local_ids[it]) != switch_id || | ||
switch_id == SAI_NULL_OBJECT_ID) | ||
{ | ||
SWSS_LOG_THROW("invalid switch_id translated from VID %s", | ||
sai_serialize_object_id(local_ids[it]).c_str()); | ||
} | ||
} | ||
|
||
std::vector<uint32_t> attr_counts(object_count); | ||
|
||
std::vector<const sai_attribute_t*> attr_lists(object_count); | ||
|
||
for (uint32_t idx = 0; idx < object_count; idx++) | ||
{ | ||
attr_counts[idx] = attributes[idx]->get_attr_count(); | ||
attr_lists[idx] = attributes[idx]->get_attr_list(); | ||
} | ||
|
||
switch_id = translate_local_to_redis(switch_id); | ||
|
||
status = m_sai->bulkCreate(object_type, | ||
switch_id, | ||
object_count, | ||
attr_counts.data(), | ||
attr_lists.data(), | ||
mode, | ||
ids.data(), | ||
statuses.data()); | ||
|
||
if (status == SAI_STATUS_SUCCESS) | ||
{ | ||
for (uint32_t it = 0; it < object_count; it++) | ||
{ | ||
match_redis_with_rec(ids[it], local_ids[it]); | ||
|
||
SWSS_LOG_INFO("saved VID %s to RID %s", | ||
sai_serialize_object_id(local_ids[it]).c_str(), | ||
sai_serialize_object_id(ids[it]).c_str()); | ||
} | ||
} | ||
|
||
return status; | ||
} | ||
break; | ||
|
||
case SAI_COMMON_API_BULK_REMOVE: | ||
|
||
{ | ||
std::vector<sai_object_id_t> ids(object_count); | ||
|
||
for (uint32_t it = 0; it < object_count; it++) | ||
{ | ||
ids[it] = translate_local_to_redis(local_ids[it]); | ||
} | ||
|
||
status = m_sai->bulkRemove(object_type, object_count, ids.data(), mode, statuses.data()); | ||
} | ||
break; | ||
|
||
case SAI_COMMON_API_BULK_SET: | ||
|
||
{ | ||
std::vector<sai_object_id_t> ids(object_count); | ||
|
||
for (uint32_t it = 0; it < object_count; it++) | ||
{ | ||
ids[it] = translate_local_to_redis(local_ids[it]); | ||
} | ||
|
||
std::vector<sai_attribute_t> attr_list; | ||
|
||
// 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()[0]); | ||
} | ||
|
||
status = m_sai->bulkSet(object_type, object_count, ids.data(), attr_list.data(), mode, statuses.data()); | ||
} | ||
break; | ||
|
||
case SAI_COMMON_API_BULK_GET: | ||
|
||
{ |
Check notice
Code scanning / CodeQL
Long switch case Note
SAI_COMMON_API_BULK_CREATE (52 lines)
switch (api) | ||
{ | ||
case SAI_COMMON_API_BULK_GET: | ||
sendBulkGetResponse(objectType, objectIds, all, attributes, statuses); | ||
break; | ||
default: | ||
sendApiResponse(api, all, (uint32_t)objectIds.size(), statuses.data()); | ||
break; | ||
} |
Check notice
Code scanning / CodeQL
No trivial switch statements Note
switch (api) | ||
{ | ||
case SAI_COMMON_API_BULK_GET: | ||
sendBulkGetResponse(objectType, objectIds, all, attributes, statuses); | ||
break; | ||
default: | ||
sendApiResponse(api, all, (uint32_t)objectIds.size(), statuses.data()); | ||
break; | ||
} |
Check notice
Code scanning / CodeQL
No trivial switch statements Note
switch (object_type) | ||
{ | ||
case SAI_OBJECT_TYPE_PORT: | ||
ptr = m_apis.port_api->get_ports_attribute; | ||
break; | ||
|
||
SWSS_LOG_ERROR("not implemented, FIXME"); | ||
default: | ||
SWSS_LOG_ERROR("not implemented %s, FIXME", sai_serialize_object_type(object_type).c_str()); | ||
return SAI_STATUS_NOT_IMPLEMENTED; | ||
} |
Check notice
Code scanning / CodeQL
No trivial switch statements Note
|
||
// FIXME: This macro returns on failure. | ||
// When mode is SAI_BULK_OP_ERROR_MODE_IGNORE_ERROR we should continue instead of return. | ||
// This issue exists for all bulk operations. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should we fix it here for this api ? since GET operation is specific, so maybe some attributes maybe not implemented and they will definitely return failure
@@ -90,24 +90,27 @@ static sai_status_t transfer_list( | |||
{ | |||
SWSS_LOG_ENTER(); | |||
|
|||
if (countOnly || dst_element.count == 0) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why this logic is changed ?
attr_counts.data(), | ||
attr_lists.data(), | ||
mode, | ||
statuses.data()); // STATUS_NOT_EXECUTED |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why this comment means not executed ?
@@ -2522,17 +2629,17 @@ int SaiPlayer::replay() | |||
|
|||
SWSS_LOG_NOTICE("using file: %s", filename.c_str()); | |||
|
|||
std::ifstream infile(filename); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why this logic is changed ? not need for this variable to be member of class
@@ -259,6 +260,8 @@ namespace saiplayer | |||
|
|||
std::shared_ptr<CommandLineOptions> m_commandLineOptions; | |||
|
|||
std::ifstream m_infile; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why this is moved to member ?
for (auto &a: statuses) | ||
{ | ||
a = SAI_STATUS_SUCCESS; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why this is removeD ?
@@ -4,27 +4,3 @@ | |||
#include <gtest/gtest.h> | |||
|
|||
using namespace sairedis; | |||
|
|||
TEST(RedisRemoteSaiInterface, bulkGet) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please don't remove tests, implement correct TEST to validate your code
@@ -69,7 +69,7 @@ TEST_F(SwitchStateBaseTest, switchHashGet) | |||
attr.id = SAI_HASH_ATTR_NATIVE_HASH_FIELD_LIST; | |||
attr.value.s32list.list = nullptr; | |||
attr.value.s32list.count = 0; | |||
ASSERT_EQ(m_ss->get(SAI_OBJECT_TYPE_HASH, sai_serialize_object_id(ecmpHashOid), 1, &attr), SAI_STATUS_SUCCESS); | |||
ASSERT_EQ(m_ss->get(SAI_OBJECT_TYPE_HASH, sai_serialize_object_id(ecmpHashOid), 1, &attr), SAI_STATUS_BUFFER_OVERFLOW); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why this suddenly chhanges status ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
address comments
Implement bulk get support for SAIRedis, Syncd, SaiPlayer and VSlib.