[libvirt] [PATCH v2 18/38] Track if stream is skippable

Michal Privoznik posted 38 patches 8 years, 9 months ago
There is a newer version of this series
[libvirt] [PATCH v2 18/38] Track if stream is skippable
Posted by Michal Privoznik 8 years, 9 months ago
Even though there's no way to make stream skippable right now,
it is going to be soon. We need to track this info so that we
don't send virStreamSkip to a client that did not want it or vice
versa.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
 daemon/remote.c              | 2 +-
 daemon/stream.c              | 6 +++++-
 daemon/stream.h              | 3 ++-
 src/remote/remote_driver.c   | 6 ++++--
 src/rpc/gendispatch.pl       | 4 ++--
 src/rpc/virnetclientstream.c | 6 +++++-
 src/rpc/virnetclientstream.h | 3 ++-
 7 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/daemon/remote.c b/daemon/remote.c
index 1610fea..fbd5ba2 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -5373,7 +5373,7 @@ remoteDispatchDomainMigratePrepareTunnel3Params(virNetServerPtr server ATTRIBUTE
 
     if (!(st = virStreamNew(priv->conn, VIR_STREAM_NONBLOCK)) ||
         !(stream = daemonCreateClientStream(client, st, remoteProgram,
-                                            &msg->header)))
+                                            &msg->header, false)))
         goto cleanup;
 
     if (virDomainMigratePrepareTunnel3Params(priv->conn, st, params, nparams,
diff --git a/daemon/stream.c b/daemon/stream.c
index 11c0a46..624a626 100644
--- a/daemon/stream.c
+++ b/daemon/stream.c
@@ -52,6 +52,8 @@ struct daemonClientStream {
     virNetMessagePtr rx;
     bool tx;
 
+    bool skippable;
+
     daemonClientStreamPtr next;
 };
 
@@ -321,7 +323,8 @@ daemonClientStream *
 daemonCreateClientStream(virNetServerClientPtr client,
                          virStreamPtr st,
                          virNetServerProgramPtr prog,
-                         virNetMessageHeaderPtr header)
+                         virNetMessageHeaderPtr header,
+                         bool skippable)
 {
     daemonClientStream *stream;
     daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
@@ -339,6 +342,7 @@ daemonCreateClientStream(virNetServerClientPtr client,
     stream->serial = header->serial;
     stream->filterID = -1;
     stream->st = st;
+    stream->skippable = skippable;
 
     return stream;
 }
diff --git a/daemon/stream.h b/daemon/stream.h
index cf76e71..bf5dc24 100644
--- a/daemon/stream.h
+++ b/daemon/stream.h
@@ -30,7 +30,8 @@ daemonClientStream *
 daemonCreateClientStream(virNetServerClientPtr client,
                          virStreamPtr st,
                          virNetServerProgramPtr prog,
-                         virNetMessageHeaderPtr hdr);
+                         virNetMessageHeaderPtr hdr,
+                         bool seekable);
 
 int daemonFreeClientStream(virNetServerClientPtr client,
                            daemonClientStream *stream);
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 7024464..6a2c6f6 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -6173,7 +6173,8 @@ remoteDomainMigratePrepareTunnel3(virConnectPtr dconn,
     if (!(netst = virNetClientStreamNew(st,
                                         priv->remoteProgram,
                                         REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3,
-                                        priv->counter)))
+                                        priv->counter,
+                                        false)))
         goto done;
 
     if (virNetClientAddStream(priv->client, netst) < 0) {
@@ -7098,7 +7099,8 @@ remoteDomainMigratePrepareTunnel3Params(virConnectPtr dconn,
     if (!(netst = virNetClientStreamNew(st,
                                         priv->remoteProgram,
                                         REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3_PARAMS,
-                                        priv->counter)))
+                                        priv->counter,
+                                        false)))
         goto cleanup;
 
     if (virNetClientAddStream(priv->client, netst) < 0) {
diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
index e608812..9862598 100755
--- a/src/rpc/gendispatch.pl
+++ b/src/rpc/gendispatch.pl
@@ -1024,7 +1024,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)))\n";
+            print "    if (!(stream = daemonCreateClientStream(client, st, remoteProgram, &msg->header, false)))\n";
             print "        goto cleanup;\n";
             print "\n";
         }
