Skip to content

Commit be8059f

Browse files
authored
[sairedis] Add get response timeout knob (sonic-net#774)
Knob needed by mlnx when doing firmware update on some platforms, which can exceed default 1 min timeout.
1 parent 3663e30 commit be8059f

7 files changed

+67
-13
lines changed

lib/inc/Channel.h

+9
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ namespace sairedis
2828

2929
virtual ~Channel();
3030

31+
public:
32+
33+
void setResponseTimeout(
34+
_In_ uint64_t responseTimeout);
35+
36+
uint64_t getResponseTimeout() const;
37+
3138
public:
3239

3340
virtual void setBuffered(
@@ -56,6 +63,8 @@ namespace sairedis
5663

5764
Callback m_callback;
5865

66+
uint64_t m_responseTimeoutMs;
67+
5968
protected: // notification
6069

6170
/**

lib/inc/RedisRemoteSaiInterface.h

+2
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,8 @@ namespace sairedis
465465

466466
std::shared_ptr<Channel> m_communicationChannel;
467467

468+
uint64_t m_responseTimeoutMs;
469+
468470
std::function<sai_switch_notifications_t(std::shared_ptr<Notification>)> m_notificationCallback;
469471

470472
std::map<sai_object_id_t, swss::TableDump> m_tableDump;

lib/inc/sairedis.h

+17
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ extern "C" {
1313
*/
1414
#define SAI_REDIS_KEY_CONTEXT_CONFIG "SAI_REDIS_CONTEXT_CONFIG"
1515

16+
/**
17+
* @brief Default synchronous operation response timeout in milliseconds.
18+
*/
19+
#define SAI_REDIS_DEFAULT_SYNC_OPERATION_RESPONSE_TIMEOUT (60*1000)
20+
1621
typedef enum _sai_redis_notify_syncd_t
1722
{
1823
SAI_REDIS_NOTIFY_SYNCD_INIT_VIEW,
@@ -205,4 +210,16 @@ typedef enum _sai_redis_switch_attr_t
205210
*/
206211
SAI_REDIS_SWITCH_ATTR_RECORDING_FILENAME,
207212

213+
/**
214+
* @brief Synchronous operation response timeout in milliseconds.
215+
*
216+
* Used for every synchronous API call. In asynchronous mode used for GET
217+
* operation.
218+
*
219+
* @type sai_uint64_t
220+
* @flags CREATE_AND_SET
221+
* @default 60000
222+
*/
223+
SAI_REDIS_SWITCH_ATTR_SYNC_OPERATION_RESPONSE_TIMEOUT,
224+
208225
} sai_redis_switch_attr_t;

lib/src/Channel.cpp

+19-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
#include "Channel.h"
22

3+
#include "sairedis.h"
4+
35
#include "swss/logger.h"
46

57
using namespace sairedis;
68

79
Channel::Channel(
810
_In_ Callback callback):
9-
m_callback(callback)
11+
m_callback(callback),
12+
m_responseTimeoutMs(SAI_REDIS_DEFAULT_SYNC_OPERATION_RESPONSE_TIMEOUT)
1013
{
1114
SWSS_LOG_ENTER();
1215

@@ -19,3 +22,18 @@ Channel::~Channel()
1922

2023
// empty
2124
}
25+
26+
void Channel::setResponseTimeout(
27+
_In_ uint64_t responseTimeout)
28+
{
29+
SWSS_LOG_ENTER();
30+
31+
m_responseTimeoutMs = responseTimeout;
32+
}
33+
34+
uint64_t Channel::getResponseTimeout() const
35+
{
36+
SWSS_LOG_ENTER();
37+
38+
return m_responseTimeoutMs;
39+
}

lib/src/RedisChannel.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@
99

1010
using namespace sairedis;
1111

12-
/**
13-
* @brief Get response timeout in milliseconds.
14-
*/
15-
#define REDIS_ASIC_STATE_COMMAND_GETRESPONSE_TIMEOUT_MS (60*1000)
16-
1712
RedisChannel::RedisChannel(
1813
_In_ const std::string& dbAsic,
1914
_In_ Channel::Callback callback):
@@ -179,7 +174,7 @@ sai_status_t RedisChannel::wait(
179174

180175
swss::Selectable *sel;
181176

182-
int result = s.select(&sel, REDIS_ASIC_STATE_COMMAND_GETRESPONSE_TIMEOUT_MS);
177+
int result = s.select(&sel, (int)m_responseTimeoutMs);
183178

184179
if (result == swss::Select::OBJECT)
185180
{

lib/src/RedisRemoteSaiInterface.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ sai_status_t RedisRemoteSaiInterface::initialize(
9292
std::bind(&RedisRemoteSaiInterface::handleNotification, this, _1, _2, _3));
9393
}
9494

95+
m_responseTimeoutMs = m_communicationChannel->getResponseTimeout();
96+
9597
m_db = std::make_shared<swss::DBConnector>(m_contextConfig->m_dbAsic, 0);
9698

9799
m_redisVidIndexGenerator = std::make_shared<RedisVidIndexGenerator>(m_db, REDIS_KEY_VIDCOUNTER);
@@ -355,6 +357,16 @@ sai_status_t RedisRemoteSaiInterface::setRedisExtensionAttribute(
355357

356358
return SAI_STATUS_SUCCESS;
357359

360+
case SAI_REDIS_SWITCH_ATTR_SYNC_OPERATION_RESPONSE_TIMEOUT:
361+
362+
m_responseTimeoutMs = attr->value.u64;
363+
364+
m_communicationChannel->setResponseTimeout(m_responseTimeoutMs);
365+
366+
SWSS_LOG_NOTICE("set response timeout to %lu ms", m_responseTimeoutMs);
367+
368+
return SAI_STATUS_SUCCESS;
369+
358370
case SAI_REDIS_SWITCH_ATTR_SYNC_MODE:
359371

360372
SWSS_LOG_WARN("sync mode is depreacated, use communication mode");
@@ -402,6 +414,8 @@ sai_status_t RedisRemoteSaiInterface::setRedisExtensionAttribute(
402414
m_contextConfig->m_dbAsic,
403415
std::bind(&RedisRemoteSaiInterface::handleNotification, this, _1, _2, _3));
404416

417+
m_communicationChannel->setResponseTimeout(m_responseTimeoutMs);
418+
405419
m_communicationChannel->setBuffered(true);
406420

407421
return SAI_STATUS_SUCCESS;
@@ -416,6 +430,8 @@ sai_status_t RedisRemoteSaiInterface::setRedisExtensionAttribute(
416430
m_contextConfig->m_dbAsic,
417431
std::bind(&RedisRemoteSaiInterface::handleNotification, this, _1, _2, _3));
418432

433+
m_communicationChannel->setResponseTimeout(m_responseTimeoutMs);
434+
419435
m_communicationChannel->setBuffered(false);
420436

421437
return SAI_STATUS_SUCCESS;
@@ -432,6 +448,8 @@ sai_status_t RedisRemoteSaiInterface::setRedisExtensionAttribute(
432448
m_contextConfig->m_zmqNtfEndpoint,
433449
std::bind(&RedisRemoteSaiInterface::handleNotification, this, _1, _2, _3));
434450

451+
m_communicationChannel->setResponseTimeout(m_responseTimeoutMs);
452+
435453
SWSS_LOG_NOTICE("zmq enabled, forcing sync mode");
436454

437455
m_syncMode = true;

lib/src/ZeroMQChannel.cpp

+1-6
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@
1212

1313
using namespace sairedis;
1414

15-
/**
16-
* @brief Get response timeout in milliseconds.
17-
*/
18-
#define ZMQ_GETRESPONSE_TIMEOUT_MS (60*1000)
19-
2015
#define ZMQ_RESPONSE_BUFFER_SIZE (4*1024*1024)
2116

2217
ZeroMQChannel::ZeroMQChannel(
@@ -273,7 +268,7 @@ sai_status_t ZeroMQChannel::wait(
273268
items[0].socket = m_socket;
274269
items[0].events = ZMQ_POLLIN;
275270

276-
int rc = zmq_poll(items, 1, ZMQ_GETRESPONSE_TIMEOUT_MS);
271+
int rc = zmq_poll(items, 1, (int)m_responseTimeoutMs);
277272

278273
if (rc == 0)
279274
{

0 commit comments

Comments
 (0)