Fixes to downloader range requests, improvements to input bufferFrame code

This commit is contained in:
Thulinma 2023-03-30 02:20:23 +02:00
parent 393fa9e403
commit d097273859
2 changed files with 25 additions and 7 deletions

View file

@ -270,8 +270,17 @@ namespace HTTP{
}else{ }else{
sprintf(tmp, "bytes=%zu-%zu", byteStart, byteEnd - 1); sprintf(tmp, "bytes=%zu-%zu", byteStart, byteEnd - 1);
} }
extraHeaders.erase("Range");
setHeader("Range", tmp); setHeader("Range", tmp);
return getNonBlocking(link, 6); if (!canRequest(link)){return false;}
nbLink = link;
nbMaxRecursiveDepth = 6;
nbLoop = retryCount + 1; // max 5 attempts
isComplete = false;
doRequest(nbLink);
nbReqTime = Util::bootSecs();
nbLastOff = getSocket().dataDown();
return true;
} }
bool Downloader::getRange(const HTTP::URL &link, size_t byteStart, size_t byteEnd, Util::DataCallback &cb){ bool Downloader::getRange(const HTTP::URL &link, size_t byteStart, size_t byteEnd, Util::DataCallback &cb){

View file

@ -1526,8 +1526,16 @@ namespace Mist{
size_t dataLen; size_t dataLen;
thisPacket.getString("data", data, dataLen); thisPacket.getString("data", data, dataLen);
if (dataLen != parts.getSize(partNo)){ if (dataLen != parts.getSize(partNo)){
if (partNo && dataLen == parts.getSize(partNo-1)){
FAIL_MSG("Part size for part %zu (%" PRIu64 "ms) matches part before it, instead. Aborting page load!", partNo, thisTime);
break;
}else if (dataLen == parts.getSize(partNo+1)){
FAIL_MSG("Part size for part %zu (%" PRIu64 "ms) matches part after it, instead. Aborting page load!", partNo, thisTime);
break;
}else{
INFO_MSG("Part %zu (@%" PRIu64 ") size mismatch: %zu (actual) != %zu (expected)", partNo, thisTime, dataLen, parts.getSize(partNo)); INFO_MSG("Part %zu (@%" PRIu64 ") size mismatch: %zu (actual) != %zu (expected)", partNo, thisTime, dataLen, parts.getSize(partNo));
} }
}
++partNo; ++partNo;
HIGH_MSG("Buffering VoD packet (%zuB) @%" PRIu64 " ms on track %zu with offset %" PRIu64, dataLen, thisTime, idx, thisPacket.getInt("offset")); HIGH_MSG("Buffering VoD packet (%zuB) @%" PRIu64 " ms on track %zu with offset %" PRIu64, dataLen, thisTime, idx, thisPacket.getInt("offset"));
bufferNext(thisTime, thisPacket.getInt("offset"), idx, data, dataLen, bufferNext(thisTime, thisPacket.getInt("offset"), idx, data, dataLen,
@ -1559,15 +1567,16 @@ namespace Mist{
bufferFinalize(idx, page); bufferFinalize(idx, page);
bufferTimer = Util::bootMS() - bufferTimer; bufferTimer = Util::bootMS() - bufferTimer;
if (packCounter != tPages.getInt("parts", pageIdx)){ if (packCounter != tPages.getInt("parts", pageIdx)){
FAIL_MSG("Track %zu, page %" PRIu32 " (%" PRIu64 " - %" PRIu64 " ms) NOT FULLY buffered in %" PRIu64 "ms", FAIL_MSG("Track %zu, page %" PRIu32 " (" PRETTY_PRINT_MSTIME " - " PRETTY_PRINT_MSTIME ") NOT FULLY buffered in %" PRIu64 "ms - erasing for later retry",
idx, pageNumber, tPages.getInt("firsttime", pageIdx), thisTime, bufferTimer); idx, pageNumber, PRETTY_ARG_MSTIME(tPages.getInt("firsttime", pageIdx)), PRETTY_ARG_MSTIME(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] = Util::bootSecs(); pageCounter[idx].erase(pageNumber);
bufferRemove(idx, pageNumber);
return false; return false;
}else{ }else{
INFO_MSG("Track %zu, page %" PRIu32 " (%" PRIu64 " - %" PRIu64 " ms) buffered in %" PRIu64 "ms", INFO_MSG("Track %zu, page %" PRIu32 " (" PRETTY_PRINT_MSTIME " - " PRETTY_PRINT_MSTIME ") buffered in %" PRIu64 "ms",
idx, pageNumber, tPages.getInt("firsttime", pageIdx), thisTime, bufferTimer); idx, pageNumber, PRETTY_ARG_MSTIME(tPages.getInt("firsttime", pageIdx)), PRETTY_ARG_MSTIME(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] = Util::bootSecs(); pageCounter[idx][pageNumber] = Util::bootSecs();