[Spice-devel] [PATCH 0/2] RFC: handle startup race for monitors config
Jonathon Jongsma
jjongsma at redhat.com
Thu Apr 16 13:42:17 PDT 2015
On Thu, 2015-04-09 at 14:06 -0500, Jonathon Jongsma wrote:
> On Thu, 2015-04-02 at 11:15 -0500, Jonathon Jongsma wrote:
> > On Thu, 2015-04-02 at 16:42 +0200, Marc-André Lureau wrote:
> > >
> > > On Thu, Apr 2, 2015 at 4:36 PM, Jonathon Jongsma <jjongsma at redhat.com>
> > > wrote:
> > > That would be a pretty drastic change in behavior. So, no, I
> > > have not
> > > considered that. It would also open up a large can of worms.
> > > For
> > > example, what would happen if you re-configured the displays
> > > from within
> > > the guest control panel. What would you do then?
> > >
> > >
> > >
> > > I would eventually follow guest configuration, but I wouldn't send
> > > back a new configuration (no auto-resize).
> > >
> >
> >
> > So, I did a quick test where I used an un-modified spice-server and the
> > following diff to virt-viewer:
> >
> > ===================
> >
> > diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c
> > index 131a500..5f47d09 100644
> > --- a/src/virt-viewer-session.c
> > +++ b/src/virt-viewer-session.c
> > @@ -412,6 +412,13 @@ virt_viewer_session_on_monitor_geometry_changed(VirtViewerSession* self,
> > if (!klass->apply_monitor_geometry)
> > return;
> >
> > + /* don't send monitor resize if we're in auto-conf fullscreen mode...*/
> > + if (virt_viewer_app_get_fullscreen(self->priv->app)) {
> > + g_debug("%s: not sending new monitors config because app is in fullscreen mode", G_STRFUNC);
> > + return;
> > + }
> > + g_debug("%s: sending", G_STRFUNC);
> > +
> > /* find highest monitor ID so we can create the sparse array */
> > for (l = self->priv->displays; l; l = l->next) {
> > VirtViewerDisplay *d = VIRT_VIEWER_DISPLAY(l->data);
> >
> > ====================
> >
> >
> > This is basically what you suggest. While we're in auto-conf mode, it never
> > sends down monitor config changes, but it does respond to display updates from
> > the server. When the user exits fullscreen mode, it resumes auto-resize and
> > sends new monitor config messages to the server. It improved the situation, but
> > didn't fix it. Before applying this patch, when I started virt-viewer in
> > --full-screen mode, the extra display was left enabled about 25-50% of the
> > time. After this patch, it happens only about 10% of the time.
>
> So here's the current state of this investigation. Just to recap, this
> is (as far as I can tell) the source of the problem:
>
> [guest has 2 displays enabled]
> * main channel connects
> * client sends monitor config (only 1 display enabled) to server
> * server sends new monitor config to guest
> * display channel connects
> * display channel sends out monitor config message with old state
> (2 displays)
> * client receives monitor config and enables 2 display windows
> * guest finishes display configuration
> * display channel sends out monitor config message with new state
> (1 display)
> * second display on client becomes "unready" ("waiting for display
> 2...")
> * Some future re-allocation / etc causes the client to send down
> new monitor configuration, which re-enables the "unready" second
> display (see rhbz#868970 for why this happens and why it's very
> difficult to solve)
>
> There are two basic approaches that can be taken here. The first is the
> one that I originally proposed: handle it on the server side. The
> rationale for this approach is pretty straightforward: the server
> *knows* that it is sending out an invalid monitor configuration at
> startup (since it knows that it has already received a new monitor
> configuration from the client), and we should not send out wrong
> information knowingly. The change that I originally proposed is not
> particularly elegant, I'll admit. It does use a timeout to delay sending
> out our initial monitor configuration to give the guest a chance to
> reconfigure itself before we send the configuration. Obviously, if the
> guest takes longer to reconfigure displays than the timeout, we'll still
> see this issue. And a timeout inherently adds more chances for race
> conditions, etc. But in my testing (with host and client on different
> machines on a local network), I've never yet seen a failure with this
> patch applied.
>
> The second approach is to change the client so that it can handle the
> server sending us an old configuration followed immediately by a new
> configuration. However, this is not trivial, and everything I've tried
> so far to handle it has opened up new regressions in other areas that
> are hard to predict and require very extensive testing to even find.
> It's clear that the client sends out too many unnecessary monitor
> reconfiguration messages. But preventing the client from sending out
> these messages is risky; it's not always immediately clear which ones
> are unnecessary. One of Marc-Andre's proposed patches doing that
> introduced 2 new regressions (mentioned in other places in this thread).
> It also did not fully solve the bug, though it did reduce the frequency
> by half or so. But even if we could manage to prevent all unnecessary
> monitor configuration messages, we still have the issue of the extra
> display and what to do with it (again, see rhbz#868970 for a discussion
> on this issue). Marc-Andre had a promising suggestion that when we're in
> fullscreen mode, we should simply follow the display state of the server
> and never attempt to modify it from the client (after the very initial
> configuration message). He further suggested that we could simply close
> displays that were disabled by the server in this case to avoid that
> display getting re-enabled accidentally. Unfortunately, after
> prototyping this, I realized that displays in fullscreen mode will not
> be maintained through a reboot. For example, if you had virt-viewer
> fullscreen on two monitors and then rebooted the guest, one of the
> monitors would simply disappear during the reboot. So I don't really
> think that's a very workable solution (In fact, I think this is the very
> reason that we don't automatically close displays that the server
> indicates are disabled; see rhbz#868970).
>
> So, that's where I am. The server-side solution basically works but
> isn't very pretty. And I can't figure out a client-side solution that
> will work for all scenarios. I'd really appreciate additional ideas or
> comments.
>
> Jonathon
So, I've got another potential solution for this issue that's entirely
done on the client side. See this thread on virt-tools-list:
https://www.redhat.com/archives/virt-tools-list/2015-April/msg00128.html
Comments appreciated, but should probably be sent to virt-tools-list.
Jonathon
More information about the Spice-devel
mailing list