qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: qemu-devel@nongnu.org, "Paolo Bonzini" <pbonzini@redhat.com>,
	"Daniel P . Berrange" <berrange@redhat.com>,
	"Stefan Hajnoczi" <shajnocz@redhat.com>,
	"Fam Zheng" <famz@redhat.com>,
	"Juan Quintela" <quintela@redhat.com>,
	mdroth@linux.vnet.ibm.com, "Eric Blake" <eblake@redhat.com>,
	"Laurent Vivier" <lvivier@redhat.com>,
	"Marc-André Lureau" <marcandre.lureau@gmail.com>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Dr . David Alan Gilbert" <dgilbert@redhat.com>
Subject: Re: [Qemu-devel] [RFC v2 15/22] monitor: send event when request queue full
Date: Thu, 19 Oct 2017 15:16:11 +0800	[thread overview]
Message-ID: <20171019071611.GY4166@pxdev.xzpeter.org> (raw)
In-Reply-To: <20171018152804.GC31848@stefanha-x1.localdomain>

On Wed, Oct 18, 2017 at 05:28:04PM +0200, Stefan Hajnoczi wrote:
> On Mon, Oct 16, 2017 at 04:11:58PM +0800, Peter Xu wrote:
> > On Thu, Oct 12, 2017 at 01:56:20PM +0100, Stefan Hajnoczi wrote:
> > > On Fri, Sep 29, 2017 at 11:38:37AM +0800, Peter Xu wrote:
> > > > Set maximum QMP request queue length to 8.  If queue full, instead of
> > > > queue the command, we directly return a "request-dropped" event, telling
> > > > client that specific command is dropped.
> > > > 
> > > > Signed-off-by: Peter Xu <peterx@redhat.com>
> > > > ---
> > > >  monitor.c | 15 +++++++++++++++
> > > >  1 file changed, 15 insertions(+)
> > > > 
> > > > diff --git a/monitor.c b/monitor.c
> > > > index 1e9a6cb6a5..d9bed31248 100644
> > > > --- a/monitor.c
> > > > +++ b/monitor.c
> > > > @@ -3971,6 +3971,8 @@ static void monitor_qmp_bh_dispatcher(void *data)
> > > >      }
> > > >  }
> > > >  
> > > > +#define  QMP_ASYNC_QUEUE_LEN_MAX  (8)
> > > 
> > > Why 8?
> > 
> > I proposed this in previous discussion and no one objected, so I just
> > used it. It's here:
> > 
> >   https://lists.gnu.org/archive/html/qemu-devel/2017-09/msg03989.html
> >   (please don't go over the thread; I'll copy the related paragraphs)
> > 
> > """
> >   ...
> >   Regarding to queue size: I am afraid max_size=1 may not suffice?
> >   Otherwise a simple batch of:
> > 
> >   {"execute": "query-status"} {"execute": "query-status"}
> > 
> >   Will trigger the failure.  But I definitely agree it should not be
> >   something very large.  The total memory will be this:
> > 
> >     json limit * queue length limit * monitor count limit
> >         (X)            (Y)                    (Z)
> > 
> >   Now we have (X) already (in form of a few tunables for JSON token
> >   counts, etc.), we don't have (Z), and we definitely need (Y).
> > 
> >   How about we add limits on Y=16 and Z=8?
> > 
> >   We can do some math if we want some more exact number though.
> >   ...
> > """
> > 
> > Oops, I proposed "16", but I used "8"; I hope 8 is good enough, but I
> > am definitely not sure whether "1" is good.
> 
> I understand the concern about breaking existing clients but choosing an
> arbitrary magic number isn't a correct solution to that problem because
> existing clients may exceed the magic number!

I agree.

> 
> Instead I think QMP should only look ahead if the out-of-band feature
> has been negotatiated.  This way existing clients continue to work.  New
> clients will have to avoid sending a batch of requests or they must
> handle the queue size limit error.

Hmm yes I just noticed that although I broadcasted the "OOB"
capability but actually I skipped the negociation phase (so OOB is
always enabled). I think I should have that for sure.

IIUC below new handle_qmp_command() should be always compatible with
old clients then:

