[libvirt] [PATCH 35/38] gendispatch: Introduce @sparseflag for our calls

Michal Privoznik mprivozn at redhat.com
Thu Apr 13 13:31:43 UTC 2017


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 at 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 9862598..def88d4 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.10.2




More information about the libvir-list mailing list