1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-13 11:51:57 +00:00

RTC: Use error pithy print to reduce dup logs

This commit is contained in:
winlin 2020-07-22 15:51:48 +08:00
parent c2c35a7330
commit c115f77038
3 changed files with 118 additions and 18 deletions

View file

@ -506,6 +506,9 @@ srs_error_t SrsUdpMuxListener::cycle()
uint64_t nn_loop = 0;
srs_utime_t time_last = srs_get_system_time();
SrsErrorPithyPrint* epp = new SrsErrorPithyPrint();
SrsAutoFree(SrsErrorPithyPrint, epp);
set_socket_buffer();
while (true) {
@ -524,7 +527,7 @@ srs_error_t SrsUdpMuxListener::cycle()
int nread = skt.recvfrom(SRS_UTIME_NO_TIMEOUT);
if (nread <= 0) {
if (nread < 0) {
srs_warn("udp recv error");
srs_warn("udp recv error nn=%d", nread);
}
// remux udp never return
continue;
@ -539,8 +542,9 @@ srs_error_t SrsUdpMuxListener::cycle()
err = handler->on_udp_packet(&skt);
}
if (err != srs_success) {
// remux udp never return
srs_warn("udp packet handler error:%s", srs_error_desc(err).c_str());
if (epp->can_print(err)) {
srs_warn("handle udp pkt err: %s", srs_error_desc(err).c_str());
}
srs_freep(err);
}

View file

@ -24,7 +24,7 @@
#include <srs_app_pithy_print.hpp>
#include <stdlib.h>
#include <map>
using namespace std;
#include <srs_kernel_log.hpp>
#include <srs_app_config.hpp>
@ -75,7 +75,81 @@ srs_error_t SrsStageInfo::on_reload_pithy_print()
return srs_success;
}
static std::map<int, SrsStageInfo*> _srs_stages;
SrsStageManager::SrsStageManager()
{
}
SrsStageManager::~SrsStageManager()
{
map<int, SrsStageInfo*>::iterator it;
for (it = stages.begin(); it != stages.end(); ++it) {
SrsStageInfo* stage = it->second;
srs_freep(stage);
}
}
SrsStageInfo* SrsStageManager::fetch_or_create(int stage_id, bool* pnew)
{
std::map<int, SrsStageInfo*>::iterator it = stages.find(stage_id);
// Create one if not exists.
if (it == stages.end()) {
SrsStageInfo* stage = new SrsStageInfo(stage_id);
stages[stage_id] = stage;
if (pnew) {
*pnew = true;
}
return stage;
}
// Exists, fetch it.
SrsStageInfo* stage = it->second;
if (pnew) {
*pnew = false;
}
return stage;
}
SrsErrorPithyPrint::SrsErrorPithyPrint()
{
}
SrsErrorPithyPrint::~SrsErrorPithyPrint()
{
}
bool SrsErrorPithyPrint::can_print(srs_error_t err)
{
int error_code = srs_error_code(err);
bool new_stage = false;
SrsStageInfo* stage = stages.fetch_or_create(error_code, &new_stage);
// Always and only one client.
if (new_stage) {
stage->nb_clients = 1;
}
srs_utime_t tick = ticks[error_code];
if (!tick) {
ticks[error_code] = tick = srs_get_system_time();
}
srs_utime_t diff = srs_get_system_time() - tick;
diff = srs_max(0, diff);
stage->elapse(diff);
ticks[error_code] = srs_get_system_time();
return new_stage || stage->can_print();
}
// The global stage manager for pithy print, multiple stages.
static SrsStageManager* _srs_stages = new SrsStageManager();
SrsPithyPrint::SrsPithyPrint(int _stage_id)
{
@ -194,16 +268,7 @@ SrsPithyPrint::~SrsPithyPrint()
int SrsPithyPrint::enter_stage()
{
SrsStageInfo* stage = NULL;
std::map<int, SrsStageInfo*>::iterator it = _srs_stages.find(stage_id);
if (it == _srs_stages.end()) {
stage = new SrsStageInfo(stage_id);
_srs_stages[stage_id] = stage;
} else {
stage = it->second;
}
SrsStageInfo* stage = _srs_stages->fetch_or_create(stage_id);
srs_assert(stage != NULL);
client_id = stage->nb_clients++;
@ -215,7 +280,7 @@ int SrsPithyPrint::enter_stage()
void SrsPithyPrint::leave_stage()
{
SrsStageInfo* stage = _srs_stages[stage_id];
SrsStageInfo* stage = _srs_stages->fetch_or_create(stage_id);
srs_assert(stage != NULL);
stage->nb_clients--;
@ -226,7 +291,7 @@ void SrsPithyPrint::leave_stage()
void SrsPithyPrint::elapse()
{
SrsStageInfo* stage = _srs_stages[stage_id];
SrsStageInfo* stage = _srs_stages->fetch_or_create(stage_id);
srs_assert(stage != NULL);
srs_utime_t diff = srs_get_system_time() - previous_tick;
@ -239,7 +304,7 @@ void SrsPithyPrint::elapse()
bool SrsPithyPrint::can_print()
{
SrsStageInfo* stage = _srs_stages[stage_id];
SrsStageInfo* stage = _srs_stages->fetch_or_create(stage_id);
srs_assert(stage != NULL);
return stage->can_print();

View file

@ -26,6 +26,8 @@
#include <srs_core.hpp>
#include <map>
#include <srs_app_reload.hpp>
// The stage info to calc the age.
@ -48,6 +50,35 @@ public:
virtual srs_error_t on_reload_pithy_print();
};
// The manager for stages, it's used for a single client stage.
// Of course, we can add the multiple user support, which is SrsPithyPrint.
class SrsStageManager
{
private:
std::map<int, SrsStageInfo*> stages;
public:
SrsStageManager();
virtual ~SrsStageManager();
public:
// Fetch a stage, create one if not exists.
SrsStageInfo* fetch_or_create(int stage_id, bool* pnew = NULL);
};
// The error pithy print is a single client stage manager, each stage only has one client.
// For example, we use it for error pithy print for each UDP packet processing.
class SrsErrorPithyPrint
{
private:
SrsStageManager stages;
std::map<int, srs_utime_t> ticks;
public:
SrsErrorPithyPrint();
virtual ~SrsErrorPithyPrint();
public:
// Whether specified stage is ready for print.
bool can_print(srs_error_t err);
};
// The stage is used for a collection of object to do print,
// the print time in a stage is constant and not changed,
// that is, we always got one message to print every specified time.