in common/logger.cpp [192:262]
void Logger::settingThread()
{
Select select;
DBConnector db("CONFIG_DB", 0);
std::map<std::string, std::shared_ptr<SubscriberStateTable>> selectables;
auto table = std::make_shared<SubscriberStateTable>(&db, CFG_LOGGER_TABLE_NAME);
selectables.emplace(CFG_LOGGER_TABLE_NAME, table);
select.addSelectable(table.get());
select.addSelectable(m_stopEvent.get());
while (1)
{
Selectable *selectable = nullptr;
/* TODO Resolve latency caused by timeout at initialization. */
int ret = select.select(&selectable, 1000); // Timeout if there is no data in 1000 ms.
if (ret == Select::ERROR)
{
SWSS_LOG_NOTICE("%s select error %s", __PRETTY_FUNCTION__, strerror(errno));
continue;
}
if (ret == Select::TIMEOUT)
{
SWSS_LOG_DEBUG("%s select timeout", __PRETTY_FUNCTION__);
continue;
}
if (selectable == m_stopEvent.get())
{
break;
}
KeyOpFieldsValuesTuple koValues;
SubscriberStateTable *subscriberStateTable = NULL;
subscriberStateTable = dynamic_cast<SubscriberStateTable *>(selectable);
if (subscriberStateTable == NULL)
{
SWSS_LOG_ERROR("dynamic_cast returned NULL");
break;
}
subscriberStateTable->pop(koValues);
std::string key = kfvKey(koValues), op = kfvOp(koValues);
if (op != SET_COMMAND || !m_settingChangeObservers.contains(key))
{
continue;
}
const auto& values = kfvFieldsValues(koValues);
for (auto& i : values)
{
auto& field = fvField(i);
auto& value = fvValue(i);
if ((field == DAEMON_LOGLEVEL) && (value != m_currentPrios.get(key)))
{
m_currentPrios.set(key, value);
m_settingChangeObservers.get(key).first(key, value);
}
else if ((field == DAEMON_LOGOUTPUT) && (value != m_currentOutputs.get(key)))
{
m_currentOutputs.set(key, value);
m_settingChangeObservers.get(key).second(key, value);
}
}
}
}