$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(a)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);