Skip to content
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

TEST DO NOT MERGE 1509 #1539

Open
wants to merge 26 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
34ea88b
[sairedis/syncd] Implement bulk get support
stepanblyschak Jan 9, 2025
2fcdd29
Implement bulkGet for Recorder and SaiPlayer
stepanblyschak Jan 9, 2025
e4b0f58
Fix transfer_list to return SAI_STATUS_BUFFER_OVERFLOW if dst count is 0
stepanblyschak Jan 9, 2025
65c38b7
Add UT for BUFFER_OVERFLOW
stepanblyschak Jan 13, 2025
922068e
Implement bulk get in vslib
stepanblyschak Jan 14, 2025
1c8389e
Merge branch 'master' into bulk-get
stepanblyschak Jan 24, 2025
2989f1a
Revert "Fix transfer_list to return SAI_STATUS_BUFFER_OVERFLOW if dst…
stepanblyschak Jan 27, 2025
a6b72e3
tests/portBulkGetObjectListInsufficientBuffer: Resize queue list to 1
stepanblyschak Jan 27, 2025
ea6740f
Remove comment
stepanblyschak Jan 27, 2025
3ad34fc
Merge branch 'master' of https://github.com/sonic-net/sonic-sairedis …
stepanblyschak Jan 29, 2025
604a6fc
Lower the log level for bulk get unsupported by vendor SAI
stepanblyschak Feb 3, 2025
87e908f
Merge branch 'master' into bulk-get
stepanblyschak Feb 3, 2025
9ca71ee
Merge branch 'master' into bulk-get
stepanblyschak Feb 4, 2025
098e615
Merge branch 'master' into bulk-get
stepanblyschak Feb 6, 2025
e91d85c
Merge branch 'master' into bulk-get
stepanblyschak Feb 12, 2025
78c8d4e
Merge branch 'master' into bulk-get
stepanblyschak Feb 14, 2025
27ed420
minimize
kcudnik Feb 21, 2025
6f7ce64
update debian
kcudnik Feb 21, 2025
8234400
remove all other tests
kcudnik Feb 21, 2025
eb6b984
sys
kcudnik Feb 21, 2025
66d8352
enable meta test
kcudnik Feb 21, 2025
80490d9
add sys time
kcudnik Feb 21, 2025
0edd69a
remove sys
kcudnik Feb 21, 2025
0f74b64
bring all build
kcudnik Feb 21, 2025
69fda4e
disable test
kcudnik Feb 21, 2025
3b6f9bb
Merge branch 'master' into 1509
kcudnik Feb 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Makefile.am
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
SUBDIRS = meta lib vslib proxylib pyext
SUBDIRS = meta lib vslib

if SYNCD
SUBDIRS += syncd saiplayer saidump saidiscovery saisdkdump saiasiccmp tests unittest
SUBDIRS += syncd saiplayer unittest
endif

ACLOCAL_AMFLAGS = -I m4
41 changes: 0 additions & 41 deletions debian/control
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,6 @@ Priority: optional
Build-Depends: debhelper (>= 12), autotools-dev, libzmq5-dev
Standards-Version: 1.0.0

Package: syncd
Architecture: any
Build-Profiles: <syncd !vs>
Depends: ${misc:Pre-Depends}
Recommends: ${shlibs:Depends}
Conflicts: syncd-rpc, syncd-vs
Description: This package contains sync daemon for SONiC project.
This sync daemon syncs the ASIC_DB in Redis database and the real ASIC via SAI.

Package: syncd-rpc
Architecture: any
Build-Profiles: <syncd rpc !vs>
Depends: ${misc:Pre-Depends}
Recommends: ${shlibs:Depends}
Conflicts: syncd, syncd-vs
Description: This package contains sync daemon with rpc for SONiC project.
This sync daemon syncs the ASIC_DB in Redis database and the real ASIC via SAI.
This daemon contains saithrift rpc library for remote control of an ASIC.

Package: syncd-vs
Architecture: any
Build-Profiles: <syncd !rpc vs>
Depends: ${misc:Pre-Depends}
Recommends: ${shlibs:Depends}
Conflicts: syncd-rpc, syncd
Description: This package contains sync daemon for SONiC project linked with virtual switch.
This sync daemon syncs the ASIC_DB in Redis database and the real ASIC via SAI.

Package: libsairedis
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Pre-Depends}
Expand Down Expand Up @@ -69,16 +41,3 @@ Depends: libsaimetadata (= ${binary:Version})
Section: libdevel
Description: This package contains development files for SAI-Metadata.

Package: python-pysairedis
Architecture: any
Build-Profiles: <!nopython2>
Depends: ${shlibs:Depends}, ${misc:Pre-Depends}
Section: libs
Description: This package contains Switch State Service sairedis Python2 library.

Package: python3-pysairedis
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Pre-Depends}
Section: libs
Description: This package contains Switch State Service sairedis Python3 library.

