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