Skip to content

Commit

Permalink
[portsorch] process only updated APP_DB fields when port is already
Browse files Browse the repository at this point in the history
created

Signed-off-by: Stepan Blyschak <stepanb@nvidia.com>
  • Loading branch information
stepanblyschak committed Feb 14, 2024
1 parent 41330ab commit bd5e554
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 19 deletions.
2 changes: 1 addition & 1 deletion orchagent/port/porthlpr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1001,7 +1001,7 @@ bool PortHelper::parsePortConfig(PortConfig &port) const
}
}

return this->validatePortConfig(port);
return true;
}

bool PortHelper::validatePortConfig(PortConfig &port) const
Expand Down
3 changes: 1 addition & 2 deletions orchagent/port/porthlpr.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class PortHelper final
std::string getAdminStatusStr(const PortConfig &port) const;

bool parsePortConfig(PortConfig &port) const;
bool validatePortConfig(PortConfig &port) const;

private:
std::string getFieldValueStr(const PortConfig &port, const std::string &field) const;
Expand All @@ -52,6 +53,4 @@ class PortHelper final
bool parsePortRole(PortConfig &port, const std::string &field, const std::string &value) const;
bool parsePortAdminStatus(PortConfig &port, const std::string &field, const std::string &value) const;
bool parsePortDescription(PortConfig &port, const std::string &field, const std::string &value) const;

bool validatePortConfig(PortConfig &port) const;
};
73 changes: 58 additions & 15 deletions orchagent/portsorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3515,28 +3515,61 @@ void PortsOrch::doPortTask(Consumer &consumer)

if (op == SET_COMMAND)
{
auto &fvMap = m_portConfigMap[key];

for (const auto &cit : kfvFieldsValues(keyOpFieldsValues))
if (m_portList.find(key) == m_portList.end())
{
auto fieldName = fvField(cit);
auto fieldValue = fvValue(cit);
// Aggregate configuration while the port is not created.
auto &fvMap = m_portConfigMap[key];

for (const auto &cit : kfvFieldsValues(keyOpFieldsValues))
{
auto fieldName = fvField(cit);
auto fieldValue = fvValue(cit);

SWSS_LOG_INFO("FIELD: %s, VALUE: %s", fieldName.c_str(), fieldValue.c_str());
SWSS_LOG_INFO("FIELD: %s, VALUE: %s", fieldName.c_str(), fieldValue.c_str());

fvMap[fieldName] = fieldValue;
}
fvMap[fieldName] = fieldValue;
}

pCfg.fieldValueMap = fvMap;
pCfg.fieldValueMap = fvMap;

if (!m_portHlpr.parsePortConfig(pCfg))
{
it = taskMap.erase(it);
continue;
if (!m_portHlpr.parsePortConfig(pCfg))
{
it = taskMap.erase(it);
continue;
}

if (!m_portHlpr.validatePortConfig(pCfg))
{
it = taskMap.erase(it);
continue;
}

/* Collect information about all received ports */
m_lanesAliasSpeedMap[pCfg.lanes.value] = pCfg;
}
else
{
// Port is already created, gather updated field-values.
std::unordered_map<std::string, std::string> fvMap;

for (const auto &cit : kfvFieldsValues(keyOpFieldsValues))
{
auto fieldName = fvField(cit);
auto fieldValue = fvValue(cit);

SWSS_LOG_INFO("FIELD: %s, VALUE: %s", fieldName.c_str(), fieldValue.c_str());

fvMap[fieldName] = fieldValue;
}

pCfg.fieldValueMap = fvMap;

/* Collect information about all received ports */
m_lanesAliasSpeedMap[pCfg.lanes.value] = pCfg;
if (!m_portHlpr.parsePortConfig(pCfg))
{
it = taskMap.erase(it);
continue;
}
}

// TODO:
// Fix the issue below
Expand Down Expand Up @@ -3652,6 +3685,9 @@ void PortsOrch::doPortTask(Consumer &consumer)
PortSerdesAttrMap_t serdes_attr;
getPortSerdesAttr(serdes_attr, pCfg);

// Saved configured admin status
bool admin_status = p.m_admin_state_up;

if (pCfg.autoneg.is_set)
{
if (!p.m_an_cfg || p.m_autoneg != pCfg.autoneg.value)
Expand Down Expand Up @@ -4212,6 +4248,13 @@ void PortsOrch::doPortTask(Consumer &consumer)
/* create host_tx_ready field in state-db */
initHostTxReadyState(p);

// Restore admin status if the port was brought down
if (admin_status != p.m_admin_state_up)
{
pCfg.admin_status.is_set = true;
pCfg.admin_status.value = admin_status;
}

/* Last step set port admin status */
if (pCfg.admin_status.is_set)
{
Expand Down
1 change: 0 additions & 1 deletion tests/mock_tests/portsorch_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -859,7 +859,6 @@ namespace portsorch_test
std::deque<KeyOpFieldsValuesTuple> kfvSerdes = {{
"Ethernet0",
SET_COMMAND, {
{ "admin_status", "up" },
{ "idriver" , "0x6,0x6,0x6,0x6" }
}
}};
Expand Down

0 comments on commit bd5e554

Please sign in to comment.