void Scheduler::startNewRound() { // update flows so that they can be moved to the new round std::vector<Flow*> flowVec; while (pendingEvents.empty() == false) { Flow* f = const_cast<Flow*> (pendingEvents.top()); pendingEvents.pop(); if (f->getFlowType() == FlowType::WATCH) { // there is no point in carrying over watch flows, as they will be discarded BOOST_LOG_TRIVIAL(trace) << "Deleting watch flow for chunk" << f->getChunkId() << " of content " << f->getContent()->getName() << " for user " << f->getDestination().first << "," << f->getDestination().second; delete f; continue; } f->updateSizeDownloaded(this->roundDuration); f->setLastUpdate(0); f->setStart(f->getStart() - this->roundDuration); // negative SimTime oldEta = f->getEta(); if (oldEta < this->roundDuration) { BOOST_LOG_TRIVIAL(error) << "Scheduler::startNewRound() - unresolved event has eta " << oldEta << " < roundDuration"; abort(); } f->setEta(oldEta - this->roundDuration); if (this->mode == IPTV && f->getContent()->getReleaseDay() <= currentRound-6) { // expired contents in IPTV will be deleted so flows can't be completed, // this event should have been truncated last round BOOST_LOG_TRIVIAL(info) << "Scheduler::startNewRound() - carried over flow " "with expired content will not be completed"; if (f->getFlowType() == FlowType::TRANSFER) { // this is hacky, but needs to be done. Ideally we should not get here at all. oracle->getTopology()->updateCapacity(f, this, false); f->setContent(nullptr); } } else flowVec.push_back(f); } handleMap.clear(); BOOST_FOREACH (Flow* f, flowVec) { this->schedule(f); }