[Engine-devel] Weird behavior of multiple SetVmTicket query
Daniel Erez
derez at redhat.com
Thu Nov 21 12:18:42 UTC 2013
----- Original Message -----
> From: "Einav Cohen" <ecohen at redhat.com>
> To: "Livnat Peer" <lpeer at redhat.com>, "Eli Mesika" <emesika at redhat.com>, "Omer Frenkel" <ofrenkel at redhat.com>, "Doron
> Fediuck" <dfediuck at redhat.com>, "Oved Ourfalli" <ovedo at redhat.com>
> Cc: "engine-devel" <engine-devel at ovirt.org>
> Sent: Monday, November 18, 2013 11:19:23 PM
> Subject: Re: [Engine-devel] Weird behavior of multiple SetVmTicket query
>
> engine-core maintainers - this one is mainly for you - see below.
> the most important question (I think) is: Is there any reason
> to not introduced a "sync" flavor of RunMultipleActions (i.e.
> one that will return from the backend only when all actions have
> been completed, similarly to RunAction)?
There's a couple of years old patch exactly for that [1].
It should allow both synchronous and asynchronous multiple actions according to a flag.
Question is when do we want to use the synchronous flavor?
The reasoning behind the current implementation is to return a quick response
to the client, as executing multiple vdsm commands can potentially require a long wait.
Do we need to introduce a sync version just for VM console connection flow?
IIRC, the flow actually uses multiple calls to the singular form (RunAction)
rather than RunMultipleAction?
[1] http://gerrit.ovirt.org/#/c/3210/
>
> ----
> Thanks,
> Einav
>
> ----- Original Message -----
> > From: "Vojtech Szocs" <vszocs at redhat.com>
> > To: awels at redhat.com
> > Cc: "engine-devel" <engine-devel at ovirt.org>
> > Sent: Tuesday, November 12, 2013 6:40:18 AM
> > Subject: Re: [Engine-devel] Weird behavior of multiple SetVmTicket query
> >
> > Forwarding this email to engine-devel so that backend maintainers are aware
> > of this issue.
> >
> > Looking at the code:
> >
> > - MultipleActionsRunner#Execute first creates and "validates" all commands:
> >
> > A. the "for" block which iterates over getParameters()
> > 1-> validate correlation ID, if OK create and add command, otherwise
> > add
> > returnValue
> >
> > B the "if" block which tests getCommands().size()
> > 1-> if single command to execute, add its "canDoActionOnly"
> > returnValue,
> > which is returnValue with canDoAction but without actual result object
> > 2-> if multi commands to execute, execute chunks of max. 10 threads
> > (sequentially, ThreadPoolUtil.invokeAll returns after all threads
> > complete), same returnValue as above
> >
> > C. the "if" block which tests canRunActions
> > 1-> all commands are executed within SINGLE THREAD due to
> > ThreadPoolUtil.execute(Runnable), which is kind of weird comapred to
> > how returnValues are prepared (see B2)
> > 2-> when executing command, code DOES NOT CARE about its returnValue,
> > i.e. returnValue was already prepared (see B) and command execution
> > should just update it
> >
> > The problem (I think) is that C1 starts a different thread (to execute all
> > commands) and immediately returns, i.e. code doesn't wait for thread to
> > complete. This is why returnValues are observed on frontend as
> > inconsistent.
> >
> > Additionally, we're also mixing of two different things: canDoAction
> > processing and returnValues processing. IMHO this should be refactored to
> > make code easier to read.
> >
> > Changes done by Alex (patch attached):
> >
> > X1. returnValues changed to Collections.synchronizedList
> > -> this means all access to returnValues is now serial
> > -> iteration over synchronizedList should also be enclosed in
> > "synchronized (list)" block, so this:
> >
> > for (VdcReturnValueBase value : returnValues) ...
> >
> > should be this:
> >
> > synchronized (returnValues) { for (VdcReturnValueBase value :
> > returnValues) ... }
> >
> > X2. commented-out original command execution via
> > ThreadPoolUtil.execute(Runnable)
> > -> new RunCommands method invokes all commands each in separate thread
> > via ThreadPoolUtil.invokeAll
> > -> returnValues list is explicitly updated
> >
> > Guys, what do you think?
> >
> > Vojtech
> >
> >
> > ----- Original Message -----
> > > From: "Alexander Wels" <awels at redhat.com>
> > > To: "Frantisek Kobzik" <fkobzik at redhat.com>
> > > Cc: "Vojtech Szocs" <vszocs at redhat.com>
> > > Sent: Monday, November 11, 2013 9:19:08 PM
> > > Subject: Re: Weird behavior of multiple SetVmTicket query
> > >
> > > Hi,
> > >
> > > I did some debugging, and the problem is a race condition in the
> > > MultipleActions class. The whole class seems to have a lot of
> > > multi-threading
> > > issues but if I modify the code to wait for the results of the actions to
> > > return before returning the return value, everything works fine.
> > >
> > > I am attaching a patch that solves the issue at hand, but should not be
> > > considered a real patch. It is just to show the issue is in the back-end
> > > not
> > > the front-end code. The front-end code is just exposing an issue in the
> > > back-
> > > end
> > >
> > > Alexander
> > >
> > > On Monday, November 11, 2013 09:53:22 AM you wrote:
> > > > Ok, thank you very much!
> > > >
> > > > ----- Original Message -----
> > > > From: "Alexander Wels" <awels at redhat.com>
> > > > To: "Frantisek Kobzik" <fkobzik at redhat.com>
> > > > Sent: Monday, November 11, 2013 2:15:43 PM
> > > > Subject: Re: Weird behavior of multiple SetVmTicket query
> > > >
> > > > Frantisek,
> > > >
> > > > I had seen this before, let me test and fix it for you, it is very
> > > > likely
> > > > my
> > > > patch broke that.
> > > >
> > > > Alexander
> > > >
> > > > On Monday, November 11, 2013 03:43:19 AM you wrote:
> > > > > Hi Alex,
> > > > >
> > > > > recently I noticed problems with invoking console for multiple VMs
> > > > > (select
> > > > > more VMs in webadmin and then hit the console btn). I was sure it
> > > > > worked
> > > > > in
> > > > > past so i git-bisected the master branch and I discovered that this
> > > > > problem
> > > > > is apparently caused by patch [1]. For single vm console invocation
> > > > > it
> > > > > works fine, but for multiple VMs it doesn't.
> > > > >
> > > > > I did some closer investigation with a debugger and it seems that
> > > > > getSucceeded() on the return val of SetVmTicket command returns false
> > > > > in
> > > > > case of multiple execution despite the fact SetVmTicketCommand sets
> > > > > this
> > > > > value to true. I suppose there is some problem with propagation of
> > > > > command
> > > > > return value from BE to FE. The same goes for the encapsulated
> > > > > returnValue
> > > > > attribute (it contains value of the generated ticket). When invoking
> > > > > multiple consoles it is null (although it has been filled on
> > > > > backend).
> > > > > Weird.
> > > > >
> > > > > Tomas told me you did some optimizations for multiple command
> > > > > executions,
> > > > > do you know it might cause it? Please let me know if you have any
> > > > > idea...
> > > > >
> > > > > Cheers,
> > > > > F.
> > > > >
> > > > > [1]: http://gerrit.ovirt.org/#/c/17356/
> > >
> >
> > _______________________________________________
> > Engine-devel mailing list
> > Engine-devel at ovirt.org
> > http://lists.ovirt.org/mailman/listinfo/engine-devel
> >
> _______________________________________________
> Engine-devel mailing list
> Engine-devel at ovirt.org
> http://lists.ovirt.org/mailman/listinfo/engine-devel
>
More information about the Engine-devel
mailing list