Skip to content

Commit 9f9a069

Browse files
wendanilguohan
authored andcommitted
Fix PFC watchdog not getting lossless TC (sonic-net#876)
* Allow PFC watchdog to retry start on port Signed-off-by: Wenda Ni <[email protected]> * Specify the qos mapping order in doTask() to avoid retry Signed-off-by: Wenda Ni <[email protected]> * Remove debugging symbols Signed-off-by: Wenda Ni <[email protected]> * Reduce log level to NOTICE for empty lossless TC on a port Signed-off-by: Wenda Ni <[email protected]>
1 parent b0ad3eb commit 9f9a069

File tree

4 files changed

+75
-26
lines changed

4 files changed

+75
-26
lines changed

orchagent/pfcwdorch.cpp

+49-22
Original file line numberDiff line numberDiff line change
@@ -68,20 +68,38 @@ void PfcWdOrch<DropHandler, ForwardHandler>::doTask(Consumer& consumer)
6868
string key = kfvKey(t);
6969
string op = kfvOp(t);
7070

71+
task_process_status task_status = task_process_status::task_ignore;
7172
if (op == SET_COMMAND)
7273
{
73-
createEntry(key, kfvFieldsValues(t));
74+
task_status = createEntry(key, kfvFieldsValues(t));
7475
}
7576
else if (op == DEL_COMMAND)
7677
{
77-
deleteEntry(key);
78+
task_status = deleteEntry(key);
7879
}
7980
else
8081
{
82+
task_status = task_process_status::task_invalid_entry;
8183
SWSS_LOG_ERROR("Unknown operation type %s\n", op.c_str());
8284
}
83-
84-
consumer.m_toSync.erase(it++);
85+
switch (task_status)
86+
{
87+
case task_process_status::task_success:
88+
consumer.m_toSync.erase(it++);
89+
break;
90+
case task_process_status::task_need_retry:
91+
SWSS_LOG_INFO("Failed to process PFC watchdog %s task, retry it", op.c_str());
92+
++it;
93+
break;
94+
case task_process_status::task_invalid_entry:
95+
SWSS_LOG_ERROR("Failed to process PFC watchdog %s task, invalid entry", op.c_str());
96+
consumer.m_toSync.erase(it++);
97+
break;
98+
default:
99+
SWSS_LOG_ERROR("Invalid task status %d", task_status);
100+
consumer.m_toSync.erase(it++);
101+
break;
102+
}
85103
}
86104

87105
if (consumer.m_toSync.empty())
@@ -156,7 +174,7 @@ string PfcWdOrch<DropHandler, ForwardHandler>::serializeAction(const PfcWdAction
156174

157175

158176
template <typename DropHandler, typename ForwardHandler>
159-
void PfcWdOrch<DropHandler, ForwardHandler>::createEntry(const string& key,
177+
task_process_status PfcWdOrch<DropHandler, ForwardHandler>::createEntry(const string& key,
160178
const vector<FieldValueTuple>& data)
161179
{
162180
SWSS_LOG_ENTER();
@@ -170,13 +188,13 @@ void PfcWdOrch<DropHandler, ForwardHandler>::createEntry(const string& key,
170188
if (!gPortsOrch->getPort(key, port))
171189
{
172190
SWSS_LOG_ERROR("Invalid port interface %s", key.c_str());
173-
return;
191+
return task_process_status::task_invalid_entry;
174192
}
175193

176194
if (port.m_type != Port::PHY)
177195
{
178196
SWSS_LOG_ERROR("Interface %s is not physical port", key.c_str());
179-
return;
197+
return task_process_status::task_invalid_entry;
180198
}
181199

182200
for (auto i : data)
@@ -205,7 +223,7 @@ void PfcWdOrch<DropHandler, ForwardHandler>::createEntry(const string& key,
205223
if (action == PfcWdAction::PFC_WD_ACTION_UNKNOWN)
206224
{
207225
SWSS_LOG_ERROR("Invalid PFC Watchdog action %s", value.c_str());
208-
return;
226+
return task_process_status::task_invalid_entry;
209227
}
210228
}
211229
else
@@ -214,7 +232,7 @@ void PfcWdOrch<DropHandler, ForwardHandler>::createEntry(const string& key,
214232
"Failed to parse PFC Watchdog %s configuration. Unknown attribute %s.\n",
215233
key.c_str(),
216234
field.c_str());
217-
return;
235+
return task_process_status::task_invalid_entry;
218236
}
219237
}
220238
catch (const exception& e)
@@ -224,36 +242,37 @@ void PfcWdOrch<DropHandler, ForwardHandler>::createEntry(const string& key,
224242
key.c_str(),
225243
field.c_str(),
226244
e.what());
227-
return;
245+
return task_process_status::task_invalid_entry;
228246
}
229247
catch (...)
230248
{
231249
SWSS_LOG_ERROR(
232250
"Failed to parse PFC Watchdog %s attribute %s. Unknown error has been occurred",
233251
key.c_str(),
234252
field.c_str());
235-
return;
253+
return task_process_status::task_invalid_entry;
236254
}
237255
}
238256