@@ -1738,7 +1738,7 @@ elsif ($mode eq "client") {
 
         if ($call->{streamflag} ne "none") {
             print "\n";
-            print "    if (!(netst = virNetClientStreamNew(st, priv->remoteProgram, $call->{constname}, priv->counter)))\n";
+            print "    if (!(netst = virNetClientStreamNew(st, priv->remoteProgram, $call->{constname}, priv->counter, false)))\n";
             print "        goto done;\n";
             print "\n";
             print "    if (virNetClientAddStream(priv->client, netst) < 0) {\n";
diff --git a/src/rpc/virnetclientstream.c b/src/rpc/virnetclientstream.c
index 01761cf..42619bf 100644
--- a/src/rpc/virnetclientstream.c
+++ b/src/rpc/virnetclientstream.c
@@ -54,6 +54,8 @@ struct _virNetClientStream {
     virNetMessagePtr rx;
     bool incomingEOF;
 
+    bool skippable; /* User requested skippable stream */
+
     virNetClientStreamEventCallback cb;
     void *cbOpaque;
     virFreeCallback cbFree;
@@ -138,7 +140,8 @@ virNetClientStreamEventTimer(int timer ATTRIBUTE_UNUSED, void *opaque)
 virNetClientStreamPtr virNetClientStreamNew(virStreamPtr stream,
                                             virNetClientProgramPtr prog,
                                             int proc,
-                                            unsigned serial)
+                                            unsigned serial,
+                                            bool skippable)
 {
     virNetClientStreamPtr st;
 
@@ -152,6 +155,7 @@ virNetClientStreamPtr virNetClientStreamNew(virStreamPtr stream,
     st->prog = virObjectRef(prog);
     st->proc = proc;
     st->serial = serial;
+    st->skippable = skippable;
 
     return st;
 }
diff --git a/src/rpc/virnetclientstream.h b/src/rpc/virnetclientstream.h
index e278dab..0a5aafd 100644
--- a/src/rpc/virnetclientstream.h
+++ b/src/rpc/virnetclientstream.h
@@ -35,7 +35,8 @@ typedef void (*virNetClientStreamEventCallback)(virNetClientStreamPtr stream,
 virNetClientStreamPtr virNetClientStreamNew(virStreamPtr stream,
                                             virNetClientProgramPtr prog,
                                             int proc,
-                                            unsigned serial);
+                                            unsigned serial,
+                                            bool seekable);
 
 bool virNetClientStreamRaiseError(virNetClientStreamPtr st);
 
-- 
2.10.2

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 18/38] Track if stream is skippable
Posted by John Ferlan 8 years, 9 months ago
$subj:

Add new flag to daemonCreateClientStream and virNetClientStreamNew


FWIW:

Kind of a big hit, but neither skippable nor skipable passes muster with
spell check. How about using "allowSkip" for the name.

On 04/20/2017 06:01 AM, Michal Privoznik wrote:
> Even though there's no way to make stream skippable right now,
> it is going to be soon. We need to track this info so that we
> don't send virStreamSkip to a client that did not want it or vice
> versa.
> 

Consider:

Add a new argument to daemonCreateClientStream in order to allow for
future expansion to mark that a specific stream can be used to skip
data, such as the case with sparsely populated files. The new flag will
be the eventual decision point between client/server to decide whether
both ends can support and want to use sparse streams.

A new bool 'allowSkip' is added to both _virNetClientStream and
daemonClientStream in order to perform the tracking.


> Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
> ---
>  daemon/remote.c              | 2 +-
>  daemon/stream.c              | 6 +++++-
>  daemon/stream.h              | 3 ++-
>  src/remote/remote_driver.c   | 6 ++++--
>  src/rpc/gendispatch.pl       | 4 ++--
>  src/rpc/virnetclientstream.c | 6 +++++-
>  src/rpc/virnetclientstream.h | 3 ++-
>  7 files changed, 21 insertions(+), 9 deletions(-)
> 
> diff --git a/daemon/remote.c b/daemon/remote.c
> index 1610fea..fbd5ba2 100644
> --- a/daemon/remote.c
> +++ b/daemon/remote.c
> @@ -5373,7 +5373,7 @@ remoteDispatchDomainMigratePrepareTunnel3Params(virNetServerPtr server ATTRIBUTE
>  
>      if (!(st = virStreamNew(priv->conn, VIR_STREAM_NONBLOCK)) ||
>          !(stream = daemonCreateClientStream(client, st, remoteProgram,
> -                                            &msg->header)))
> +                                            &msg->header, false)))
>          goto cleanup;
>  
>      if (virDomainMigratePrepareTunnel3Params(priv->conn, st, params, nparams,
> diff --git a/daemon/stream.c b/daemon/stream.c
> index 11c0a46..624a626 100644
> --- a/daemon/stream.c
> +++ b/daemon/stream.c
> @@ -52,6 +52,8 @@ struct daemonClientStream {
>      virNetMessagePtr rx;
>      bool tx;
>  
> +    bool skippable;

s/skippable/allowSkip

> +
>      daemonClientStreamPtr next;
>  };
>  
> @@ -321,7 +323,8 @@ daemonClientStream *
>  daemonCreateClientStream(virNetServerClientPtr client,
>                           virStreamPtr st,
>                           virNetServerProgramPtr prog,
> -                         virNetMessageHeaderPtr header)
> +                         virNetMessageHeaderPtr header,
> +                         bool skippable)

name change

>  {
>      daemonClientStream *stream;
>      daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
> @@ -339,6 +342,7 @@ daemonCreateClientStream(virNetServerClientPtr client,
>      stream->serial = header->serial;
>      stream->filterID = -1;
>      stream->st = st;
> +    stream->skippable = skippable;
>  
>      return stream;
>  }
> diff --git a/daemon/stream.h b/daemon/stream.h
> index cf76e71..bf5dc24 100644
> --- a/daemon/stream.h
> +++ b/daemon/stream.h
> @@ -30,7 +30,8 @@ daemonClientStream *
>  daemonCreateClientStream(virNetServerClientPtr client,
>                           virStreamPtr st,
>                           virNetServerProgramPtr prog,
> -                         virNetMessageHeaderPtr hdr);
> +                         virNetMessageHeaderPtr hdr,
> +                         bool seekable);

seekable!  name change anyway.

>  
>  int daemonFreeClientStream(virNetServerClientPtr client,
>                             daemonClientStream *stream);
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index 7024464..6a2c6f6 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -6173,7 +6173,8 @@ remoteDomainMigratePrepareTunnel3(virConnectPtr dconn,
>      if (!(netst = virNetClientStreamNew(st,
>                                          priv->remoteProgram,
>                                          REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3,
> -                                        priv->counter)))
> +                                        priv->counter,
> +                                        false)))
>          goto done;
>  
>      if (virNetClientAddStream(priv->client, netst) < 0) {
> @@ -7098,7 +7099,8 @@ remoteDomainMigratePrepareTunnel3Params(virConnectPtr dconn,
>      if (!(netst = virNetClientStreamNew(st,
>                                          priv->remoteProgram,
>                                          REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3_PARAMS,
> -                                        priv->counter)))
> +                                        priv->counter,
> +                                        false)))
>          goto cleanup;
>  
>      if (virNetClientAddStream(priv->client, netst) < 0) {
> diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
> index e608812..9862598 100755
> --- a/src/rpc/gendispatch.pl
> +++ b/src/rpc/gendispatch.pl
> @@ -1024,7 +1024,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)))\n";
> +            print "    if (!(stream = daemonCreateClientStream(client, st, remoteProgram, &msg->header, false)))\n";
>              print "        goto cleanup;\n";
>              print "\n";
>          }
> @@ -1738,7 +1738,7 @@ elsif ($mode eq "client") {
>  
>          if ($call->{streamflag} ne "none") {
>              print "\n";
> -            print "    if (!(netst = virNetClientStreamNew(st, priv->remoteProgram, $call->{constname}, priv->counter)))\n";
> +            print "    if (!(netst = virNetClientStreamNew(st, priv->remoteProgram, $call->{constname}, priv->counter, false)))\n";
>              print "        goto done;\n";
>              print "\n";
>              print "    if (virNetClientAddStream(priv->client, netst) < 0) {\n";
> diff --git a/src/rpc/virnetclientstream.c b/src/rpc/virnetclientstream.c
> index 01761cf..42619bf 100644
> --- a/src/rpc/virnetclientstream.c
> +++ b/src/rpc/virnetclientstream.c
> @@ -54,6 +54,8 @@ struct _virNetClientStream {
>      virNetMessagePtr rx;
>      bool incomingEOF;
>  
> +    bool skippable; /* User requested skippable stream */
> +

s/skippable/allowSkip

Not sure comment is necessary...  It wasn't added to the other structure.

>      virNetClientStreamEventCallback cb;
>      void *cbOpaque;
>      virFreeCallback cbFree;
> @@ -138,7 +140,8 @@ virNetClientStreamEventTimer(int timer ATTRIBUTE_UNUSED, void *opaque)
>  virNetClientStreamPtr virNetClientStreamNew(virStreamPtr stream,
>                                              virNetClientProgramPtr prog,
>                                              int proc,
> -                                            unsigned serial)
> +                                            unsigned serial,
> +                                            bool skippable)

name change

>  {
>      virNetClientStreamPtr st;
>  
> @@ -152,6 +155,7 @@ virNetClientStreamPtr virNetClientStreamNew(virStreamPtr stream,
>      st->prog = virObjectRef(prog);
>      st->proc = proc;
>      st->serial = serial;
> +    st->skippable = skippable;
>  
>      return st;
>  }
> diff --git a/src/rpc/virnetclientstream.h b/src/rpc/virnetclientstream.h
> index e278dab..0a5aafd 100644
> --- a/src/rpc/virnetclientstream.h
> +++ b/src/rpc/virnetclientstream.h
> @@ -35,7 +35,8 @@ typedef void (*virNetClientStreamEventCallback)(virNetClientStreamPtr stream,
>  virNetClientStreamPtr virNetClientStreamNew(virStreamPtr stream,
>                                              virNetClientProgramPtr prog,
>                                              int proc,
> -                                            unsigned serial);
> +                                            unsigned serial,
> +                                            bool seekable);

"seekable"?  !!


ACK w/ name adjustment. This too seems separable.

John


>  
>  bool virNetClientStreamRaiseError(virNetClientStreamPtr st);
>  
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list