handle_qmp_command ()
{
  ...
  if (oob_enabled) {
    if (cmd_is_oob (req)) {
      // execute command
      qmp_dispatch (req);
      return;
    }
    if (queue_full (mon)) {
      // drop req
      send_full_event (mon);
      return;
    }
  }

  queue (req);
  kick (task);

  if (!oob_enabled) {
    // if oob not enabled, we don't process next request before previous
    // one finishes, and queue length will always be either 0 or 1.
    // Note: this means the parsing thread can block now.
    wait_until_req_handled (req);
  }
}

This will be somehow more complicated than before though, since if
with this, we need to make sure all the QMP clients have enabled OOB
feature to make sure OOB command can work. Otherwise even if only one
QMP client didn't enable OOB, then it may block at waiting for the
request to finish, and it will block the whole monitor IOThread as
well (which is currently shared by OOB and non-OOB monitors).

Or, maybe, I should just create one IOThread for each QMP monitor.

> 
> > For the naming: how about QMP_REQ_QUEUE_LEN_MAX?
> 
> Yes.

Thanks,

-- 
Peter Xu

  reply	other threads:[~2017-10-19  7:16 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-09-29  3:38 [Qemu-devel] [RFC v2 00/22] QMP: out-of-band (OOB) execution support Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 01/22] char-io: fix possible race on IOWatchPoll Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 02/22] qobject: introduce qstring_get_try_str() Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 03/22] qobject: introduce qobject_get_try_str() Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 04/22] qobject: let object_property_get_str() use new API Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 05/22] monitor: move skip_flush into monitor_data_init Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 06/22] qjson: add "opaque" field to JSONMessageParser Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 07/22] monitor: move the cur_mon hack deeper for QMP Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 08/22] monitor: unify global init Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 09/22] monitor: create monitor dedicate iothread Peter Xu
2017-10-12 12:29   ` Stefan Hajnoczi
2017-10-16  7:16     ` Peter Xu
2017-10-18 15:32       ` Stefan Hajnoczi
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 10/22] monitor: allow to use IO thread for parsing Peter Xu
2017-10-12 12:35   ` Stefan Hajnoczi
2017-10-16  7:37     ` Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 11/22] monitor: introduce monitor_qmp_respond() Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 12/22] monitor: let mon_list be tail queue Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 13/22] monitor: separate QMP parser and dispatcher Peter Xu
2017-10-12 12:50   ` Stefan Hajnoczi
2017-10-16  7:50     ` Peter Xu
2017-10-18 15:31       ` Stefan Hajnoczi
2017-10-19  6:36         ` Peter Xu
2017-10-19 13:13           ` Stefan Hajnoczi
2017-10-20  9:19             ` Paolo Bonzini
2017-10-23  6:07               ` Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 14/22] qmp: add new event "request-dropped" Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 15/22] monitor: send event when request queue full Peter Xu
2017-10-12 12:56   ` Stefan Hajnoczi
2017-10-16  8:11     ` Peter Xu
2017-10-18 15:28       ` Stefan Hajnoczi
2017-10-19  7:16         ` Peter Xu [this message]
2017-10-19 13:11           ` Stefan Hajnoczi
2017-10-20  4:26             ` Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 16/22] monitor: enable IO thread for (qmp & !mux) typed Peter Xu
2017-10-12 12:57   ` Stefan Hajnoczi
2017-10-16  8:16     ` Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 17/22] qapi: introduce new cmd option "allow-oob" Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 18/22] qmp: support out-of-band (oob) execution Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 19/22] qmp: let migrate-incoming allow out-of-band Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 20/22] qmp: isolate responses into io thread Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 21/22] qmp: introduce QMPCapability Peter Xu
2017-09-29  3:38 ` [Qemu-devel] [RFC v2 22/22] docs: update QMP documents for OOB commands Peter Xu
2017-09-29  3:58 ` [Qemu-devel] [RFC v2 00/22] QMP: out-of-band (OOB) execution support no-reply
2017-09-29  4:14   ` Peter Xu
2017-09-29 19:03     ` Eric Blake
2017-09-30  0:28       ` Peter Xu
2017-09-29  4:20 ` no-reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171019071611.GY4166@pxdev.xzpeter.org \
    --to=peterx@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=eblake@redhat.com \
    --cc=famz@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=marcandre.lureau@gmail.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=shajnocz@redhat.com \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).