[libvirt] [PATCH v3 24/31] virNetClientStream: Wire up VIR_NET_STREAM_HOLE

John Ferlan jferlan at redhat.com
Wed May 17 13:08:30 UTC 2017



On 05/16/2017 10:04 AM, Michal Privoznik wrote:
> Whenever server sends a client stream packet (either regular with
> actual data or stream skip one) it is queued on @st->rx. So the
> list is a mixture of both types of stream packets. So now that we
> have all the helpers needed we can wire their processing up. But
> since virNetClientStreamRecvPacket doesn't support
> VIR_STREAM_RECV_STOP_AT_HOLE flag yet, let's turn all received
> skips into zeroes repeating requested times.
> 
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/rpc/virnetclientstream.c | 45 ++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 43 insertions(+), 2 deletions(-)
> 
> diff --git a/src/rpc/virnetclientstream.c b/src/rpc/virnetclientstream.c
> index bf3922cb5..75ec3f57f 100644
> --- a/src/rpc/virnetclientstream.c
> +++ b/src/rpc/virnetclientstream.c
> @@ -295,6 +295,8 @@ int virNetClientStreamQueuePacket(virNetClientStreamPtr st,
>  
>      virObjectLock(st);
>  
> +    /* Don't distinguish VIR_NET_STREAM and VIR_NET_STREAM_SKIP
> +     * here just yet. We want in order processing! */
>      virNetMessageQueuePush(&st->rx, tmp_msg);
>  
>      virNetClientStreamEventTimerUpdate(st);
> @@ -390,7 +392,7 @@ virNetClientStreamSetHole(virNetClientStreamPtr st,
>   * Returns: 0 on success,
>   *          -1 otherwise.
>   */
> -static int ATTRIBUTE_UNUSED
> +static int
>  virNetClientStreamHandleHole(virNetClientPtr client,
>                               virNetClientStreamPtr st)
>  {
> @@ -468,6 +470,8 @@ int virNetClientStreamRecvPacket(virNetClientStreamPtr st,
>      virCheckFlags(0, -1);
>  
>      virObjectLock(st);
> +
> + reread:
>      if (!st->rx && !st->incomingEOF) {
>          virNetMessagePtr msg;
>          int ret;
> @@ -499,8 +503,45 @@ int virNetClientStreamRecvPacket(virNetClientStreamPtr st,
>      }
>  
>      VIR_DEBUG("After IO rx=%p", st->rx);
> +
> +    if (st->rx &&
> +        st->rx->header.type == VIR_NET_STREAM_HOLE &&
> +        st->holeLength == 0) {

Of course this is what I was referring to in patch 19... The only way to
call virNetClientStreamHandleHole is if holeLength = 0, but since all
the other validity checks (e.g. st->rx/msg and msg->header.type == HOLE)
are present - what's one more later on...   Your call you could also
modify patch 19 to not have any extraneous checks that wouldn't be
possible given the above lines...  Your call, IDC.


> +        /* Handle skip sent to us by server. */
> +
> +        if (virNetClientStreamHandleHole(client, st) < 0)
> +            goto cleanup;
> +    }
> +
> +    if (!st->rx && !st->incomingEOF && !st->holeLength) {

holeLength == 0

Reviewed-by: John Ferlan <jferlan at redhat.com>

John

> +        if (nonblock) {
> +            VIR_DEBUG("Non-blocking mode and no data available");
> +            rv = -2;
> +            goto cleanup;
> +        }
> +
> +        /* We have consumed all packets from incoming queue but those
> +         * were only skip packets, no data. Read the stream again. */
> +        goto reread;
> +    }
> +
>      want = nbytes;
> -    while (want && st->rx) {
> +
> +    if (st->holeLength) {
> +        /* Pretend holeLength zeroes was read from stream. */
> +        size_t len = want;
> +
> +        if (len > st->holeLength)
> +            len = st->holeLength;
> +
> +        memset(data, 0, len);
> +        st->holeLength -= len;
> +        want -= len;
> +    }
> +
> +    while (want &&
> +           st->rx &&
> +           st->rx->header.type == VIR_NET_STREAM) {
>          virNetMessagePtr msg = st->rx;
>          size_t len = want;
>  
> 




More information about the libvir-list mailing list