Fixed statistics returning random data right after stream start and/or reload

This commit is contained in:
Thulinma 2021-06-21 14:07:15 +02:00
parent fe6a0777a5
commit f8f799422b

View file

@ -117,6 +117,26 @@ struct streamTotals{
uint64_t packRetrans; uint64_t packRetrans;
}; };
static std::map<std::string, struct streamTotals> streamStats; static std::map<std::string, struct streamTotals> streamStats;
static void createEmptyStatsIfNeeded(const std::string & strm){
if (streamStats.count(strm)){return;}
streamTotals & sT = streamStats[strm];
sT.upBytes = 0;
sT.downBytes = 0;
sT.inputs = 0;
sT.outputs = 0;
sT.viewers = 0;
sT.currIns = 0;
sT.currOuts = 0;
sT.currViews = 0;
sT.status = 0;
sT.viewSeconds = 0;
sT.packSent = 0;
sT.packLoss = 0;
sT.packRetrans = 0;
}
static uint64_t servUpBytes = 0; static uint64_t servUpBytes = 0;
static uint64_t servDownBytes = 0; static uint64_t servDownBytes = 0;
static uint64_t servUpOtherBytes = 0; static uint64_t servUpOtherBytes = 0;
@ -685,16 +705,19 @@ void Controller::statSession::update(uint64_t index, Comms::Statistics &statComm
if (sessionType == SESS_UNSET){ if (sessionType == SESS_UNSET){
if (myConnector.size() >= 5 && myConnector.substr(0, 5) == "INPUT"){ if (myConnector.size() >= 5 && myConnector.substr(0, 5) == "INPUT"){
++servInputs; ++servInputs;
createEmptyStatsIfNeeded(myStream);
streamStats[myStream].inputs++; streamStats[myStream].inputs++;
streamStats[myStream].currIns++; streamStats[myStream].currIns++;
sessionType = SESS_INPUT; sessionType = SESS_INPUT;
}else if (myConnector.size() >= 6 && myConnector.substr(0, 6) == "OUTPUT"){ }else if (myConnector.size() >= 6 && myConnector.substr(0, 6) == "OUTPUT"){
++servOutputs; ++servOutputs;
createEmptyStatsIfNeeded(myStream);
streamStats[myStream].outputs++; streamStats[myStream].outputs++;
streamStats[myStream].currOuts++; streamStats[myStream].currOuts++;
sessionType = SESS_OUTPUT; sessionType = SESS_OUTPUT;
}else{ }else{
++servViewers; ++servViewers;
createEmptyStatsIfNeeded(myStream);
streamStats[myStream].viewers++; streamStats[myStream].viewers++;
streamStats[myStream].currViews++; streamStats[myStream].currViews++;
sessionType = SESS_VIEWER; sessionType = SESS_VIEWER;
@ -707,6 +730,7 @@ void Controller::statSession::update(uint64_t index, Comms::Statistics &statComm
if (!myStream.size() || myStream[0] == 0){ if (!myStream.size() || myStream[0] == 0){
if (streamStats.count(myStream)){streamStats.erase(myStream);} if (streamStats.count(myStream)){streamStats.erase(myStream);}
}else{ }else{
createEmptyStatsIfNeeded(myStream);
streamStats[myStream].upBytes += currUp; streamStats[myStream].upBytes += currUp;
streamStats[myStream].downBytes += currDown; streamStats[myStream].downBytes += currDown;
streamStats[myStream].packSent += currPktSent; streamStats[myStream].packSent += currPktSent;
@ -718,6 +742,7 @@ void Controller::statSession::update(uint64_t index, Comms::Statistics &statComm
if (!myStream.size() || myStream[0] == 0){ if (!myStream.size() || myStream[0] == 0){
if (streamStats.count(myStream)){streamStats.erase(myStream);} if (streamStats.count(myStream)){streamStats.erase(myStream);}
}else{ }else{
createEmptyStatsIfNeeded(myStream);
streamStats[myStream].upBytes += currUp - prevUp; streamStats[myStream].upBytes += currUp - prevUp;
streamStats[myStream].downBytes += currDown - prevDown; streamStats[myStream].downBytes += currDown - prevDown;
streamStats[myStream].packSent += currPktSent - prevPktSent; streamStats[myStream].packSent += currPktSent - prevPktSent;
@ -772,13 +797,13 @@ void Controller::statSession::dropSession(const Controller::sessIndex &index){
if (!tracked || curConns.size()){return;} if (!tracked || curConns.size()){return;}
switch (sessionType){ switch (sessionType){
case SESS_INPUT: case SESS_INPUT:
if (streamStats[index.streamName].currIns){streamStats[index.streamName].currIns--;} if (streamStats.count(index.streamName) && streamStats[index.streamName].currIns){streamStats[index.streamName].currIns--;}
break; break;
case SESS_OUTPUT: case SESS_OUTPUT:
if (streamStats[index.streamName].currOuts){streamStats[index.streamName].currOuts--;} if (streamStats.count(index.streamName) && streamStats[index.streamName].currOuts){streamStats[index.streamName].currOuts--;}
break; break;
case SESS_VIEWER: case SESS_VIEWER:
if (streamStats[index.streamName].currViews){streamStats[index.streamName].currViews--;} if (streamStats.count(index.streamName) && streamStats[index.streamName].currViews){streamStats[index.streamName].currViews--;}
break; break;
default: break; default: break;
} }