bool RedisTableWaiter::waitUntil()

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;
}