Skip to content

Commit

Permalink
[orchagent] adding support for multiple consumers in Orch classes
Browse files Browse the repository at this point in the history
* follow up on notes from sonic-net#13

Signed-off-by: Hrachya Mughnetsyan hrachya@mellanox.com
  • Loading branch information
Hrachya Mughnetsyan committed Apr 15, 2016
1 parent 08e35e1 commit a5d9df4
Show file tree
Hide file tree
Showing 13 changed files with 77 additions and 108 deletions.
2 changes: 1 addition & 1 deletion orchagent/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ else
DBGFLAGS = -g
endif

orchagent_SOURCES = main.cpp orchdaemon.cpp orch.cpp routeorch.cpp neighorch.cpp intfsorch.cpp portsorch.cpp qosorch.cpp
orchagent_SOURCES = main.cpp orchdaemon.cpp orch.cpp routeorch.cpp neighorch.cpp intfsorch.cpp portsorch.cpp

orchagent_CFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
orchagent_CPPFLAGS = $(DBGFLAGS) $(AM_CFLAGS) $(CFLAGS_COMMON) $(CFLAGS_SAI)
Expand Down
22 changes: 11 additions & 11 deletions orchagent/intfsorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ IntfsOrch::IntfsOrch(DBConnector *db, string tableName, PortsOrch *portsOrch) :
{
}

void IntfsOrch::doTask(_in_ Consumer& consumer_info)
void IntfsOrch::doTask(Consumer &consumer)
{
if (consumer_info.m_toSync.empty())
if (consumer.m_toSync.empty())
return;

auto it = consumer_info.m_toSync.begin();
while (it != consumer_info.m_toSync.end())
auto it = consumer.m_toSync.begin();
while (it != consumer.m_toSync.end())
{
KeyOpFieldsValuesTuple t = it->second;

Expand All @@ -33,15 +33,15 @@ void IntfsOrch::doTask(_in_ Consumer& consumer_info)
if (found == string::npos)
{
SWSS_LOG_ERROR("Failed to parse task key %s\n", key.c_str());
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
continue;
}
string alias = key.substr(0, found);

IpPrefix ip_prefix(key.substr(found+1));
if (!ip_prefix.isV4())
{
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
continue;
}

Expand All @@ -52,15 +52,15 @@ void IntfsOrch::doTask(_in_ Consumer& consumer_info)
/* Duplicate entry */
if (m_intfs.find(alias) != m_intfs.end() && m_intfs[alias] == ip_prefix.getIp())
{
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
continue;
}

Port p;
if (!m_portsOrch->getPort(alias, p))
{
SWSS_LOG_ERROR("Failed to locate interface %s\n", alias.c_str());
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
continue;
}

Expand Down Expand Up @@ -110,7 +110,7 @@ void IntfsOrch::doTask(_in_ Consumer& consumer_info)
{
SWSS_LOG_NOTICE("Create packet action trap route ip:%s\n", ip_prefix.getIp().to_string().c_str());
m_intfs[alias] = ip_prefix.getIp();
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
}
}
else if (op == DEL_COMMAND)
Expand All @@ -119,7 +119,7 @@ void IntfsOrch::doTask(_in_ Consumer& consumer_info)
if (!m_portsOrch->getPort(alias, p))
{
SWSS_LOG_ERROR("Failed to locate interface %s\n", alias.c_str());
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
continue;
}

Expand Down Expand Up @@ -152,7 +152,7 @@ void IntfsOrch::doTask(_in_ Consumer& consumer_info)
{
SWSS_LOG_NOTICE("Remove packet action trap route ip:%s\n", ip_prefix.getIp().to_string().c_str());
m_intfs.erase(alias);
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion orchagent/intfsorch.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ class IntfsOrch : public Orch
public:
IntfsOrch(DBConnector *db, string tableName, PortsOrch *portsOrch);
private:
virtual void doTask(_in_ Consumer& consumer_info);
void doTask(Consumer &consumer);
PortsOrch *m_portsOrch;
IntfsTable m_intfs;
};
Expand Down
28 changes: 14 additions & 14 deletions orchagent/neighorch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,37 @@
extern sai_neighbor_api_t* sai_neighbor_api;
extern sai_next_hop_api_t* sai_next_hop_api;

void NeighOrch::doTask(_in_ Consumer& consumer_info)
void NeighOrch::doTask(Consumer &consumer)
{
if (consumer_info.m_toSync.empty())
if (consumer.m_toSync.empty())
return;

auto it = consumer_info.m_toSync.begin();
while (it != consumer_info.m_toSync.end())
auto it = consumer.m_toSync.begin();
while (it != consumer.m_toSync.end())
{
KeyOpFieldsValuesTuple t = it->second;

string key = kfvKey(t);
size_t found = key.find(delimiter);
size_t found = key.find(':');
if (found == string::npos)
{
SWSS_LOG_ERROR("Failed to parse task key %s\n", key.c_str());
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
continue;
}
string alias = key.substr(0, found);
Port p;

if (!m_portsOrch->getPort(alias, p))
{
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
continue;
}

IpAddress ip_address(key.substr(found+1));
if (!ip_address.isV4())
{
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
continue;
}

Expand All @@ -49,37 +49,37 @@ void NeighOrch::doTask(_in_ Consumer& consumer_info)
for (auto i = kfvFieldsValues(t).begin();
i != kfvFieldsValues(t).end(); i++)
{
if (fvField(*i) == neigh_field_name)
if (fvField(*i) == "neigh")
mac_address = MacAddress(fvValue(*i));
}

if (m_syncdNeighbors.find(neighbor_entry) == m_syncdNeighbors.end() || m_syncdNeighbors[neighbor_entry] != mac_address)
{
if (addNeighbor(neighbor_entry, mac_address))
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
else
it++;
}
else
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
}
else if (op == DEL_COMMAND)
{
if (m_syncdNeighbors.find(neighbor_entry) != m_syncdNeighbors.end())
{
if (removeNeighbor(neighbor_entry))
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
else
it++;
}
/* Cannot locate the neighbor */
else
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
}
else
{
SWSS_LOG_ERROR("Unknown operation type %s\n", op.c_str());
it = consumer_info.m_toSync.erase(it);
it = consumer.m_toSync.erase(it);
}
}
}
Expand Down
4 changes: 1 addition & 3 deletions orchagent/neighorch.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,11 @@ class NeighOrch : public Orch
public:
NeighOrch(DBConnector *db, string tableName, PortsOrch *portsOrch, RouteOrch *routeOrch) :
Orch(db, tableName), m_portsOrch(portsOrch), m_routeOrch(routeOrch) {};
const char* const delimiter = ";";
const char* const neigh_field_name = "neigh";
private:
PortsOrch *m_portsOrch;
RouteOrch *m_routeOrch;