239257
// Validation
240258
if (detectionTime == 0)
241259
{
242260
SWSS_LOG_ERROR("%s missing", PFC_WD_DETECTION_TIME);
243-
return;
261+
return task_process_status::task_invalid_entry;
244262
}
245263

246264
if (!startWdOnPort(port, detectionTime, restorationTime, action))
247265
{
248266
SWSS_LOG_ERROR("Failed to start PFC Watchdog on port %s", port.m_alias.c_str());
249-
return;
267+
return task_process_status::task_need_retry;
250268
}
251269

252270
SWSS_LOG_NOTICE("Started PFC Watchdog on port %s", port.m_alias.c_str());
271+
return task_process_status::task_success;
253272
}
254273

255274
template <typename DropHandler, typename ForwardHandler>
256-
void PfcWdOrch<DropHandler, ForwardHandler>::deleteEntry(const string& name)
275+
task_process_status PfcWdOrch<DropHandler, ForwardHandler>::deleteEntry(const string& name)
257276
{
258277
SWSS_LOG_ENTER();
259278

@@ -263,14 +282,15 @@ void PfcWdOrch<DropHandler, ForwardHandler>::deleteEntry(const string& name)
263282
if (!stopWdOnPort(port))
264283
{
265284
SWSS_LOG_ERROR("Failed to stop PFC Watchdog on port %s", name.c_str());
266-
return;
285+
return task_process_status::task_failed;
267286
}
268287

269288
SWSS_LOG_NOTICE("Stopped PFC Watchdog on port %s", name.c_str());
289+
return task_process_status::task_success;
270290
}
271291

272292
template <typename DropHandler, typename ForwardHandler>
273-
void PfcWdSwOrch<DropHandler, ForwardHandler>::createEntry(const string& key,
293+
task_process_status PfcWdSwOrch<DropHandler, ForwardHandler>::createEntry(const string& key,
274294
const vector<FieldValueTuple>& data)
275295
{
276296
SWSS_LOG_ENTER();
@@ -297,8 +317,10 @@ void PfcWdSwOrch<DropHandler, ForwardHandler>::createEntry(const string& key,
297317
}
298318
else
299319
{
300-
PfcWdOrch<DropHandler, ForwardHandler>::createEntry(key, data);
320+
return PfcWdOrch<DropHandler, ForwardHandler>::createEntry(key, data);
301321
}
322+
323+
return task_process_status::task_success;
302324
}
303325

304326
template <typename DropHandler, typename ForwardHandler>
@@ -457,7 +479,7 @@ void PfcWdSwOrch<DropHandler, ForwardHandler>::enableBigRedSwitchMode()
457479
}
458480

