[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 13/20] qom-fuse: workaround for truncated properties
From: |
Michael Roth |
Subject: |
[Qemu-devel] [PATCH 13/20] qom-fuse: workaround for truncated properties > 4096 |
Date: |
Tue, 14 Aug 2012 11:27:19 -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>
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 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
- [Qemu-devel] [PATCH 03/20] qapi: qapi-commands.py -> qapi_commands.py, (continued)
- [Qemu-devel] [PATCH 03/20] qapi: qapi-commands.py -> qapi_commands.py, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 04/20] qapi: qapi_visit.py, make code useable as module, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 06/20] qapi: add visitor interfaces for C arrays, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 05/20] qapi: qapi_visit.py, support arrays and complex qapi definitions, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 07/20] qapi: qapi_visit.py, support generating static functions, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 08/20] qapi: qapi_visit.py, support for visiting non-pointer/embedded structs, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 09/20] qapi: QmpOutputVisitor, implement array handling, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 11/20] qapi: qapi.py, make json parser more robust, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 10/20] qapi: QmpInputVisitor, implement array handling, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 12/20] qapi: add open-coded visitor for struct tm types, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 13/20] qom-fuse: workaround for truncated properties > 4096,
Michael Roth <=
- [Qemu-devel] [PATCH 15/20] qdev: move Property-related declarations to qdev-properties.h, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 14/20] module additions for schema registration, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 17/20] qidl: parser, initial import from qc.git, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 19/20] qidl: qidl.h, definitions for qidl annotations, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 18/20] qidl: codegen, initial commit, Michael Roth, 2012/08/14
- [Qemu-devel] [PATCH 16/20] qidl: Add documentation, Michael Roth, 2012/08/14