13 changes: 10 additions & 3 deletions lib/ClientServerSai.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -426,11 +426,18 @@ sai_status_t ClientServerSai::bulkGet(
_In_ sai_bulk_op_error_mode_t mode,
_Out_ sai_status_t *object_statuses)
{
MUTEX();
SWSS_LOG_ENTER();
REDIS_CHECK_API_INITIALIZED();

SWSS_LOG_ERROR("not implemented, FIXME");

return SAI_STATUS_NOT_IMPLEMENTED;
return m_sai->bulkGet(
object_type,
object_count,
object_id,
attr_count,
attr_list,
mode,
object_statuses);
}

// BULK QUAD ENTRY
Expand Down
34 changes: 34 additions & 0 deletions lib/Recorder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -641,6 +641,40 @@ void Recorder::recordGenericGetResponse(
recordLine("G|" + sai_serialize_status(status) + "|" + Globals::joinFieldValues(arguments));
}

void Recorder::recordBulkGenericGet(
_In_ const std::string& key,
_In_ const std::vector<swss::FieldValueTuple>& arguments)
{
SWSS_LOG_ENTER();

std::string joined;

for (const auto &e: arguments)
{
joined += "||" + fvField(e) + "|" + fvValue(e);
}

// capital 'B' stands for Bulk GET operation. Note: 'G' already used for get response.

recordLine("B|" + key + joined);
}

void Recorder::recordBulkGenericGetResponse(
_In_ sai_status_t status,
_In_ const std::vector<swss::FieldValueTuple>& arguments)
{
SWSS_LOG_ENTER();

std::string joined;

for (const auto &e: arguments)
{
joined += "||" + fvField(e) + "|" + fvValue(e);
}

recordLine("G|" + sai_serialize_status(status) + "|" + joined);
}

void Recorder::recordGenericGetStats(
_In_ sai_object_type_t object_type,
_In_ sai_object_id_t object_id,
Expand Down
8 changes: 8 additions & 0 deletions lib/Recorder.h
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,14 @@ namespace sairedis
_In_ uint32_t objectCount,
_In_ const sai_status_t *objectStatuses);

void recordBulkGenericGet(
_In_ const std::string& key,
_In_ const std::vector<swss::FieldValueTuple>& arguments);

void recordBulkGenericGetResponse(
_In_ sai_status_t status,
_In_ const std::vector<swss::FieldValueTuple>& arguments);

public: // SAI query interface API

