[Spice-devel] [RFC PATCH spice-gtk] unsynced mm-time after migration
Yonit Halperin
yhalperi at redhat.com
Mon Apr 29 15:19:55 PDT 2013
Migration can occur between 2 spice-servers with different mm-times.
Then, the following cases can happen after migration completes:
(I refer to src/dst-time as the mm-times on the src/dst servers):
(case 1) Frames with time ~= dst-time arrive to the client before the
playback-channel updates the session's mm-time (i.e., the mm_time
of the session is still based on the src-time).
(a) If src-time < dst-time:
display_stream_schedule schedules the next rendering to
~(dst-time - src-time) milliseconds from now.
Since we assume monotonic mm_time, display_stream_schedule,
returns immediately when a rendering timeout
has already been set, and doesn't update the timeout,
even after the mm_time is updated.
When src-time << dst-time, a significant video frames loss will occur.
(b) If src-time > dst-time
Frames will be dropped till the mm-time will be updated.
(case 2) mm-time is synced with dst-time, but frames that were in the command
ring during migration still arrive (such frames hold src-time).
(a) If src-time < dst-time
The frames that hold src-time will be dropped, since their
mm_time < session-mm_time. But all the new frames that are generated in
the driver after migration, will be rendered appropriately.
(b) If src-time > dst-time
Similar consequences as in 1 (a)
case 2 is less likely, since it takes at least 20 frames till the dst-server re-identifies
the video stream and starts sending stream data
This race scenario is unique to migration. When a *new* client connection is established with a server,
the main channel INIT msg, contains the mm_time. All the data transfer in the other channels is started
only after the client's main channel received the INIT msg. In migration however, in order to avoid
additional delays, all the channels are connected independently.
The proposed patch for spice-gtk tests for case 1.a and case 2.b and handles them.
Other possible solutions I have in mind involves both spice-gtk and spice-server:
(1) (a) Change the migraion handshake between the client and the dest-server
(occurs before migration starts) to also include the dst mm-time.
This way, the client's session mm-time will be valid after migration.
(solves case 1.a)
(b) The dst-server should drop frames with mm-time > dst-mm-time (solves case 2.b)
(2)
(a) spice-gtk won't render video after migration, till the session-mm-time
is reset (solves case 1.a)
(b) The dst-server should drop frames with mm-time > dst-mm-time (solves case 2.b)
Obviously, these options require that both spice-gtk and spice-client will be new (
though (2) doesn't require protocol changes).
For video streams without audio, I will also send a patch that sends SPICE_MSG_MAIN_MULTI_MEDIA_TIME after migration
(unless solution (1) above is chosen).
Comments?
Yonit.
Yonit Halperin (1):
channel-display: protect video streaming from temporally unsynced
mm_time (migration related)
gtk/channel-display.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 101 insertions(+), 3 deletions(-)
--
1.8.1.4
More information about the Spice-devel
mailing list