[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 18/26] qom-fuse: workaround for truncated properties
From: |
Michael Roth |
Subject: |
[Qemu-devel] [PATCH 18/26] qom-fuse: workaround for truncated properties > 4096 |
Date: |
Thu, 18 Oct 2012 21:42:12 -0500 |
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.
Reviewed-by: Anthony Liguori <address@hidden>
Reviewed-by: Paolo Bonzini <address@hidden>
Signed-off-by: Michael Roth <address@hidden>
---
QMP/qom-fuse | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/QMP/qom-fuse b/QMP/qom-fuse
index b4a4eb3..bbad0de 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
- [Qemu-devel] [PATCH 08/26] qapi: add visitor interfaces for C arrays, (continued)
- [Qemu-devel] [PATCH 08/26] qapi: add visitor interfaces for C arrays, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 09/26] qapi: QmpOutputVisitor, implement array handling, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 10/26] qapi: QmpInputVisitor, implement array handling, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 11/26] qapi: QmpInputVisitor, don't re-allocate memory in start_struct, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 12/26] qapi: fix potential segfault for visit_type_size(), Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 13/26] qapi: ordereddict, add to_json() method, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 15/26] qapi: add open-coded visitor for struct tm types, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 14/26] qapi: qapi.py, make json parser more robust, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 17/26] qom-fuse: force single-threaded mode to avoid QMP races, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 19/26] module additions for schema registration, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 18/26] qom-fuse: workaround for truncated properties > 4096,
Michael Roth <=
- [Qemu-devel] [PATCH 16/26] qapi: Improve existing docs and document annotated QAPI types, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 21/26] qidl: add documentation, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 23/26] qidl: add C parser (based on QC parser), Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 22/26] qidl: add lexer library (based on QC parser), Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 20/26] qdev: move Property-related declarations to qdev-properties.h, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 24/26] qidl: add QAPI-based code generator, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 25/26] qidl: qidl.h, definitions for qidl annotations, Michael Roth, 2012/10/18
- [Qemu-devel] [PATCH 26/26] qidl: unit tests and build infrastructure, Michael Roth, 2012/10/18