Change VoD data page logic to use wallclock seconds rather than loop iterations for timeouts
This commit is contained in:
parent
44c2809733
commit
747438746c
2 changed files with 24 additions and 10 deletions
|
@ -1022,28 +1022,42 @@ namespace Mist{
|
||||||
}
|
}
|
||||||
|
|
||||||
void Input::removeUnused(){
|
void Input::removeUnused(){
|
||||||
|
uint64_t cTime = Util::bootSecs();
|
||||||
std::set<size_t> validTracks = M.getValidTracks();
|
std::set<size_t> validTracks = M.getValidTracks();
|
||||||
|
std::map<size_t, std::set<uint32_t> > checkedPages;
|
||||||
for (std::set<size_t>::iterator it = validTracks.begin(); it != validTracks.end(); ++it){
|
for (std::set<size_t>::iterator it = validTracks.begin(); it != validTracks.end(); ++it){
|
||||||
Util::RelAccX &tPages = meta.pages(*it);
|
Util::RelAccX &tPages = meta.pages(*it);
|
||||||
for (size_t i = tPages.getDeleted(); i < tPages.getEndPos(); i++){
|
for (size_t i = tPages.getDeleted(); i < tPages.getEndPos(); i++){
|
||||||
uint64_t pageNum = tPages.getInt("firstkey", i);
|
uint64_t pageNum = tPages.getInt("firstkey", i);
|
||||||
|
checkedPages[*it].insert(pageNum);
|
||||||
if (pageCounter[*it].count(pageNum)){
|
if (pageCounter[*it].count(pageNum)){
|
||||||
// If the page is still being written to, reset the counter rather than potentially unloading it
|
// If the page is still being written to, reset the counter rather than potentially unloading it
|
||||||
if (isCurrentLivePage(*it, pageNum)){
|
if (isCurrentLivePage(*it, pageNum)){
|
||||||
pageCounter[*it][pageNum] = DEFAULT_PAGE_TIMEOUT;
|
pageCounter[*it][pageNum] = cTime;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
--pageCounter[*it][pageNum];
|
if (cTime > pageCounter[*it][pageNum] + DEFAULT_PAGE_TIMEOUT){
|
||||||
if (!pageCounter[*it][pageNum]){
|
|
||||||
pageCounter[*it].erase(pageNum);
|
pageCounter[*it].erase(pageNum);
|
||||||
bufferRemove(*it, pageNum);
|
bufferRemove(*it, pageNum);
|
||||||
}
|
}
|
||||||
}
|
}else{
|
||||||
else{
|
pageCounter[*it][pageNum] = cTime;
|
||||||
pageCounter[*it][pageNum] = DEFAULT_PAGE_TIMEOUT;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//Check pages we buffered but forgot about
|
||||||
|
for (std::map<size_t, std::map<uint32_t, size_t> >::iterator it = pageCounter.begin();
|
||||||
|
it != pageCounter.end(); it++){
|
||||||
|
for (std::map<uint32_t, size_t>::iterator it2 = it->second.begin(); it2 != it->second.end(); it2++){
|
||||||
|
if (!checkedPages.count(it->first) || !checkedPages[it->first].count(it2->first)){
|
||||||
|
INFO_MSG("Deleting forgotten page %zu:%" PRIu32, it->first, it2->first);
|
||||||
|
bufferRemove(it->first, it2->first);
|
||||||
|
it->second.erase(it2);
|
||||||
|
it2 = it->second.begin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string formatGUID(const std::string &val){
|
std::string formatGUID(const std::string &val){
|
||||||
|
@ -1290,8 +1304,8 @@ namespace Mist{
|
||||||
}
|
}
|
||||||
uint32_t pageNumber = tPages.getInt("firstkey", pageIdx);
|
uint32_t pageNumber = tPages.getInt("firstkey", pageIdx);
|
||||||
if (isBuffered(idx, pageNumber, meta)){
|
if (isBuffered(idx, pageNumber, meta)){
|
||||||
// Mark the page for removal after 15 seconds of no one watching it
|
// Mark the page as still actively requested
|
||||||
pageCounter[idx][pageNumber] = DEFAULT_PAGE_TIMEOUT;
|
pageCounter[idx][pageNumber] = Util::bootSecs();
|
||||||
DONTEVEN_MSG("Track %zu, key %" PRIu32 " is already buffered in page %" PRIu32
|
DONTEVEN_MSG("Track %zu, key %" PRIu32 " is already buffered in page %" PRIu32
|
||||||
". Cancelling bufferFrame",
|
". Cancelling bufferFrame",
|
||||||
idx, keyNum, pageNumber);
|
idx, keyNum, pageNumber);
|
||||||
|
@ -1432,7 +1446,7 @@ namespace Mist{
|
||||||
idx, pageNumber, tPages.getInt("firsttime", pageIdx), thisTime, bufferTimer);
|
idx, pageNumber, tPages.getInt("firsttime", pageIdx), thisTime, bufferTimer);
|
||||||
INFO_MSG(" (%" PRIu32 "/%" PRIu64 " parts, %" PRIu64 " bytes)", packCounter,
|
INFO_MSG(" (%" PRIu32 "/%" PRIu64 " parts, %" PRIu64 " bytes)", packCounter,
|
||||||
tPages.getInt("parts", pageIdx), byteCounter);
|
tPages.getInt("parts", pageIdx), byteCounter);
|
||||||
pageCounter[idx][pageNumber] = DEFAULT_PAGE_TIMEOUT;
|
pageCounter[idx][pageNumber] = Util::bootSecs();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ namespace Mist{
|
||||||
|
|
||||||
IPC::sharedPage streamStatus;
|
IPC::sharedPage streamStatus;
|
||||||
|
|
||||||
std::map<size_t, std::map<uint32_t, size_t> > pageCounter;
|
std::map<size_t, std::map<uint32_t, uint64_t> > pageCounter;
|
||||||
|
|
||||||
static Input *singleton;
|
static Input *singleton;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue