qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <aliguori@us.ibm.com>
To: Michael Roth <mdroth@linux.vnet.ibm.com>, qemu-devel@nongnu.org
Cc: quintela@redhat.com, owasserm@redhat.com, yamahata@valinux.co.jp,
	pbonzini@redhat.com, akong@redhat.com, afaerber@suse.de
Subject: Re: [Qemu-devel] [PATCH 12/22] qom-fuse: workaround for truncated properties > 4096
Date: Tue, 24 Jul 2012 17:26:43 -0500	[thread overview]
Message-ID: <87pq7kkd7g.fsf@codemonkey.ws> (raw)
In-Reply-To: <1343150454-4677-13-git-send-email-mdroth@linux.vnet.ibm.com>

Michael Roth <mdroth@linux.vnet.ibm.com> writes:

I don't think this is the most correct solution but I think it's good
enough in practice so

Reviewed-by: Anthony Liguori <aliguori@us.ibm.com>

Regards,

Anthony Liguori

> We currently hard-code property size at 4096 for the purposes of
> getattr()/stat()/etc. For 'state' properties we can exceed this easily,
> leading to truncated responses.
>
> Instead, for a particular property, make it
> max(4096, most_recent_property_size * 2). This allows some
> head-room for properties that change size periodically (numbers,
> strings, state properties containing arrays, etc)
>
> Also, implement a simple property cache to avoid spinning on qom-get
> if an application reads beyond the actual size. This also allows us
> to use a snapshot of a single qom-get that persists across read()'s.
> Old Cache entries are evicted as soon as we attempt to read() from
> offset 0 again.
>
> Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> ---
>  QMP/qom-fuse |   24 +++++++++++++++++-------
>  1 file changed, 17 insertions(+), 7 deletions(-)
>
> diff --git a/QMP/qom-fuse b/QMP/qom-fuse
> index 5c6754a..bd43f29 100755
> --- a/QMP/qom-fuse
> +++ b/QMP/qom-fuse
> @@ -26,6 +26,7 @@ class QOMFS(Fuse):
>          self.qmp.connect()
>          self.ino_map = {}
>          self.ino_count = 1
> +        self.prop_cache = {}
>  
>      def get_ino(self, path):
>          if self.ino_map.has_key(path):
> @@ -67,12 +68,16 @@ class QOMFS(Fuse):
>          if not self.is_property(path):
>              return -ENOENT
>  
> -        path, prop = path.rsplit('/', 1)
> -        try:
> -            data = str(self.qmp.command('qom-get', path=path, property=prop))
> -            data += '\n' # make values shell friendly
> -        except:
> -            return -EPERM
> +        # avoid extra calls to qom-get by using cached value when offset > 0
> +        if offset == 0 or not self.prop_cache.has_key(path):
> +            directory, prop = path.rsplit('/', 1)
> +            try:
> +                resp = str(self.qmp.command('qom-get', path=directory, property=prop))
> +                self.prop_cache[path] = resp + '\n' # make values shell friendly
> +            except:
> +                return -EPERM
> +
> +        data = self.prop_cache[path]
>  
>          if offset > len(data):
>              return ''
> @@ -111,13 +116,18 @@ class QOMFS(Fuse):
>                                         0,
>                                         0))
>          elif self.is_property(path):
> +            directory, prop = path.rsplit('/', 1)
> +            try:
> +                resp = str(self.qmp.command('qom-get', path=directory, property=prop))
> +            except:
> +                return -ENOENT
>              value = posix.stat_result((0644 | stat.S_IFREG,
>                                         self.get_ino(path),
>                                         0,
>                                         1,
>                                         1000,
>                                         1000,
> -                                       4096,
> +                                       max(len(resp) * 2, 4096),
>                                         0,
>                                         0,
>                                         0))
> -- 
> 1.7.9.5

  reply	other threads:[~2012-07-24 22:26 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-24 17:20 [Qemu-devel] [RFC v2] Use QEMU IDL for device serialization/introspection Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 01/22] qapi: qapi-visit.py -> qapi_visit.py so we can import Michael Roth
2012-07-24 22:12   ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 02/22] qapi: qapi-types.py -> qapi_types.py Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 03/22] qapi: qapi-commands.py -> qapi_commands.py Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 04/22] qapi: qapi_visit.py, make code useable as module Michael Roth
2012-07-24 22:13   ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 05/22] qapi: qapi_visit.py, support arrays and complex qapi definitions Michael Roth
2012-07-24 22:16   ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 06/22] qapi: add visitor interfaces for arrays Michael Roth
2012-07-24 22:18   ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 07/22] qapi: qapi_visit.py, support generating static functions Michael Roth
2012-07-24 22:19   ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 08/22] qapi: qapi_visit.py, support for visiting non-pointer/embedded structs Michael Roth
2012-07-24 22:21   ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 09/22] qapi: QmpOutputVisitor, implement array handling Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 10/22] qapi: qapi.py, make json parser more robust Michael Roth
2012-07-24 22:23   ` Anthony Liguori
2012-07-24 22:59     ` Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 11/22] qapi: add open-coded visitor for struct tm types Michael Roth
2012-07-24 22:24   ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 12/22] qom-fuse: workaround for truncated properties > 4096 Michael Roth
2012-07-24 22:26   ` Anthony Liguori [this message]
2012-07-24 17:20 ` [Qemu-devel] [PATCH 13/22] module additions for schema registration Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 14/22] qdev: move Property-related declarations to qdev-properties.h Michael Roth
2012-07-24 22:28   ` Anthony Liguori
2012-07-24 17:20 ` [Qemu-devel] [PATCH 15/22] qidl: Add documentation Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 16/22] qidl: parser, initial import from qc.git Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 17/22] qidl: codegen, initial commit Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 18/22] qidl: qidl.h Michael Roth
2012-07-24 20:47   ` Blue Swirl
2012-07-25  0:30     ` Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 19/22] qidl: unit tests Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 20/22] qemu-timer: add visit_type_QEMUTimer Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 21/22] rtc: add QIDL annotations Michael Roth
2012-07-24 17:20 ` [Qemu-devel] [PATCH 22/22] cirrus_vga: " Michael Roth

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=87pq7kkd7g.fsf@codemonkey.ws \
    --to=aliguori@us.ibm.com \
    --cc=afaerber@suse.de \
    --cc=akong@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=owasserm@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=yamahata@valinux.co.jp \
    /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).