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
- Set
pipelines_sink
toPlaying
. - The Signalling server delivers the
producer_id
. - Initialize
pipelines_src
to establish a session withproducer_id
. - Set
pipelines_src
toPlaying
. - Wait for a buffer to be received by the
appsrc
. - Set
pipelines_src
toNull
. - Set
pipelines_sink
toNull
.
The race condition happens in the following sequence:
-
webrtcsink
runs a task to periodically retrieve statistics fromwebrtcbin
. This transitively ends up executingrtp_session_create_stats
. -
pipelines_sink
is set toNull
. - In
Paused
toReady
,gst_rtp_session_change_state()
callsrtp_session_reset()
. - The assertion failure occurs when
rtp_session_reset
is called whilertp_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)