Example #1
0
void
Work::advance()
{
    if (getState() != WORK_PENDING)
    {
        return;
    }

    CLOG(DEBUG, "Work") << "advancing " << getUniqueName();
    advanceChildren();
    if (allChildrenSuccessful())
    {
        CLOG(DEBUG, "Work") << "all " << mChildren.size() << " children of "
                            << getUniqueName() << " successful, scheduling run";
        scheduleRun();
    }
    else if (anyChildFatalFailure())
    {
        CLOG(DEBUG, "Work") << "some of " << mChildren.size() << " children of "
                            << getUniqueName() << " fatally failed, scheduling "
                            << "fatal failure";
        scheduleFatalFailure();
    }
    else if (anyChildRaiseFailure())
    {
        CLOG(DEBUG, "Work") << "some of " << mChildren.size() << " children of "
                            << getUniqueName() << " failed, scheduling failure";
        scheduleFailure();
    }
}
Example #2
0
void
WorkManagerImpl::notify(std::string const& child)
{
    auto i = mChildren.find(child);
    if (i == mChildren.end())
    {
        CLOG(WARNING, "Work") << "WorkManager notified by unknown child "
                              << child;
        return;
    }

    if (i->second->getState() == Work::WORK_SUCCESS)
    {
        CLOG(INFO, "Work") << "WorkManager got SUCCESS from " << child;
        mApp.getMetrics().NewMeter({"work", "root", "success"}, "unit").Mark();
        mChildren.erase(child);
    }
    else if (i->second->getState() == Work::WORK_FAILURE_RAISE)
    {
        CLOG(WARNING, "Work") << "WorkManager got FAILURE_RAISE from " << child;
        mApp.getMetrics().NewMeter({"work", "root", "failure"}, "unit").Mark();
        mChildren.erase(child);
    }
    else if (i->second->getState() == Work::WORK_FAILURE_FATAL)
    {
        CLOG(WARNING, "Work") << "WorkManager got FAILURE_FATAL from " << child;
        mApp.getMetrics().NewMeter({"work", "root", "failure"}, "unit").Mark();
        mChildren.erase(child);
    }
    advanceChildren();
}