virtual void doTask(_in_ Consumer& consumer_info);
void doTask(Consumer &consumer);

NeighborTable m_syncdNeighbors;

Expand Down
27 changes: 14 additions & 13 deletions orchagent/orch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,38 +6,39 @@ using namespace swss;
Orch::Orch(DBConnector *db, string tableName) :
m_db(db)
{
Consumer c_info(new ConsumerTable(m_db, tableName));
m_consumer_map.insert(ConsumerMapPair(tableName, c_info));
Consumer consumer(new ConsumerTable(m_db, tableName));
m_consumerMap.insert(ConsumerMapPair(tableName, consumer));
}

Orch::Orch(DBConnector *db, vector<string> &tableNames) :
m_db(db)
{
for( auto it = tableNames.begin(); it != tableNames.end(); it++) {
Consumer c_info(new ConsumerTable(m_db, *it));
m_consumer_map.insert(ConsumerMapPair(*it, c_info));
Consumer consumer(new ConsumerTable(m_db, *it));
m_consumerMap.insert(ConsumerMapPair(*it, consumer));
}
}

Orch::~Orch()
{
delete(m_db);
for(auto it : m_consumer_map) {
for(auto it : m_consumerMap) {
delete it.second.m_consumer;
}
}

void Orch::getSelectables(_out_ std::vector<Selectable*> &consumers)
std::vector<Selectable*> Orch::getConsumers()
{
consumers.clear();
for(auto it : m_consumer_map) {
std::vector<Selectable*> consumers;
for(auto it : m_consumerMap) {
consumers.push_back(it.second.m_consumer);
}
return consumers;
}

bool Orch::is_owned_consumer(ConsumerTable*consumer) const
bool Orch::hasConsumer(ConsumerTable *consumer) const
{
for(auto it : m_consumer_map) {
for(auto it : m_consumerMap) {
if(it.second.m_consumer == consumer) {
return true;
}
Expand All @@ -47,8 +48,8 @@ bool Orch::is_owned_consumer(ConsumerTable*consumer) const

bool Orch::execute(string tableName)
{
auto consumer_it = m_consumer_map.find(tableName);
if(consumer_it == m_consumer_map.end()) {
auto consumer_it = m_consumerMap.find(tableName);
if(consumer_it == m_consumerMap.end()) {
SWSS_LOG_ERROR("Unrecognized tableName:%s\n", tableName.c_str());
return false;
}
Expand Down Expand Up @@ -77,7 +78,7 @@ bool Orch::execute(string tableName)
{
KeyOpFieldsValuesTuple existing_data = consumer.m_toSync[key];

auto new_values = kfvFieldsValues(new_data);
auto new_values = kfvFieldsValues(new_data);
auto existing_values = kfvFieldsValues(existing_data);


Expand Down
11 changes: 4 additions & 7 deletions orchagent/orch.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,21 +32,18 @@ class Orch
Orch(DBConnector *db, vector<string> &tableNames);
~Orch();

void getSelectables( _out_ std::vector<Selectable*>& selectables);
bool is_owned_consumer(ConsumerTable* s)const;
std::vector<Selectable*> getConsumers();
bool hasConsumer(ConsumerTable* s)const;

bool execute(string tableName);

inline string getOrchName() { return m_name; }

protected:
virtual void doTask(_in_ Consumer& consumer_info) = 0;
virtual void doTask(Consumer &consumer) = 0;
private:
DBConnector *m_db;
const string m_name;// TODO: where is this field initialized??

protected:
ConsumerMap m_consumer_map;
ConsumerMap m_consumerMap;

};

Expand Down
42 changes: 9 additions & 33 deletions orchagent/orchdaemon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,6 @@ bool OrchDaemon::init()
m_intfsO = new IntfsOrch(m_applDb, APP_INTF_TABLE_NAME, m_portsO);
m_routeO = new RouteOrch(m_applDb, APP_ROUTE_TABLE_NAME, m_portsO);
m_neighO = new NeighOrch(m_applDb, APP_NEIGH_TABLE_NAME, m_portsO, m_routeO);
std::vector<std::string> qos_tables = {
APP_TC_TO_QUEUE_MAP_TABLE_NAME,
APP_SCHEDULER_TABLE_NAME,
APP_DSCP_TO_TC_MAP_TABLE_NAME,
APP_QUEUE_TABLE_NAME,
APP_PORT_QOS_MAP_TABLE_NAME,
APP_WRED_PROFILE_TABLE_NAME
};

m_qosO = new QosOrch(m_applDb, qos_tables, m_portsO);
m_select = new Select();

return true;
Expand All @@ -49,22 +39,10 @@ bool OrchDaemon::init()
void OrchDaemon::start()
{
int ret;
std::vector<Selectable *> selectables;

m_portsO->getSelectables(selectables);
m_select->addSelectables(selectables);

m_intfsO->getSelectables(selectables);
m_select->addSelectables(selectables);

m_neighO->getSelectables(selectables);
m_select->addSelectables(selectables);

m_routeO->getSelectables(selectables);
m_select->addSelectables(selectables);

m_qosO->getSelectables(selectables);
m_select->addSelectables(selectables);
m_select->addSelectables(m_portsO->getConsumers());
m_select->addSelectables(m_intfsO->getConsumers());
m_select->addSelectables(m_neighO->getConsumers());
m_select->addSelectables(m_routeO->getConsumers());

while (true)
{
Expand All @@ -78,22 +56,20 @@ void OrchDaemon::start()
if (ret == Select::TIMEOUT)
continue;

Orch *o = getOrchByConsumer((ConsumerTable *)s);// NOTE: o can be nullptr

SWSS_LOG_INFO("Get message from Orch: %s\n", o->getOrchName().c_str());
Orch *o = getOrchByConsumer((ConsumerTable *)s);
o->execute(((ConsumerTable *)s)->getTableName());
}
}

Orch *OrchDaemon::getOrchByConsumer(ConsumerTable *c)
{
if (m_portsO->is_owned_consumer(c))
if (m_portsO->hasConsumer(c))
return m_portsO;
if (m_intfsO->is_owned_consumer(c))
if (m_intfsO->hasConsumer(c))
return m_intfsO;
if (m_neighO->is_owned_consumer(c))
if (m_neighO->hasConsumer(c))
return m_neighO;
if (m_routeO->is_owned_consumer(c))
if (m_routeO->hasConsumer(c))
return m_routeO;
return nullptr;
}
3 changes: 0 additions & 3 deletions orchagent/orchdaemon.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
#include "intfsorch.h"
#include "neighorch.h"
#include "routeorch.h"
#include "qosorch.h"


using namespace swss;

Expand All @@ -31,7 +29,6 @@ class OrchDaemon
IntfsOrch *m_intfsO;
NeighOrch *m_neighO;
RouteOrch *m_routeO;
QosOrch *m_qosO;

Select *m_select;

Expand Down
Loading

0 comments on commit a5d9df4

Please sign in to comment.