Track mapping and deletion fixes
This commit is contained in:
parent
92d0540cfe
commit
2dd62e0dce
3 changed files with 43 additions and 39 deletions
|
@ -111,18 +111,18 @@ namespace Mist {
|
||||||
}
|
}
|
||||||
//First detect all entries on metaPage
|
//First detect all entries on metaPage
|
||||||
for (int i = 0; i < 8192; i += 8) {
|
for (int i = 0; i < 8192; i += 8) {
|
||||||
int * tmpOffset = (int *)(nProxy.metaPages[it->first].mapped + i);
|
char * tmpOffset = nProxy.metaPages[it->first].mapped + i;
|
||||||
if (tmpOffset[0] == 0 && tmpOffset[1] == 0) {
|
if (Bit::btohl(tmpOffset) == 0 && Bit::btohl(tmpOffset+4) == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
unsigned long keyNum = ntohl(tmpOffset[0]);
|
unsigned long keyNum = Bit::btohl(tmpOffset);
|
||||||
|
|
||||||
//Add an entry into bufferLocations[tNum] for the pages we haven't handled yet.
|
//Add an entry into bufferLocations[tNum] for the pages we haven't handled yet.
|
||||||
if (!locations.count(keyNum)) {
|
if (!locations.count(keyNum)) {
|
||||||
locations[keyNum].curOffset = 0;
|
locations[keyNum].curOffset = 0;
|
||||||
}
|
}
|
||||||
locations[keyNum].pageNum = keyNum;
|
locations[keyNum].pageNum = keyNum;
|
||||||
locations[keyNum].keyNum = ntohl(tmpOffset[1]);
|
locations[keyNum].keyNum = Bit::btohl(tmpOffset+4);
|
||||||
}
|
}
|
||||||
for (std::map<unsigned long, DTSCPageData>::iterator it2 = locations.begin(); it2 != locations.end(); it2++) {
|
for (std::map<unsigned long, DTSCPageData>::iterator it2 = locations.begin(); it2 != locations.end(); it2++) {
|
||||||
char thisPageName[NAME_BUFFER_SIZE];
|
char thisPageName[NAME_BUFFER_SIZE];
|
||||||
|
@ -180,11 +180,11 @@ namespace Mist {
|
||||||
if (indexPage.mapped){
|
if (indexPage.mapped){
|
||||||
char * mappedPointer = indexPage.mapped;
|
char * mappedPointer = indexPage.mapped;
|
||||||
for (int j = 0; j < 8192; j += 8) {
|
for (int j = 0; j < 8192; j += 8) {
|
||||||
int * tmpOffset = (int *)(mappedPointer + j);
|
char * tmpOffset = mappedPointer + j;
|
||||||
if (tmpOffset[0] == 0 && tmpOffset[1] == 0){
|
if (Bit::btohl(tmpOffset) == 0 && Bit::btohl(tmpOffset+4) == 0){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
unsigned long keyNum = ntohl(tmpOffset[0]);
|
unsigned long keyNum = Bit::btohl(tmpOffset);
|
||||||
snprintf(pageName, NAME_BUFFER_SIZE, SHM_TRACK_DATA, streamName.c_str(), i, keyNum);
|
snprintf(pageName, NAME_BUFFER_SIZE, SHM_TRACK_DATA, streamName.c_str(), i, keyNum);
|
||||||
IPC::sharedPage erasePage(pageName, 1024, false, false);
|
IPC::sharedPage erasePage(pageName, 1024, false, false);
|
||||||
erasePage.master = true;
|
erasePage.master = true;
|
||||||
|
@ -860,19 +860,19 @@ namespace Mist {
|
||||||
|
|
||||||
//First detect all entries on metaPage
|
//First detect all entries on metaPage
|
||||||
for (int i = 0; i < 8192; i += 8) {
|
for (int i = 0; i < 8192; i += 8) {
|
||||||
int * tmpOffset = (int *)(mappedPointer + i);
|
char * tmpOffset = mappedPointer + i;
|
||||||
if (tmpOffset[0] == 0 && tmpOffset[1] == 0) {
|
if (Bit::btohl(tmpOffset) == 0 && Bit::btohl(tmpOffset+4) == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
unsigned long keyNum = ntohl(tmpOffset[0]);
|
unsigned long keyNum = Bit::btohl(tmpOffset);
|
||||||
|
|
||||||
//Add an entry into bufferLocations[tNum] for the pages we haven't handled yet.
|
//Add an entry into bufferLocations[tNum] for the pages we haven't handled yet.
|
||||||
if (!locations.count(keyNum)) {
|
if (!locations.count(keyNum)) {
|
||||||
locations[keyNum].curOffset = 0;
|
locations[keyNum].curOffset = 0;
|
||||||
VERYHIGH_MSG("Page %d detected, with %d keys", keyNum, ntohl(tmpOffset[1]));
|
VERYHIGH_MSG("Page %d detected, with %d keys", keyNum, Bit::btohl(tmpOffset+4));
|
||||||
}
|
}
|
||||||
locations[keyNum].pageNum = keyNum;
|
locations[keyNum].pageNum = keyNum;
|
||||||
locations[keyNum].keyNum = ntohl(tmpOffset[1]);
|
locations[keyNum].keyNum = Bit::btohl(tmpOffset+4);
|
||||||
}
|
}
|
||||||
//Since the map is ordered by keynumber, this loop updates the metadata for each page from oldest to newest
|
//Since the map is ordered by keynumber, this loop updates the metadata for each page from oldest to newest
|
||||||
for (std::map<unsigned long, DTSCPageData>::iterator pageIt = locations.begin(); pageIt != locations.end(); pageIt++) {
|
for (std::map<unsigned long, DTSCPageData>::iterator pageIt = locations.begin(); pageIt != locations.end(); pageIt++) {
|
||||||
|
|
36
src/io.cpp
36
src/io.cpp
|
@ -188,10 +188,10 @@ namespace Mist {
|
||||||
//NOTE: It is important that this only happens if the stream is live....
|
//NOTE: It is important that this only happens if the stream is live....
|
||||||
bool inserted = false;
|
bool inserted = false;
|
||||||
for (int i = 0; i < 1024; i++) {
|
for (int i = 0; i < 1024; i++) {
|
||||||
int * tmpOffset = (int *)(metaPages[tid].mapped + (i * 8));
|
char * tmpOffset = metaPages[tid].mapped + (i * 8);
|
||||||
if ((tmpOffset[0] == 0 && tmpOffset[1] == 0)) {
|
if ((Bit::btohl(tmpOffset) == 0 && Bit::btohl(tmpOffset+4) == 0)) {
|
||||||
tmpOffset[0] = htonl(curPageNum[tid]);
|
Bit::htobl(tmpOffset, curPageNum[tid]);
|
||||||
tmpOffset[1] = htonl(1000);
|
Bit::htobl(tmpOffset+4, 1000);
|
||||||
inserted = true;
|
inserted = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -222,10 +222,10 @@ namespace Mist {
|
||||||
DEBUG_MSG(DLVL_HIGH, "Removing page %lu on track %lu~>%lu from the corresponding metaPage", pageNumber, tid, mapTid);
|
DEBUG_MSG(DLVL_HIGH, "Removing page %lu on track %lu~>%lu from the corresponding metaPage", pageNumber, tid, mapTid);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (; i < 1024; i++) {
|
for (; i < 1024; i++) {
|
||||||
int * tmpOffset = (int *)(nProxy.metaPages[tid].mapped + (i * 8));
|
char * tmpOffset = nProxy.metaPages[tid].mapped + (i * 8);
|
||||||
if (ntohl(tmpOffset[0]) == pageNumber) {
|
if (Bit::btohl(tmpOffset) == pageNumber) {
|
||||||
tmpOffset[0] = 0;
|
Bit::htobl(tmpOffset, 0);
|
||||||
tmpOffset[1] = 0;
|
Bit::htobl(tmpOffset+4, 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -282,11 +282,11 @@ namespace Mist {
|
||||||
//Loop over the index page
|
//Loop over the index page
|
||||||
int len = metaPages[tid].len / 8;
|
int len = metaPages[tid].len / 8;
|
||||||
for (int i = 0; i < len; ++i) {
|
for (int i = 0; i < len; ++i) {
|
||||||
int * tmpOffset = (int *)(metaPages[tid].mapped + (i * 8));
|
char * tmpOffset = metaPages[tid].mapped + (i * 8);
|
||||||
unsigned int keyAmount = ntohl(tmpOffset[1]);
|
unsigned int keyAmount = Bit::btohl(tmpOffset+4);
|
||||||
if (keyAmount == 0){continue;}
|
if (keyAmount == 0){continue;}
|
||||||
//Check whether the key is on this page
|
//Check whether the key is on this page
|
||||||
unsigned int pageNum = ntohl(tmpOffset[0]);
|
unsigned int pageNum = Bit::btohl(tmpOffset);
|
||||||
if (pageNum <= keyNum && keyNum < pageNum + keyAmount) {
|
if (pageNum <= keyNum && keyNum < pageNum + keyAmount) {
|
||||||
return pageNum;
|
return pageNum;
|
||||||
}
|
}
|
||||||
|
@ -394,25 +394,25 @@ namespace Mist {
|
||||||
bool inserted = false;
|
bool inserted = false;
|
||||||
int lowest = 0;
|
int lowest = 0;
|
||||||
for (int i = 0; i < 1024; i++) {
|
for (int i = 0; i < 1024; i++) {
|
||||||
int * tmpOffset = (int *)(metaPages[tid].mapped + (i * 8));
|
char * tmpOffset = metaPages[tid].mapped + (i * 8);
|
||||||
int keyNum = ntohl(tmpOffset[0]);
|
int keyNum = Bit::btohl(tmpOffset);
|
||||||
int keyAmount = ntohl(tmpOffset[1]);
|
int keyAmount = Bit::btohl(tmpOffset+4);
|
||||||
if (!inserted){
|
if (!inserted){
|
||||||
if (myMeta.live){
|
if (myMeta.live){
|
||||||
if(keyNum == curPageNum[tid] && keyAmount == 1000){
|
if(keyNum == curPageNum[tid] && keyAmount == 1000){
|
||||||
tmpOffset[1] = htonl(pagesByTrack[tid][curPageNum[tid]].keyNum);
|
Bit::htobl(tmpOffset+4, pagesByTrack[tid][curPageNum[tid]].keyNum);
|
||||||
inserted = true;
|
inserted = true;
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
//in case of vod, insert at the first "empty" spot
|
//in case of vod, insert at the first "empty" spot
|
||||||
if(keyNum == 0){
|
if(keyNum == 0){
|
||||||
tmpOffset[0] = htonl(curPageNum[tid]);
|
Bit::htobl(tmpOffset, curPageNum[tid]);
|
||||||
tmpOffset[1] = htonl(pagesByTrack[tid][curPageNum[tid]].keyNum);
|
Bit::htobl(tmpOffset+4, pagesByTrack[tid][curPageNum[tid]].keyNum);
|
||||||
inserted = true;
|
inserted = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
keyNum = ntohl(tmpOffset[0]);
|
keyNum = Bit::btohl(tmpOffset);
|
||||||
if (!keyNum) continue;
|
if (!keyNum) continue;
|
||||||
if (!lowest || keyNum < lowest){
|
if (!lowest || keyNum < lowest){
|
||||||
lowest = keyNum;
|
lowest = keyNum;
|
||||||
|
|
|
@ -651,10 +651,10 @@ namespace Mist{
|
||||||
if (!nProxy.metaPages[trackId].mapped){return -1;}
|
if (!nProxy.metaPages[trackId].mapped){return -1;}
|
||||||
int len = nProxy.metaPages[trackId].len / 8;
|
int len = nProxy.metaPages[trackId].len / 8;
|
||||||
for (int i = 0; i < len; i++){
|
for (int i = 0; i < len; i++){
|
||||||
int * tmpOffset = (int *)(nProxy.metaPages[trackId].mapped + (i * 8));
|
char * tmpOffset = nProxy.metaPages[trackId].mapped + (i * 8);
|
||||||
long amountKey = ntohl(tmpOffset[1]);
|
long amountKey = Bit::btohl(tmpOffset+4);
|
||||||
if (amountKey == 0){continue;}
|
if (amountKey == 0){continue;}
|
||||||
long tmpKey = ntohl(tmpOffset[0]);
|
long tmpKey = Bit::btohl(tmpOffset);
|
||||||
if (tmpKey <= keyNum && ((tmpKey?tmpKey:1) + amountKey) > keyNum){
|
if (tmpKey <= keyNum && ((tmpKey?tmpKey:1) + amountKey) > keyNum){
|
||||||
return tmpKey;
|
return tmpKey;
|
||||||
}
|
}
|
||||||
|
@ -673,10 +673,10 @@ namespace Mist{
|
||||||
int len = nProxy.metaPages[trackId].len / 8;
|
int len = nProxy.metaPages[trackId].len / 8;
|
||||||
int highest = -1;
|
int highest = -1;
|
||||||
for (int i = 0; i < len; i++){
|
for (int i = 0; i < len; i++){
|
||||||
int * tmpOffset = (int *)(nProxy.metaPages[trackId].mapped + (i * 8));
|
char * tmpOffset = nProxy.metaPages[trackId].mapped + (i * 8);
|
||||||
long amountKey = ntohl(tmpOffset[1]);
|
long amountKey = Bit::btohl(tmpOffset+4);
|
||||||
if (amountKey == 0){continue;}
|
if (amountKey == 0){continue;}
|
||||||
long tmpKey = ntohl(tmpOffset[0]);
|
long tmpKey = Bit::btohl(tmpOffset);
|
||||||
if (tmpKey > highest){highest = tmpKey;}
|
if (tmpKey > highest){highest = tmpKey;}
|
||||||
}
|
}
|
||||||
return highest;
|
return highest;
|
||||||
|
@ -1340,11 +1340,15 @@ namespace Mist{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DONTEVEN_MSG("Loading track %u (next=%lu), %llu ms", nxt.tid, nxtKeyNum[nxt.tid], nxt.time);
|
DONTEVEN_MSG("Loading track %u (next=%lu), %llu ms, %llub", nxt.tid, nxtKeyNum[nxt.tid], nxt.time, nxt.offset);
|
||||||
|
|
||||||
//if we're going to read past the end of the data page, load the next page
|
//if we're going to read past the end of the data page, load the next page
|
||||||
//this only happens for VoD
|
//this only happens for VoD
|
||||||
if (nxt.offset >= nProxy.curPage[nxt.tid].len){
|
if (nxt.offset >= nProxy.curPage[nxt.tid].len){
|
||||||
|
if (myMeta.vod && nxt.time >= myMeta.tracks[nxt.tid].lastms){
|
||||||
|
dropTrack(nxt.tid, "end of VoD track reached", false);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (thisPacket){
|
if (thisPacket){
|
||||||
nxtKeyNum[nxt.tid] = getKeyForTime(nxt.tid, thisPacket.getTime());
|
nxtKeyNum[nxt.tid] = getKeyForTime(nxt.tid, thisPacket.getTime());
|
||||||
}
|
}
|
||||||
|
@ -1360,7 +1364,7 @@ namespace Mist{
|
||||||
buffer.insert(nxt);
|
buffer.insert(nxt);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
dropTrack(nxt.tid, "page load failure");
|
dropTrack(nxt.tid, "VoD page load failure");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1419,7 +1423,7 @@ namespace Mist{
|
||||||
MEDIUM_MSG("Next page for track %u starts at %llu.", nxt.tid, nxt.time);
|
MEDIUM_MSG("Next page for track %u starts at %llu.", nxt.tid, nxt.time);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
dropTrack(nxt.tid, "page load failure");
|
dropTrack(nxt.tid, "next page load failure");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue