[libvirt] [PATCH RFC 14/48] Track if stream is skippable

Michal Privoznik mprivozn at redhat.com
Wed Jun 22 14:43:31 UTC 2016


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 at 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 4e2aff8..6610196 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -5038,7 +5038,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 bd0b5d2..e07a245 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 e80ec58..9f084a1 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -5763,7 +5763,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) {
@@ -6688,7 +6689,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 8920395..fb83693 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 = prog;
     st->proc = proc;
     st->serial = serial;
+    st->skippable = skippable;
 
     virObjectRef(prog);
 
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.8.4




More information about the libvir-list mailing list