Now, not all APIs are going to support sparse streams. To some it
makes no sense at all, e.g. virDomainOpenConsole() or
virDomainOpenChannel(). To others, we will need a special flag to
indicate that client wants to enable sparse streams. Instead of
having to write RPC dispatchers by hand we can just annotate in
our .x files that a certain flag to certain RPC call enables this
feature. For instance:
/**
* @generate: both
* @readstream: 1
* @sparseflag: VIR_SPARSE_STREAM
* @acl: storage_vol:data_read
*/
REMOTE_PROC_DOMAIN_SOME_API = XXX,
Therefore, whenever client calls virDomainSomeAPI(..,
VIR_SPARSE_STREAM); daemon will mark that down and send stream
skips when possible.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/rpc/gendispatch.pl | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
index 98625983a..def88d4f9 100755
--- a/src/rpc/gendispatch.pl
+++ b/src/rpc/gendispatch.pl
@@ -281,6 +281,13 @@ while (<PROTOCOL>) {
$calls{$name}->{streamflag} = "none";
}
+ if (exists $opts{sparseflag}) {
+ die "\@sparseflag requires stream" unless
$calls{$name}->{streamflag} ne "none";
+ $calls{$name}->{sparseflag} = $opts{sparseflag};
+ } else {
+ $calls{$name}->{sparseflag} = "none";
+ }
+
$calls{$name}->{acl} = $opts{acl};
$calls{$name}->{aclfilter} = $opts{aclfilter};
@@ -982,6 +989,11 @@ elsif ($mode eq "server") {
if ($call->{streamflag} ne "none") {
print " virStreamPtr st = NULL;\n";
print " daemonClientStreamPtr stream = NULL;\n";
+ if ($call->{sparseflag} ne "none") {
+ print " const bool sparse = args->flags &
$call->{sparseflag};\n"
+ } else {
+ print " const bool sparse = false;\n";
+ }
}
print "\n";
@@ -1024,7 +1036,7 @@ elsif ($mode eq "server") {
print " if (!(st = virStreamNew(priv->conn,
VIR_STREAM_NONBLOCK)))\n";
print " goto cleanup;\n";
print "\n";
- print " if (!(stream = daemonCreateClientStream(client, st,
remoteProgram, &msg->header, false)))\n";
+ print " if (!(stream = daemonCreateClientStream(client, st,
remoteProgram, &msg->header, sparse)))\n";
print " goto cleanup;\n";
print "\n";
}
@@ -1727,6 +1739,11 @@ elsif ($mode eq "client") {
if ($call->{streamflag} ne "none") {
print " virNetClientStreamPtr netst = NULL;\n";
+ if ($call->{sparseflag} ne "none") {
+ print " const bool sparse = flags &
$call->{sparseflag};\n"
+ } else {
+ print " const bool sparse = false;\n";
+ }
}
print "\n";
@@ -1738,7 +1755,7 @@ elsif ($mode eq "client") {
if ($call->{streamflag} ne "none") {
print "\n";
- print " if (!(netst = virNetClientStreamNew(st,
priv->remoteProgram, $call->{constname}, priv->counter, false)))\n";
+ print " if (!(netst = virNetClientStreamNew(st,
priv->remoteProgram, $call->{constname}, priv->counter, sparse)))\n";
print " goto done;\n";
print "\n";
print " if (virNetClientAddStream(priv->client, netst) < 0)
{\n";
--
2.13.0