Skip to content

Commit 45db675

Browse files
author
Shuotian Cheng
committed
orchagent: Fixing iterate m_toSync map after select times out
- Moving all Orch class into a list - doTask when select() returns TIMEOUT
1 parent 097427c commit 45db675

File tree

4 files changed

+53
-34
lines changed

4 files changed

+53
-34
lines changed

orchagent/orch.cpp

+18-7
Original file line numberDiff line numberDiff line change
@@ -27,21 +27,21 @@ Orch::~Orch()
2727
}
2828
}
2929

30-
std::vector<Selectable*> Orch::getConsumers()
30+
std::vector<Selectable *> Orch::getSelectables()
3131
{
3232
SWSS_LOG_ENTER();
3333

34-
std::vector<Selectable*> consumers;
34+
std::vector<Selectable *> selectables;
3535
for(auto it : m_consumerMap) {
36-
consumers.push_back(it.second.m_consumer);
36+
selectables.push_back(it.second.m_consumer);
3737
}
38-
return consumers;
38+
return selectables;
3939
}
4040

41-
bool Orch::hasConsumer(ConsumerTable *consumer) const
41+
bool Orch::hasSelectable(ConsumerTable *selectable) const
4242
{
4343
for(auto it : m_consumerMap) {
44-
if(it.second.m_consumer == consumer) {
44+
if(it.second.m_consumer == selectable) {
4545
return true;
4646
}
4747
}
@@ -103,6 +103,17 @@ bool Orch::execute(string tableName)
103103
consumer.m_toSync[key] = KeyOpFieldsValuesTuple(key, op, existing_values);
104104
}
105105

106-
doTask(consumer);
106+
if (!consumer.m_toSync.empty())
107+
doTask(consumer);
108+
107109
return true;
108110
}
111+
112+
void Orch::doTask()
113+
{
114+
for(auto it : m_consumerMap)
115+
{
116+
if (!it.second.m_toSync.empty())
117+
doTask(it.second);
118+
}
119+
}

orchagent/orch.h

+7-4
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,19 @@ class Orch
3030
public:
3131
Orch(DBConnector *db, string tableName);
3232
Orch(DBConnector *db, vector<string> &tableNames);
33-
~Orch();
33+
virtual ~Orch();
3434

35-
std::vector<Selectable*> getConsumers();
36-
bool hasConsumer(ConsumerTable* s)const;
35+
std::vector<Selectable*> getSelectables();
36+
bool hasSelectable(ConsumerTable* s) const;
3737

3838
bool execute(string tableName);
39-
39+
/* Iterate all consumers in m_consumerMap and run doTask(Consumer) */
40+
void doTask();
4041
protected:
42+
/* Run doTask against a specific consumer */
4143
virtual void doTask(Consumer &consumer) = 0;
4244
private:
45+
4346
DBConnector *m_db;
4447

4548
protected:

orchagent/orchdaemon.cpp

+27-19
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ OrchDaemon::~OrchDaemon()
2020

2121
if (m_asicDb)
2222
delete(m_asicDb);
23+
24+
for (Orch *o : m_orchList)
25+
delete(o);
2326
}
2427

2528
bool OrchDaemon::init()
@@ -34,11 +37,12 @@ bool OrchDaemon::init()
3437
APP_LAG_TABLE_NAME
3538
};
3639

37-
m_portsO = new PortsOrch(m_applDb, ports_tables);
38-
m_intfsO = new IntfsOrch(m_applDb, APP_INTF_TABLE_NAME, m_portsO);
39-
m_neighO = new NeighOrch(m_applDb, APP_NEIGH_TABLE_NAME, m_portsO);
40-
m_routeO = new RouteOrch(m_applDb, APP_ROUTE_TABLE_NAME, m_portsO, m_neighO);
40+
PortsOrch *ports_orch = new PortsOrch(m_applDb, ports_tables);
41+
IntfsOrch *intfs_orch = new IntfsOrch(m_applDb, APP_INTF_TABLE_NAME, ports_orch);
42+
NeighOrch *neigh_orch = new NeighOrch(m_applDb, APP_NEIGH_TABLE_NAME, ports_orch);
43+
RouteOrch *route_orch = new RouteOrch(m_applDb, APP_ROUTE_TABLE_NAME, ports_orch, neigh_orch);
4144

45+
m_orchList = { ports_orch, intfs_orch, neigh_orch, route_orch };
4246
m_select = new Select();
4347

4448
return true;
@@ -48,16 +52,15 @@ void OrchDaemon::start()
4852
{
4953
SWSS_LOG_ENTER();
5054

51-
int ret;
52-
m_select->addSelectables(m_portsO->getConsumers());
53-
m_select->addSelectables(m_intfsO->getConsumers());
54-
m_select->addSelectables(m_neighO->getConsumers());
55-
m_select->addSelectables(m_routeO->getConsumers());
55+
for (Orch *o : m_orchList)
56+
{
57+
m_select->addSelectables(o->getSelectables());
58+
}
5659

5760
while (true)
5861
{
5962
Selectable *s;
60-
int fd;
63+
int fd, ret;
6164

6265
ret = m_select->select(&s, &fd, 1);
6366
if (ret == Select::ERROR)
@@ -67,7 +70,14 @@ void OrchDaemon::start()
6770
}
6871

6972
if (ret == Select::TIMEOUT)
70-
continue;
73+
{
74+
/* After every TIMEOUT, periodically check all m_toSync map to
75+
* execute all the remaining tasks that need to be retried. */
76+
for (Orch *o : m_orchList)
77+
{
78+
o->doTask();
79+
}
80+
}
7181

7282
Orch *o = getOrchByConsumer((ConsumerTable *)s);
7383
o->execute(((ConsumerTable *)s)->getTableName());
@@ -78,13 +88,11 @@ Orch *OrchDaemon::getOrchByConsumer(ConsumerTable *c)
7888
{
7989
SWSS_LOG_ENTER();
8090

81-
if (m_portsO->hasConsumer(c))
82-
return m_portsO;
83-
if (m_intfsO->hasConsumer(c))
84-
return m_intfsO;
85-
if (m_neighO->hasConsumer(c))
86-
return m_neighO;
87-
if (m_routeO->hasConsumer(c))
88-
return m_routeO;
91+
for (Orch *o : m_orchList)
92+
{
93+
if (o->hasSelectable(c))
94+
return o;
95+
}
96+
8997
return nullptr;
9098
}

orchagent/orchdaemon.h

+1-4
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@ class OrchDaemon
2525
DBConnector *m_applDb;
2626
DBConnector *m_asicDb;
2727

28-
PortsOrch *m_portsO;
29-
IntfsOrch *m_intfsO;
30-
NeighOrch *m_neighO;
31-
RouteOrch *m_routeO;
28+
std::vector<Orch *> m_orchList;
3229

3330
Select *m_select;
3431

0 commit comments

Comments
 (0)