From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:54025) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1StnZA-0000X8-Dh for qemu-devel@nongnu.org; Tue, 24 Jul 2012 18:26:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1StnZ9-0008Jo-0b for qemu-devel@nongnu.org; Tue, 24 Jul 2012 18:26:56 -0400 Received: from e31.co.us.ibm.com ([32.97.110.149]:59039) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1StnZ8-0008Jh-QN for qemu-devel@nongnu.org; Tue, 24 Jul 2012 18:26:54 -0400 Received: from /spool/local by e31.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 24 Jul 2012 16:26:54 -0600 Received: from d03relay03.boulder.ibm.com (d03relay03.boulder.ibm.com [9.17.195.228]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id 9F95E1FF001C for ; Tue, 24 Jul 2012 22:26:44 +0000 (WET) Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay03.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q6OMQkRa290410 for ; Tue, 24 Jul 2012 16:26:46 -0600 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q6OMQj3e000532 for ; Tue, 24 Jul 2012 16:26:45 -0600 From: Anthony Liguori In-Reply-To: <1343150454-4677-13-git-send-email-mdroth@linux.vnet.ibm.com> References: <1343150454-4677-1-git-send-email-mdroth@linux.vnet.ibm.com> <1343150454-4677-13-git-send-email-mdroth@linux.vnet.ibm.com> Date: Tue, 24 Jul 2012 17:26:43 -0500 Message-ID: <87pq7kkd7g.fsf@codemonkey.ws> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Subject: Re: [Qemu-devel] [PATCH 12/22] qom-fuse: workaround for truncated properties > 4096 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Michael Roth , qemu-devel@nongnu.org Cc: quintela@redhat.com, owasserm@redhat.com, yamahata@valinux.co.jp, pbonzini@redhat.com, akong@redhat.com, afaerber@suse.de Michael Roth 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 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 > --- > 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