void recordFlushFdbEntries(
Expand Down
135 changes: 133 additions & 2 deletions lib/RedisRemoteSaiInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
#include "meta/PerformanceIntervalTimer.h"
#include "meta/Globals.h"

#include "swss/tokenize.h"

#include "config.h"

#include <inttypes.h>
Expand Down Expand Up @@ -1674,6 +1676,77 @@ sai_status_t RedisRemoteSaiInterface::waitForBulkResponse(
return SAI_STATUS_SUCCESS;
}

sai_status_t RedisRemoteSaiInterface::waitForBulkGetResponse(
_In_ sai_object_type_t objectType,
_In_ uint32_t object_count,
_In_ const uint32_t *attr_count,
_Inout_ sai_attribute_t **attr_list,
_Out_ sai_status_t *object_statuses)
{
SWSS_LOG_ENTER();

swss::KeyOpFieldsValuesTuple kco;

const auto status = m_communicationChannel->wait(REDIS_ASIC_STATE_COMMAND_GETRESPONSE, kco);

const auto &values = kfvFieldsValues(kco);

if (values.size() != object_count)
{
SWSS_LOG_THROW("wrong number of statuses, got %zu, expected %u", values.size(), object_count);
}

for (size_t idx = 0; idx < values.size(); idx++)
{
// field = status
// value = attrid=attrvalue|...

const auto& statusStr = fvField(values[idx]);
const auto& joined = fvValue(values[idx]);

const auto v = swss::tokenize(joined, '|');

std::vector<swss::FieldValueTuple> entries; // attributes per object id
entries.reserve(v.size());

for (size_t i = 0; i < v.size(); i++)
{
const std::string item = v.at(i);

auto start = item.find_first_of("=");

auto field = item.substr(0, start);
auto value = item.substr(start + 1);

entries.emplace_back(field, value);
}

// deserialize statuses for all objects
sai_deserialize_status(statusStr, object_statuses[idx]);

const auto objectStatus = object_statuses[idx];

if (objectStatus == SAI_STATUS_SUCCESS || objectStatus == SAI_STATUS_BUFFER_OVERFLOW)
{
const auto countOnly = (objectStatus == SAI_STATUS_BUFFER_OVERFLOW);

if (values.size() == 0)
{
SWSS_LOG_THROW("logic error, get response returned 0 values!, send api response or sync/async issue?");
}

SaiAttributeList list(objectType, entries, countOnly);

// no need for id fix since this is overflow
transfer_attributes(objectType, attr_count[idx], list.get_attr_list(), attr_list[idx], countOnly);
}
}

m_recorder->recordBulkGenericGetResponse(status, values);

return status;
}

sai_status_t RedisRemoteSaiInterface::bulkRemove(
_In_ sai_object_type_t object_type,
_In_ uint32_t object_count,
Expand Down Expand Up @@ -1764,9 +1837,67 @@ sai_status_t RedisRemoteSaiInterface::bulkGet(
{
SWSS_LOG_ENTER();

SWSS_LOG_ERROR("not implemented, FIXME");
std::vector<std::string> serializedObjectIds;
serializedObjectIds.reserve(object_count);

return SAI_STATUS_NOT_IMPLEMENTED;
for (uint32_t idx = 0; idx < object_count; idx++)
{
serializedObjectIds.emplace_back(sai_serialize_object_id(object_id[idx]));
}

return bulkGet(object_type, serializedObjectIds, attr_count, attr_list, mode, object_statuses);
}

sai_status_t RedisRemoteSaiInterface::bulkGet(
_In_ sai_object_type_t object_type,
_In_ const std::vector<std::string> &serialized_object_ids,
_In_ const uint32_t *attr_count,
_Inout_ sai_attribute_t **attr_list,
_In_ sai_bulk_op_error_mode_t mode,
_Inout_ sai_status_t *object_statuses)
{
SWSS_LOG_ENTER();

const auto serializedObjectType = sai_serialize_object_type(object_type);

std::vector<swss::FieldValueTuple> entries;
entries.reserve(serialized_object_ids.size());

for (size_t idx = 0; idx < serialized_object_ids.size(); idx++)
{
/*
* Since user may reuse buffers, then oid list buffers maybe not cleared
* and contain some garbage, let's clean them so we send all oids as null to
* syncd.
*/

Utils::clearOidValues(object_type, attr_count[idx], attr_list[idx]);

const auto entry = SaiAttributeList::serialize_attr_list(object_type, attr_count[idx], attr_list[idx], false);

const auto strAttr = Globals::joinFieldValues(entry);

swss::FieldValueTuple fvt(serialized_object_ids[idx] , strAttr);

entries.push_back(fvt);
}

/*
* We are adding number of entries to actually add ':' to be compatible
* with previous
*/

const auto key = serializedObjectType + ":" + std::to_string(entries.size());

m_communicationChannel->set(key, entries, REDIS_ASIC_STATE_COMMAND_BULK_GET);

m_recorder->recordBulkGenericGet(serializedObjectType, entries);

const auto object_count = static_cast<uint32_t>(serialized_object_ids.size());

const auto status = waitForBulkGetResponse(object_type, object_count, attr_count, attr_list, object_statuses);

return status;
}

sai_status_t RedisRemoteSaiInterface::bulkCreate(
Expand Down
25 changes: 25 additions & 0 deletions lib/RedisRemoteSaiInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,14 @@ namespace sairedis
_In_ sai_bulk_op_error_mode_t mode,
_Out_ sai_status_t *object_statuses);

sai_status_t bulkGet(
_In_ sai_object_type_t object_type,
_In_ const std::vector<std::string> &serialized_object_ids,
_In_ const uint32_t *attr_count,
_Inout_ sai_attribute_t **attr_list,
_In_ sai_bulk_op_error_mode_t mode,
_Out_ sai_status_t *object_statuses);

private: // QUAD API response

/**
Expand Down Expand Up @@ -317,6 +325,23 @@ namespace sairedis
_In_ uint32_t object_count,
_Out_ sai_status_t *object_statuses);

/**
* @brief Wait for bulk GET response.
*
* Will wait for response from syncd. Method only used for bulk
* GET object. If object status is SUCCESS all values will be deserialized
* and transferred to user buffers. If object status is BUFFER_OVERFLOW
* then all non list values will be transferred, but LIST objects
* will only transfer COUNT item of list, without touching user
* list at all.
*/
sai_status_t waitForBulkGetResponse(
_In_ sai_object_type_t objectType,
_In_ uint32_t object_count,
_In_ const uint32_t *attr_count,
_Inout_ sai_attribute_t **attr_list,
_Out_ sai_status_t *object_statuses);

private: // stats API response

sai_status_t waitForGetStatsResponse(
Expand Down
14 changes: 11 additions & 3 deletions lib/Sai.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -524,11 +524,19 @@ sai_status_t Sai::bulkGet(
_In_ sai_bulk_op_error_mode_t mode,
_Out_ sai_status_t *object_statuses)
{
MUTEX();
SWSS_LOG_ENTER();
REDIS_CHECK_API_INITIALIZED();
REDIS_CHECK_CONTEXT(*object_id);

SWSS_LOG_ERROR("not implemented, FIXME");

return SAI_STATUS_NOT_IMPLEMENTED;
return context->m_meta->bulkGet(
object_type,
object_count,
object_id,
attr_count,
attr_list,
mode,
object_statuses);
}

// BULK QUAD ENTRY
Expand Down
11 changes: 8 additions & 3 deletions lib/ServerSai.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -452,9 +452,14 @@ sai_status_t ServerSai::bulkGet(
SWSS_LOG_ENTER();
REDIS_CHECK_API_INITIALIZED();

SWSS_LOG_ERROR("not implemented, FIXME");

return SAI_STATUS_NOT_IMPLEMENTED;
return m_sai->bulkGet(
object_type,
object_count,
object_id,
attr_count,
attr_list,
mode,
object_statuses);
}

// BULK QUAD ENTRY
Expand Down
Loading
Loading