loggerd: don't let a single service clog up the main thread

pull/23151/head
Adeeb Shihadeh 2021-12-06 19:31:11 -08:00
parent 9afc95474d
commit baf1a77ca2
1 changed files with 13 additions and 1 deletions

View File

@ -180,6 +180,7 @@ void rotate_if_needed(LoggerdState *s) {
void loggerd_thread() {
// setup messaging
typedef struct QlogState {
std::string name;
int counter, freq;
} QlogState;
std::unordered_map<SubSocket*, QlogState> qlog_states;
@ -195,7 +196,11 @@ void loggerd_thread() {
SubSocket * sock = SubSocket::create(s.ctx, it.name);
assert(sock != NULL);
poller->registerSocket(sock);
qlog_states[sock] = {.counter = 0, .freq = it.decimation};
qlog_states[sock] = {
.name = it.name,
.counter = 0,
.freq = it.decimation,
};
}
// init logger
@ -219,6 +224,7 @@ void loggerd_thread() {
// poll for new messages on all sockets
for (auto sock : poller->poll(1000)) {
// drain socket
int count = 0;
QlogState &qs = qlog_states[sock];
Message *msg = nullptr;
while (!do_exit && (msg = sock->receive(true))) {
@ -233,6 +239,12 @@ void loggerd_thread() {
double seconds = (millis_since_boot() - start_ts) / 1000.0;
LOGD("%lu messages, %.2f msg/sec, %.2f KB/sec", msg_count, msg_count / seconds, bytes_count * 0.001 / seconds);
}
count++;
if (count >= 50) {
LOGE("large volume of '%s' messages", qs.name.c_str());
break;
}
}
}
}