[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH v2 26/32] 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>
---
 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 1003338..6675d22 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};
 
@@ -963,6 +970,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";
@@ -1005,7 +1017,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";
         }
@@ -1690,6 +1702,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";
@@ -1701,7 +1718,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.8.3


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]