Fix buffer behaviour after changes for MistInHLS

This commit is contained in:
Thulinma 2023-10-23 14:20:30 +02:00
parent 9e30444476
commit 26746c139d
5 changed files with 35 additions and 94 deletions

View file

@ -43,27 +43,32 @@ namespace Mist{
if (endKey > key + 1000){endKey = key + 1000;}
DONTEVEN_MSG("User with ID:%zu is on %zu:%zu -> %zu (timestamp %" PRIu64 ")", id, track, key, endKey, time);
for (size_t i = key; i <= endKey; ){
const Util::RelAccX &tPages = M.pages(track);
Util::RelAccXFieldData firstkeyEntry = tPages.getFieldData("firstkey");
Util::RelAccXFieldData keyCountEntry = tPages.getFieldData("keycount");
if (!tPages.getEndPos()){return;}
DTSC::Keys keys(M.keys(track));
if (i > keys.getEndValid()){return;}
uint64_t pageIdx = 0;
bool found = false;
uint64_t cnt = 1, pageNumber = 0;
for (uint64_t j = tPages.getDeleted(); j < tPages.getEndPos(); j++){
uint64_t thisKey = tPages.getInt("firstkey", j);
if (thisKey > i) break;
pageIdx = j;
pageNumber = tPages.getInt(firstkeyEntry, j);
cnt = tPages.getInt(keyCountEntry, j);
if (pageNumber <= i && pageNumber + cnt > i){
found = true;
break;
}
}
uint32_t pageNumber = tPages.getInt("firstkey", pageIdx);
// Could not find key? Then we're done here.
if (!found){return;}
uint64_t pageTime = M.getTimeForKeyIndex(track, pageNumber);
if (pageTime < time){
if (pageTime <= time){
keyLoadPriority[trackKey(track, pageNumber)] += 10000;
}else{
keyLoadPriority[trackKey(track, pageNumber)] += 600 - (pageTime - time) / 1000;
}
uint64_t cnt = tPages.getInt("keycount", pageIdx);
if (pageNumber + cnt <= i){return;}
// Make sure we always progress, even in edge cases where there is no full key buffered yet
if (!cnt){cnt = 1;}
i = pageNumber + cnt;
}
//Now, we can rest assured that the next ~120 seconds or so is pre-buffered in RAM.
@ -1663,7 +1668,7 @@ namespace Mist{
}
}
}
bufferFinalize(idx, page);
page.close();
bufferTimer = Util::bootMS() - bufferTimer;
if (packCounter < tPages.getInt("parts", pageIdx)){
FAIL_MSG("Track %zu, page %" PRIu32 " (" PRETTY_PRINT_MSTIME " - " PRETTY_PRINT_MSTIME ") NOT FULLY buffered in %" PRIu64 "ms - erasing for later retry",

View file

@ -423,6 +423,13 @@ namespace Mist{
while (keys.getValidCount() > 1 && (M.getLastms(i) - keys.getTime(keys.getFirstValid() + 1)) > bufferTime){
if (!removeKey(i)){break;}
}
Util::RelAccX &tPages = meta.pages(i);
Util::RelAccXFieldData firstKeyEnt = tPages.getFieldData("firstkey");
Util::RelAccXFieldData keyCount = tPages.getFieldData("keycount");
for (uint32_t j = tPages.getDeleted(); j < tPages.getEndPos(); j++){
if (tPages.getInt(firstKeyEnt, j) + tPages.getInt(keyCount, j) > firstKey){break;}
bufferRemove(i, tPages.getInt(firstKeyEnt, j), j);
}
}
updateMeta();
}