Skip to content

rtpmanager/rtsession: race conditions leading to critical warnings

While testing the implementation for insertable streams in webrtcsink & webrtcsrc, I encountered critical warnings, which turned out to result from two race conditions in rtpsession. Both race conditions produce:

GLib-CRITICAL: g_hash_table_foreach: assertion 'version == hash_table->version' failed

This commit fixes one of the race conditions observed.

In its simplest form, the test consists in 2 pipelines and a Signalling server:

  • pipelines_sink: audiotestsrc ! webrtcsink
  • pipelines_src: webrtcsrc ! appsrc
  1. Set pipelines_sink to Playing.
  2. The Signalling server delivers the producer_id.
  3. Initialize pipelines_src to establish a session with producer_id.
  4. Set pipelines_src to Playing.
  5. Wait for a buffer to be received by the appsrc.
  6. Set pipelines_src to Null.
  7. Set pipelines_sink to Null.

The race condition happens in the following sequence:

  • webrtcsink runs a task to periodically retrieve statistics from webrtcbin. This transitively ends up executing rtp_session_create_stats.
  • pipelines_sink is set to Null.
  • In Paused to Ready, gst_rtp_session_change_state() calls rtp_session_reset().
  • The assertion failure occurs when rtp_session_reset is called while rtp_session_create_stats is executing.

This is because rtp_session_create_stats acquires the lock on session prior to calling g_hash_table_foreach, but rtp_session_reset doesn't acquire the lock before calling g_hash_table_remove_all.

Acquiring the lock in rtp_session_reset fixes the issue.

Related to: #2536 (closed)

Edited by François Laignel

Merge request reports