Fix data race in rlc UM metrics.

This commit is contained in:
faluco 2021-09-23 17:57:50 +02:00 committed by Andre Puschmann
parent 6c91a824e2
commit edb7342aef
2 changed files with 13 additions and 2 deletions

View File

@ -165,6 +165,7 @@ protected:
bool tx_enabled = false; bool tx_enabled = false;
bool rx_enabled = false; bool rx_enabled = false;
std::mutex metrics_mutex;
rlc_bearer_metrics_t metrics = {}; rlc_bearer_metrics_t metrics = {};
}; };

View File

@ -82,15 +82,18 @@ void rlc_um_base::write_sdu(unique_byte_buffer_t sdu)
{ {
if (not tx_enabled || not tx) { if (not tx_enabled || not tx) {
logger.debug("%s is currently deactivated. Dropping SDU (%d B)", rb_name.c_str(), sdu->N_bytes); logger.debug("%s is currently deactivated. Dropping SDU (%d B)", rb_name.c_str(), sdu->N_bytes);
std::lock_guard<std::mutex> lock(metrics_mutex);
metrics.num_lost_sdus++; metrics.num_lost_sdus++;
return; return;
} }
int sdu_bytes = sdu->N_bytes; //< Store SDU length for book-keeping int sdu_bytes = sdu->N_bytes; //< Store SDU length for book-keeping
if (tx->try_write_sdu(std::move(sdu)) == SRSRAN_SUCCESS) { if (tx->try_write_sdu(std::move(sdu)) == SRSRAN_SUCCESS) {
std::lock_guard<std::mutex> lock(metrics_mutex);
metrics.num_tx_sdus++; metrics.num_tx_sdus++;
metrics.num_tx_sdu_bytes += sdu_bytes; metrics.num_tx_sdu_bytes += sdu_bytes;
} else { } else {
std::lock_guard<std::mutex> lock(metrics_mutex);
metrics.num_lost_sdus++; metrics.num_lost_sdus++;
} }
} }
@ -102,6 +105,7 @@ void rlc_um_base::discard_sdu(uint32_t discard_sn)
return; return;
} }
tx->discard_sdu(discard_sn); tx->discard_sdu(discard_sn);
std::lock_guard<std::mutex> lock(metrics_mutex);
metrics.num_lost_sdus++; metrics.num_lost_sdus++;
} }
@ -135,6 +139,7 @@ uint32_t rlc_um_base::read_pdu(uint8_t* payload, uint32_t nof_bytes)
if (tx && tx_enabled) { if (tx && tx_enabled) {
uint32_t len = tx->build_data_pdu(payload, nof_bytes); uint32_t len = tx->build_data_pdu(payload, nof_bytes);
if (len > 0) { if (len > 0) {
std::lock_guard<std::mutex> lock(metrics_mutex);
metrics.num_tx_pdu_bytes += len; metrics.num_tx_pdu_bytes += len;
metrics.num_tx_pdus++; metrics.num_tx_pdus++;
} }
@ -146,19 +151,24 @@ uint32_t rlc_um_base::read_pdu(uint8_t* payload, uint32_t nof_bytes)
void rlc_um_base::write_pdu(uint8_t* payload, uint32_t nof_bytes) void rlc_um_base::write_pdu(uint8_t* payload, uint32_t nof_bytes)
{ {
if (rx && rx_enabled) { if (rx && rx_enabled) {
metrics.num_rx_pdus++; {
metrics.num_rx_pdu_bytes += nof_bytes; std::lock_guard<std::mutex> lock(metrics_mutex);
metrics.num_rx_pdus++;
metrics.num_rx_pdu_bytes += nof_bytes;
}
rx->handle_data_pdu(payload, nof_bytes); rx->handle_data_pdu(payload, nof_bytes);
} }
} }
rlc_bearer_metrics_t rlc_um_base::get_metrics() rlc_bearer_metrics_t rlc_um_base::get_metrics()
{ {
std::lock_guard<std::mutex> lock(metrics_mutex);
return metrics; return metrics;
} }
void rlc_um_base::reset_metrics() void rlc_um_base::reset_metrics()
{ {
std::lock_guard<std::mutex> lock(metrics_mutex);
metrics = {}; metrics = {};
} }