Re: HTTP/3 server push: handling of lost PUSH_PROMISE

Kazuho Oku <kazuhooku@gmail.com> Wed, 28 July 2021 00:21 UTC

Return-Path: <kazuhooku@gmail.com>
X-Original-To: quic@ietfa.amsl.com
Delivered-To: quic@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id C2D573A12D9 for <quic@ietfa.amsl.com>; Tue, 27 Jul 2021 17:21:33 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.096
X-Spam-Level:
X-Spam-Status: No, score=-2.096 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=gmail.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id U7SUaJb7MNg5 for <quic@ietfa.amsl.com>; Tue, 27 Jul 2021 17:21:28 -0700 (PDT)
Received: from mail-ed1-x52e.google.com (mail-ed1-x52e.google.com [IPv6:2a00:1450:4864:20::52e]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 27BB43A12DA for <quic@ietf.org>; Tue, 27 Jul 2021 17:21:28 -0700 (PDT)
Received: by mail-ed1-x52e.google.com with SMTP id u12so833972eds.2 for <quic@ietf.org>; Tue, 27 Jul 2021 17:21:27 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=rz13fyV2KaBwD0hob6TJdo/sHYogst2HtApMIwBam5Y=; b=cyF03t2+SfTP3f7MXGfez9D4DwTaSUNm6LLOZ+exksZtpehCQf7qsw6KUmJ70N3CEf dta9mz8lIAlAOHf3sM49oghkd0STPFxObJNNT87GzttANPRlBOq8ej2oCDQa09dUFacN x7idjq+d0P+3seJW8g2DgXQlMWL9DHUXx2UQFA9RnsG/YaIqTX83mf255wCZ2Iyu3WAV G1eJ+5BhaXK7kJlEc1CCBAQYg5ByxOKazLz21kD8JOa8a/z8S45X1iM0NvfSiOdFVHlg BmB0J/VknZtoqbui33TA+tNAFEZpWTyL4x5C2nh39mVi97sawKnrCsggghTBMzeKGONE wXhw==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=rz13fyV2KaBwD0hob6TJdo/sHYogst2HtApMIwBam5Y=; b=IbFtIKu2MYJhOAaKBqNqTuqbsdFHAgh3Ct8swf2F1F0oDdQWzahYpjP2NImM3YAyIR xNZw5+E/6e9AZRBsucs3BgXNS3fhK9HdumOzMfjWvY4D1FY01gkVBHitF++Vhb+/wozy XeJVcfmZcPz7jeN6O0K60I7SHfxsXIgYBHZKvLRghG/FaBg8QfQQQKjXcsfbSSBXvl+X cZe+sIHCJHh6LEuj5lL37vm7rBdnEK/jHe7FN2/2rniIDy2Fkb7VLCLuVZLbwCnL5yEB X6+h3LaecVhti2fpWY755NW1wgvm61MzIiAsBdexMzJ/IOACzgtxcsV/ZaS5ct/0xr70 3BNg==
X-Gm-Message-State: AOAM5313Kl7Xi28rEy9Fr0piyuC8suFruJ2L/bMb+g7K7uXjENWQhgu3 ++c3n/lUQzMA9/k5EsNKBoSJXapbSqZGXoiCo9s=
X-Google-Smtp-Source: ABdhPJwHwdxWjX4T3usfZiX9mFAau2qk3PLT1oY6hoKGjjyIQLty8YmmPEzhp9pFdt9Heu370n+SOqrE8+ST5bs3vZI=
X-Received: by 2002:a05:6402:28f:: with SMTP id l15mr4092847edv.131.1627431686054; Tue, 27 Jul 2021 17:21:26 -0700 (PDT)
MIME-Version: 1.0
References: <CAPyZ6=+tCHNGYq0Za38-pju23_d_2wwXbWMgCbJK_Ou8mH3aKQ@mail.gmail.com> <72de8a9e-9f93-4bdc-8c2a-3f359beb94ac@www.fastmail.com> <CAPyZ6=+he3A0y_PtdDmUcG0vSgczPMqOwKLLY37ZUACpAz46kw@mail.gmail.com>
In-Reply-To: <CAPyZ6=+he3A0y_PtdDmUcG0vSgczPMqOwKLLY37ZUACpAz46kw@mail.gmail.com>
From: Kazuho Oku <kazuhooku@gmail.com>
Date: Wed, 28 Jul 2021 09:21:14 +0900
Message-ID: <CANatvzxG+Y+Zm5W3-d=_xUdUQMNX2No2CjMNNXBzrGkq245jxA@mail.gmail.com>
Subject: Re: HTTP/3 server push: handling of lost PUSH_PROMISE
To: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>
Cc: IETF QUIC WG <quic@ietf.org>
Content-Type: multipart/alternative; boundary="0000000000008b27a205c823f7d7"
Archived-At: <https://mailarchive.ietf.org/arch/msg/quic/zoDiBQ08Pp5AXODzXOjBrNbxksc>
X-BeenThere: quic@ietf.org
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Main mailing list of the IETF QUIC working group <quic.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/quic>, <mailto:quic-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/quic/>
List-Post: <mailto:quic@ietf.org>
List-Help: <mailto:quic-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/quic>, <mailto:quic-request@ietf.org?subject=subscribe>
X-List-Received-Date: Wed, 28 Jul 2021 00:21:34 -0000

Tatsuhiro, thank you for raising the issue.

I actually wonder if the example being provided is a tip of an iceberg - is
the problem related to FIN at all?

Let's consider the following pattern:

* client sends a request
* server starts sending response, alongside a PUSH_PROMISE
* in addition, server initiates a push stream and starts sending data
* server-sent packets carrying the PUSH_PROMISE frame are lost
* client decides to cancel the request and sends RESET_STREAM & STOP_SENDING
* server continues sending the contents of the push stream

I could well be missing some aspects of push, but to me, the problem looks
like the lack of delivery guarantee of PUSH_PROMISE frames.


2021年7月27日(火) 17:56 Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>:

> Hi,
>
> On Tue, Jul 27, 2021 at 3:31 PM Martin Thomson <mt@lowentropy.net> wrote:
>
>> This is a case where QUIC processing something doesn't imply HTTP/3
>> processing something.  QUIC read the data and "processed" it.  HTTP/3
>> decided not to handle it deliberately, and the PUSH_PROMISE fell between
>> the cracks.
>>
>> One "solution" is to insist that endpoints attempt to process streams for
>> this stuff if they decide to discard responses.  This is like how in HTTP/2
>> you still have to update the HPACK table after resetting a stream.  It's
>> awkward, but I think that it would work if data is available.  I don't
>> think that there is any case in which data is unavailable to the client but
>> the server doesn't receive STOP_SENDING.
>>
>>
> It is indeed awkward that QUIC stack has to pass stream data all the way
> to the end of the stream (or sees RESET_STREAM or closed) to HTTP/3 client
> even after it requested stopping reading.  And the HTTP/3 client has to
> process it just for PUSH_PROMISE.  Does any implementation do this?
>
> Sending STOP_SENDING alone is not enough.  As I wrote in the previous
> post, by the time STOP_SENDING is received by the HTTP/3 server, it has
> finished processing the pushed stream and forgets it.  I imagine that if
> QUIC stack provides BSD socket-like interface and HTTP/3 server writes all
> data and can clear the memory without waiting for an acknowledgement.
>
> Best regards,
> Tatsuhiro Tsujikawa
>
>
>> On Tue, Jul 27, 2021, at 13:01, Tatsuhiro Tsujikawa wrote:
>> > Hi,
>> >
>> > It looks like in certain conditions, client is unable to process pushed
>> > stream and leaves it in unprocessable state indefinitely.
>> >
>> > Consider that client opens bidi stream and server sends PUSH_PROMISE
>> > and completes the response body which is very short (just a single
>> packet
>> > or two).  For some reason, client has decided to stop reading
>> > response, but FIN is seen (data recvd state), and does not send
>> > STOP_SENDING because it is not required (RFC mentions that it has a
>> > little value to send STOP_SENDING in data recvd state and
>> > unnecessary).  Client discards all stream data without handing it over
>> > to application, so PUSH_PROMISE is not processed.  Client does not
>> > know the push ID.  Because STOP_SENDING is not sent, server has no
>> signal
>> > which indicates PUSH_PROMISE is not processed, and opens a pushed
>> > stream.  Client receives pushed stream, but unable to find the
>> > corresponding PUSH_PROMISE.  It holds pushed stream until it sees
>> > PUSH_PROMISE, but it never come.  This causes the pushed stream to be
>> held by
>> > client indefinitely.
>> >
>> > Even if client sends STOP_SENDING to the bidi stream, it might not
>> > work if server finishes sending stream data and a pushed stream and
>> > forgets them before receiving STOP_SENDING.
>> >
>> > Best regards,
>> > Tatsuhiro Tsujikawa
>>
>>

-- 
Kazuho Oku