1
0

Add new flag to daemonCreateClientStream and virNetClientStreamNew

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>
This commit is contained in:
Michal Privoznik 2016-04-11 16:50:04 +02:00
parent 8b6ffe4077
commit 5f4f9d87a9
7 changed files with 21 additions and 9 deletions

View File

@ -5323,7 +5323,7 @@ remoteDispatchDomainMigratePrepareTunnel3Params(virNetServerPtr server ATTRIBUTE
if (!(st = virStreamNew(priv->conn, VIR_STREAM_NONBLOCK)) || if (!(st = virStreamNew(priv->conn, VIR_STREAM_NONBLOCK)) ||
!(stream = daemonCreateClientStream(client, st, remoteProgram, !(stream = daemonCreateClientStream(client, st, remoteProgram,
&msg->header))) &msg->header, false)))
goto cleanup; goto cleanup;
if (virDomainMigratePrepareTunnel3Params(priv->conn, st, params, nparams, if (virDomainMigratePrepareTunnel3Params(priv->conn, st, params, nparams,

View File

@ -52,6 +52,8 @@ struct daemonClientStream {
virNetMessagePtr rx; virNetMessagePtr rx;
bool tx; bool tx;
bool allowSkip;
daemonClientStreamPtr next; daemonClientStreamPtr next;
}; };
@ -321,7 +323,8 @@ daemonClientStream *
daemonCreateClientStream(virNetServerClientPtr client, daemonCreateClientStream(virNetServerClientPtr client,
virStreamPtr st, virStreamPtr st,
virNetServerProgramPtr prog, virNetServerProgramPtr prog,
virNetMessageHeaderPtr header) virNetMessageHeaderPtr header,
bool allowSkip)
{ {
daemonClientStream *stream; daemonClientStream *stream;
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client); daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
@ -339,6 +342,7 @@ daemonCreateClientStream(virNetServerClientPtr client,
stream->serial = header->serial; stream->serial = header->serial;
stream->filterID = -1; stream->filterID = -1;
stream->st = st; stream->st = st;
stream->allowSkip = allowSkip;
return stream; return stream;
} }

View File

@ -30,7 +30,8 @@ daemonClientStream *
daemonCreateClientStream(virNetServerClientPtr client, daemonCreateClientStream(virNetServerClientPtr client,
virStreamPtr st, virStreamPtr st,
virNetServerProgramPtr prog, virNetServerProgramPtr prog,
virNetMessageHeaderPtr hdr); virNetMessageHeaderPtr hdr,
bool allowSkip);
int daemonFreeClientStream(virNetServerClientPtr client, int daemonFreeClientStream(virNetServerClientPtr client,
daemonClientStream *stream); daemonClientStream *stream);

View File

@ -6173,7 +6173,8 @@ remoteDomainMigratePrepareTunnel3(virConnectPtr dconn,
if (!(netst = virNetClientStreamNew(st, if (!(netst = virNetClientStreamNew(st,
priv->remoteProgram, priv->remoteProgram,
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3, REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3,
priv->counter))) priv->counter,
false)))
goto done; goto done;
if (virNetClientAddStream(priv->client, netst) < 0) { if (virNetClientAddStream(priv->client, netst) < 0) {
@ -7098,7 +7099,8 @@ remoteDomainMigratePrepareTunnel3Params(virConnectPtr dconn,
if (!(netst = virNetClientStreamNew(st, if (!(netst = virNetClientStreamNew(st,
priv->remoteProgram, priv->remoteProgram,
REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3_PARAMS, REMOTE_PROC_DOMAIN_MIGRATE_PREPARE_TUNNEL3_PARAMS,
priv->counter))) priv->counter,
false)))
goto cleanup; goto cleanup;
if (virNetClientAddStream(priv->client, netst) < 0) { if (virNetClientAddStream(priv->client, netst) < 0) {

View File

@ -1024,7 +1024,7 @@ elsif ($mode eq "server") {
print " if (!(st = virStreamNew(priv->conn, VIR_STREAM_NONBLOCK)))\n"; print " if (!(st = virStreamNew(priv->conn, VIR_STREAM_NONBLOCK)))\n";
print " goto cleanup;\n"; print " goto cleanup;\n";
print "\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 " goto cleanup;\n";
print "\n"; print "\n";
} }
@ -1738,7 +1738,7 @@ elsif ($mode eq "client") {
if ($call->{streamflag} ne "none") { if ($call->{streamflag} ne "none") {
print "\n"; 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 " goto done;\n";
print "\n"; print "\n";
print " if (virNetClientAddStream(priv->client, netst) < 0) {\n"; print " if (virNetClientAddStream(priv->client, netst) < 0) {\n";

View File

@ -54,6 +54,8 @@ struct _virNetClientStream {
virNetMessagePtr rx; virNetMessagePtr rx;
bool incomingEOF; bool incomingEOF;
bool allowSkip;
virNetClientStreamEventCallback cb; virNetClientStreamEventCallback cb;
void *cbOpaque; void *cbOpaque;
virFreeCallback cbFree; virFreeCallback cbFree;
@ -138,7 +140,8 @@ virNetClientStreamEventTimer(int timer ATTRIBUTE_UNUSED, void *opaque)
virNetClientStreamPtr virNetClientStreamNew(virStreamPtr stream, virNetClientStreamPtr virNetClientStreamNew(virStreamPtr stream,
virNetClientProgramPtr prog, virNetClientProgramPtr prog,
int proc, int proc,
unsigned serial) unsigned serial,
bool allowSkip)
{ {
virNetClientStreamPtr st; virNetClientStreamPtr st;
@ -152,6 +155,7 @@ virNetClientStreamPtr virNetClientStreamNew(virStreamPtr stream,
st->prog = virObjectRef(prog); st->prog = virObjectRef(prog);
st->proc = proc; st->proc = proc;
st->serial = serial; st->serial = serial;
st->allowSkip = allowSkip;
return st; return st;
} }

View File

@ -35,7 +35,8 @@ typedef void (*virNetClientStreamEventCallback)(virNetClientStreamPtr stream,
virNetClientStreamPtr virNetClientStreamNew(virStreamPtr stream, virNetClientStreamPtr virNetClientStreamNew(virStreamPtr stream,
virNetClientProgramPtr prog, virNetClientProgramPtr prog,
int proc, int proc,
unsigned serial); unsigned serial,
bool allowSkip);
bool virNetClientStreamRaiseError(virNetClientStreamPtr st); bool virNetClientStreamRaiseError(virNetClientStreamPtr st);