459481
template <typename DropHandler, typename ForwardHandler>
460-
void PfcWdSwOrch<DropHandler, ForwardHandler>::registerInWdDb(const Port& port,
482+
bool PfcWdSwOrch<DropHandler, ForwardHandler>::registerInWdDb(const Port& port,
461483
uint32_t detectionTime, uint32_t restorationTime, PfcWdAction action)
462484
{
463485
SWSS_LOG_ENTER();
@@ -467,7 +489,7 @@ void PfcWdSwOrch<DropHandler, ForwardHandler>::registerInWdDb(const Port& port,
467489
if (!gPortsOrch->getPortPfc(port.m_port_id, &pfcMask))
468490
{
469491
SWSS_LOG_ERROR("Failed to get PFC mask on port %s", port.m_alias.c_str());
470-
return;
492+
return false;
471493
}
472494

473495
set<uint8_t> losslessTc;
@@ -480,6 +502,11 @@ void PfcWdSwOrch<DropHandler, ForwardHandler>::registerInWdDb(const Port& port,
480502

481503
losslessTc.insert(i);
482504
}
505+
if (losslessTc.empty())
506+
{
507+
SWSS_LOG_NOTICE("No lossless TC found on port %s", port.m_alias.c_str());
508+
return false;
509+
}
483510

484511
if (!c_portStatIds.empty())
485512
{
@@ -541,6 +568,8 @@ void PfcWdSwOrch<DropHandler, ForwardHandler>::registerInWdDb(const Port& port,
541568
sai_object_id_t groupId;
542569
gPortsOrch->createBindAclTableGroup(port.m_port_id, groupId, ACL_STAGE_INGRESS);
543570
gPortsOrch->createBindAclTableGroup(port.m_port_id, groupId, ACL_STAGE_EGRESS);
571+
572+
return true;
544573
}
545574

546575
template <typename DropHandler, typename ForwardHandler>
@@ -716,9 +745,7 @@ bool PfcWdSwOrch<DropHandler, ForwardHandler>::startWdOnPort(const Port& port,
716745
{
717746
SWSS_LOG_ENTER();
718747

719-
registerInWdDb(port, detectionTime, restorationTime, action);
720-
721-
return true;
748+
return registerInWdDb(port, detectionTime, restorationTime, action);
722749
}
723750

724751
template <typename DropHandler, typename ForwardHandler>

orchagent/pfcwdorch.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ class PfcWdOrch: public Orch
4848
static PfcWdAction deserializeAction(const string& key);
4949
static string serializeAction(const PfcWdAction &action);
5050

51-
virtual void createEntry(const string& key, const vector<FieldValueTuple>& data);
52-
void deleteEntry(const string& name);
51+
virtual task_process_status createEntry(const string& key, const vector<FieldValueTuple>& data);
52+
task_process_status deleteEntry(const string& name);
5353

5454
protected:
5555
virtual bool startWdActionOnQueue(const string &event, sai_object_id_t queueId) = 0;
@@ -79,7 +79,7 @@ class PfcWdSwOrch: public PfcWdOrch<DropHandler, ForwardHandler>
7979
uint32_t detectionTime, uint32_t restorationTime, PfcWdAction action);
8080
virtual bool stopWdOnPort(const Port& port);
8181

82-
void createEntry(const string& key, const vector<FieldValueTuple>& data);
82+
task_process_status createEntry(const string& key, const vector<FieldValueTuple>& data) override;
8383
virtual void doTask(SelectableTimer &timer);
8484
//XXX Add port/queue state change event handlers
8585

@@ -106,7 +106,7 @@ class PfcWdSwOrch: public PfcWdOrch<DropHandler, ForwardHandler>
106106

107107
template <typename T>
108108
static string counterIdsToStr(const vector<T> ids, string (*convert)(T));
109-
void registerInWdDb(const Port& port,
109+
bool registerInWdDb(const Port& port,
110110
uint32_t detectionTime, uint32_t restorationTime, PfcWdAction action);
111111
void unregisterFromWdDb(const Port& port);
112112
void doTask(swss::NotificationConsumer &wdNotification);

orchagent/qosorch.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -1361,6 +1361,27 @@ task_process_status QosOrch::handlePortQosMapTable(Consumer& consumer)
13611361
return task_process_status::task_success;
13621362
}
13631363

1364+
void QosOrch::doTask()
1365+
{
1366+
SWSS_LOG_ENTER();
1367+
1368+
auto *port_qos_map_cfg_exec = getExecutor(CFG_PORT_QOS_MAP_TABLE_NAME);
1369+
1370+
for (const auto &it : m_consumerMap)
1371+
{
1372+
auto *exec = it.second.get();
1373+
1374+
if (exec == port_qos_map_cfg_exec)
1375+
{
1376+
continue;
1377+
}
1378+
1379+
exec->drain();
1380+
}
1381+
1382+
port_qos_map_cfg_exec->drain();
1383+
}
1384+
13641385
void QosOrch::doTask(Consumer &consumer)
13651386
{
13661387
SWSS_LOG_ENTER();

orchagent/qosorch.h

+1
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ class QosOrch : public Orch
114114
static type_map& getTypeMap();
115115
static type_map m_qos_maps;
116116
private:
117+
void doTask() override;
117118
virtual void doTask(Consumer& consumer);
118119

119120
typedef task_process_status (QosOrch::*qos_table_handler)(Consumer& consumer);

0 commit comments

Comments
 (0)