gendispatch: Introduce @sparseflag for our calls

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@redhat.com>
This commit is contained in:
Michal Privoznik 2016-04-12 15:17:30 +02:00
parent 895479647b
commit 8f08f28f74

View File

@ -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";