in common/redis_table_waiter.cpp [7:65]
bool RedisTableWaiter::waitUntil(
DBConnector &db,
const std::string &tableName,
unsigned int maxWaitSec,
CheckFunc &checkFunc)
{
if (maxWaitSec == 0)
{
SWSS_LOG_ERROR("Error: invalid maxWaitSec value 0, must be larger than 0");
return false;
}
SubscriberStateTable table(&db, tableName);
Select s;
s.addSelectable(&table);
int maxWaitMs = static_cast<int>(maxWaitSec) * 1000;
int selectTimeout = maxWaitMs;
auto start = std::chrono::steady_clock::now();
while(1)
{
Selectable *sel = NULL;
int ret = s.select(&sel, selectTimeout, true);
if (ret == Select::OBJECT)
{
KeyOpFieldsValuesTuple kco;
table.pop(kco);
if (checkFunc(kco))
{
return true;
}
}
else if (ret == Select::ERROR)
{
SWSS_LOG_NOTICE("Error: wait redis table got error - %s!", strerror(errno));
}
else if (ret == Select::TIMEOUT)
{
SWSS_LOG_INFO("Timeout: wait redis table got select timeout");
}
else if (ret == Select::SIGNALINT)
{
return false;
}
auto end = std::chrono::steady_clock::now();
int delay = static_cast<int>(
std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count());
if (delay >= maxWaitMs)
{
return false;
}
selectTimeout = maxWaitMs - delay;
}
return false;
}