Skip to content

Commit 7c70e34

Browse files
authored
[sairedis] Add support for bulk api in client/server (#844)
1 parent 76d28a6 commit 7c70e34

File tree

4 files changed

+793
-52
lines changed

4 files changed

+793
-52
lines changed

lib/inc/ServerSai.h

+45-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#pragma once
22

33
#include "SaiInterface.h"
4-
4+
#include "meta/SaiAttributeList.h"
55
#include "syncd/SelectableChannel.h"
66

77
#include "swss/selectableevent.h"
@@ -291,6 +291,50 @@ namespace sairedis
291291
_In_ uint32_t attr_count,
292292
_In_ sai_attribute_t *attr_list);
293293

294+
// BULK
295+
296+
sai_status_t processBulkQuadEvent(
297+
_In_ sai_common_api_t api,
298+
_In_ const swss::KeyOpFieldsValuesTuple &kco);
299+
300+
sai_status_t processBulkOid(
301+
_In_ sai_object_type_t objectType,
302+
_In_ const std::vector<std::string>& strObjectIds,
303+
_In_ sai_common_api_t api,
304+
_In_ const std::vector<std::shared_ptr<saimeta::SaiAttributeList>>& attributes,
305+
_In_ const std::vector<std::vector<swss::FieldValueTuple>>& strAttributes);
306+
307+
sai_status_t processBulkEntry(
308+
_In_ sai_object_type_t objectType,
309+
_In_ const std::vector<std::string>& objectIds,
310+
_In_ sai_common_api_t api,
311+
_In_ const std::vector<std::shared_ptr<saimeta::SaiAttributeList>>& attributes,
312+
_In_ const std::vector<std::vector<swss::FieldValueTuple>>& strAttributes);
313+
314+
sai_status_t processBulkCreateEntry(
315+
_In_ sai_object_type_t objectType,
316+
_In_ const std::vector<std::string>& objectIds,
317+
_In_ const std::vector<std::shared_ptr<saimeta::SaiAttributeList>>& attributes,
318+
_Out_ std::vector<sai_status_t>& statuses);
319+
320+
sai_status_t processBulkRemoveEntry(
321+
_In_ sai_object_type_t objectType,
322+
_In_ const std::vector<std::string>& objectIds,
323+
_Out_ std::vector<sai_status_t>& statuses);
324+
325+
sai_status_t processBulkSetEntry(
326+
_In_ sai_object_type_t objectType,
327+
_In_ const std::vector<std::string>& objectIds,
328+
_In_ const std::vector<std::shared_ptr<saimeta::SaiAttributeList>>& attributes,
329+
_Out_ std::vector<sai_status_t>& statuses);
330+
331+
void sendBulkApiResponse(
332+
_In_ sai_common_api_t api,
333+
_In_ sai_status_t status,
334+
_In_ uint32_t object_count,
335+
_In_ const sai_object_id_t* object_ids,
336+
_In_ const sai_status_t* statuses);
337+
294338
private:
295339

296340
bool m_apiInitialized;

lib/src/ClientSai.cpp

+36-36
Original file line numberDiff line numberDiff line change
@@ -746,8 +746,8 @@ sai_status_t ClientSai::waitForQueryAttributeCapabilityResponse(
746746
capability->get_implemented = (fvValue(values[2]) == "true" ? true : false);
747747

748748
SWSS_LOG_DEBUG("Received payload: create_implemented:%s, set_implemented:%s, get_implemented:%s",
749-
(capability->create_implemented ? "true" : "false"),
750-
(capability->set_implemented ? "true" : "false"),
749+
(capability->create_implemented ? "true" : "false"),
750+
(capability->set_implemented ? "true" : "false"),
751751
(capability->get_implemented ? "true" : "false"));
752752
}
753753

@@ -1012,40 +1012,40 @@ sai_status_t ClientSai::bulkCreate(
10121012

10131013
// TODO support mode
10141014

1015-
SWSS_LOG_THROW("TODO, not implemented, FIXME");
1016-
1017-
//for (uint32_t idx = 0; idx < object_count; idx++)
1018-
//{
1019-
// object_id[idx] = m_virtualObjectIdManager->allocateNewObjectId(object_type, switch_id);
1020-
1021-
// if (object_id[idx] == SAI_NULL_OBJECT_ID)
1022-
// {
1023-
// SWSS_LOG_ERROR("failed to create %s, with switch id: %s",
1024-
// sai_serialize_object_type(object_type).c_str(),
1025-
// sai_serialize_object_id(switch_id).c_str());
1026-
1027-
// return SAI_STATUS_INSUFFICIENT_RESOURCES;
1028-
// }
1029-
//}
1030-
1031-
//std::vector<std::string> serialized_object_ids;
1032-
1033-
//// on create vid is put in db by syncd
1034-
//for (uint32_t idx = 0; idx < object_count; idx++)
1035-
//{
1036-
// std::string str_object_id = sai_serialize_object_id(object_id[idx]);
1037-
// serialized_object_ids.push_back(str_object_id);
1038-
//}
1039-
1040-
//auto status = bulkCreate(
1041-
// object_type,
1042-
// serialized_object_ids,
1043-
// attr_count,
1044-
// attr_list,
1045-
// mode,
1046-
// object_statuses);
1047-
1048-
// TODO m_lastCreateOids
1015+
std::vector<std::string> serialized_object_ids;
1016+
1017+
// server is responsible for generate new OID but for that we need switch ID
1018+
// to be sent to server as well, so instead of sending empty oids we will
1019+
// send switch IDs
1020+
for (uint32_t idx = 0; idx < object_count; idx++)
1021+
{
1022+
serialized_object_ids.emplace_back(sai_serialize_object_id(switch_id));
1023+
}
1024+
1025+
auto status = bulkCreate(
1026+
object_type,
1027+
serialized_object_ids,
1028+
attr_count,
1029+
attr_list,
1030+
mode,
1031+
object_statuses);
1032+
1033+
for (uint32_t idx = 0; idx < object_count; idx++)
1034+
{
1035+
// since user requested create, OID value was created remotely and it
1036+
// was returned in m_lastCreateOids
1037+
1038+
if (object_statuses[idx] == SAI_STATUS_SUCCESS)
1039+
{
1040+
object_id[idx] = m_lastCreateOids.at(idx);
1041+
}
1042+
else
1043+
{
1044+
object_id[idx] = SAI_NULL_OBJECT_ID;
1045+
}
1046+
}
1047+
1048+
return status;
10491049
}
10501050

10511051
sai_status_t ClientSai::bulkCreate(

0 commit comments

Comments
 (0)