Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion orchagent/aclorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1879,7 +1879,7 @@ void AclOrch::doTask(Consumer &consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down
2 changes: 1 addition & 1 deletion orchagent/copporch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -589,7 +589,7 @@ void CoppOrch::doTask(Consumer &consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down
4 changes: 2 additions & 2 deletions orchagent/fdborch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ void FdbOrch::doTask(Consumer& consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down Expand Up @@ -336,7 +336,7 @@ void FdbOrch::doTask(NotificationConsumer& consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down
2 changes: 1 addition & 1 deletion orchagent/flexcounterorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ void FlexCounterOrch::doTask(Consumer &consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down
9 changes: 1 addition & 8 deletions orchagent/intfsorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ void IntfsOrch::doTask(Consumer &consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down Expand Up @@ -218,13 +218,6 @@ void IntfsOrch::doTask(Consumer &consumer)
continue;
}

// buffer configuration hasn't been applied yet, hold from intf config.
if (!gBufferOrch->isPortReady(alias))
{
it++;
continue;
}

auto it_intfs = m_syncdIntfses.find(alias);
if (it_intfs == m_syncdIntfses.end())
{
Expand Down
2 changes: 1 addition & 1 deletion orchagent/mirrororch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -934,7 +934,7 @@ void MirrorOrch::doTask(Consumer& consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down
2 changes: 1 addition & 1 deletion orchagent/neighorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ void NeighOrch::doTask(Consumer &consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down
20 changes: 9 additions & 11 deletions orchagent/orchdaemon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ bool OrchDaemon::init()

/*
* The order of the orch list is important for state restore of warm start and
* the queued processing in m_toSync map after gPortsOrch->isInitDone() is set.
* the queued processing in m_toSync map after gPortsOrch->isPortReady() is set.
*
* For the multiple consumers in ports_tables, tasks for LAG_TABLE is processed before VLAN_TABLE
* when iterating ConsumerMap.
Expand Down Expand Up @@ -413,21 +413,19 @@ bool OrchDaemon::warmRestoreAndSyncUp()
}

/*
* Three iterations are needed.
* Four iterations are needed.
*
* First iteration: Orch(s) which do not have dependency on port table,
* gBufferOrch, gPortsOrch(Port table and VLAN table),
* and orch(s) which have dependency on Port but processed after it.
* First iteration: switchorch, Port init/hostif create part of portorch.
*
* Second iteration: gBufferOrch (has inter-dependency with gPortsOrch),
* remaining attributes on port table for gPortsOrch,
* gIntfsOrch which has dependency on both gBufferOrch and port table of gPortsOrch.
* LAG_TABLE in gPortsOrch.
* Second iteratoin: gBufferOrch which requires port created,
* then port speed/mtu/fec_mode/pfc_asym/admin_status config.
*
* Third iteration: Drain remaining data that are out of order like LAG_MEMBER_TABLE and
* Third iteration: other orch(s) which wait for port init done.
*
* Fourth iteration: Drain remaining data that are out of order like LAG_MEMBER_TABLE and
* VLAN_MEMBER_TABLE since they were checked before LAG_TABLE and VLAN_TABLE within gPortsOrch.
*/
for (auto it = 0; it < 3; it++)
for (auto it = 0; it < 4; it++)
{
for (Orch *o : m_orchList)
{
Expand Down
2 changes: 1 addition & 1 deletion orchagent/pfcwdorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ void PfcWdOrch<DropHandler, ForwardHandler>::doTask(Consumer& consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down
16 changes: 14 additions & 2 deletions orchagent/portsorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -385,11 +385,18 @@ void PortsOrch::removeDefaultBridgePorts()
SWSS_LOG_NOTICE("Remove bridge ports from default 1Q bridge");
}

bool PortsOrch::isPortReady()
{
return m_initDone && m_pendingPortSet.empty();
}

/* Upon receiving PortInitDone, all the configured ports have been created*/
bool PortsOrch::isInitDone()
{
return m_initDone;
}


map<string, Port>& PortsOrch::getAllPorts()
{
return m_portList;
Expand Down Expand Up @@ -1626,9 +1633,14 @@ void PortsOrch::doPortTask(Consumer &consumer)
if (!gBufferOrch->isPortReady(alias))
{
// buffer configuration hasn't been applied yet. save it for future retry
m_pendingPortSet.emplace(alias);
it++;
continue;
}
else
{
m_pendingPortSet.erase(alias);
}

Port p;
if (!getPort(alias, p))
Expand Down Expand Up @@ -2233,7 +2245,7 @@ void PortsOrch::doTask(Consumer &consumer)
else
{
/* Wait for all ports to be initialized */
if (!isInitDone())
if (!isPortReady())
{
return;
}
Expand Down Expand Up @@ -3051,7 +3063,7 @@ void PortsOrch::doTask(NotificationConsumer &consumer)
SWSS_LOG_ENTER();

/* Wait for all ports to be initialized */
if (!isInitDone())
if (!isPortReady())
{
return;
}
Expand Down
5 changes: 4 additions & 1 deletion orchagent/portsorch.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ class PortsOrch : public Orch, public Subject
public:
PortsOrch(DBConnector *db, vector<table_name_with_pri_t> &tableNames);

bool isPortReady();
bool isInitDone();

map<string, Port>& getAllPorts();
Expand Down Expand Up @@ -117,6 +118,8 @@ class PortsOrch : public Orch, public Subject
map<set<int>, tuple<string, uint32_t, int, string>> m_lanesAliasSpeedMap;
map<string, Port> m_portList;

unordered_set<string> m_pendingPortSet;

NotificationConsumer* m_portStatusNotificationConsumer;

void doTask(Consumer &consumer);
Expand Down Expand Up @@ -170,7 +173,7 @@ class PortsOrch : public Orch, public Subject
bool getPortSpeed(sai_object_id_t port_id, sai_uint32_t &speed);

bool setPortAdvSpeed(sai_object_id_t port_id, sai_uint32_t speed);

bool getQueueTypeAndIndex(sai_object_id_t queue_id, string &type, uint8_t &index);

bool m_isQueueMapGenerated = false;
Expand Down
2 changes: 1 addition & 1 deletion orchagent/qosorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1365,7 +1365,7 @@ void QosOrch::doTask(Consumer &consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down
2 changes: 1 addition & 1 deletion orchagent/routeorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ void RouteOrch::doTask(Consumer& consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down
2 changes: 1 addition & 1 deletion orchagent/tunneldecaporch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ void TunnelDecapOrch::doTask(Consumer& consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down
4 changes: 2 additions & 2 deletions orchagent/watermarkorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ void WatermarkOrch::doTask(Consumer &consumer)
{
SWSS_LOG_ENTER();

if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down Expand Up @@ -96,7 +96,7 @@ void WatermarkOrch::doTask(Consumer &consumer)

void WatermarkOrch::doTask(NotificationConsumer &consumer)
{
if (!gPortsOrch->isInitDone())
if (!gPortsOrch->isPortReady())
{
return;
}
Expand Down