Hi,

I was surprised that this wasn't working, but it turns out that there are
two "WriteScheduler"s: RandomWriteScheduler and PriorityWriteScheduler, and
both have the same problem but only one was fixed.
The default WriteScheduler is different for x/net and std, that is why you
observe a different behavior.

I've submitted two patches:

To fix the same bug in the PriorityWriteScheduler
https://go-review.googlesource.com/c/net/+/382014/

to use the same WriteScheduler by the default
https://go-review.googlesource.com/c/net/+/382015/1


On Sat, 29 Jan 2022 at 18:45, frankre...@gmail.com <frankrehwin...@gmail.com>
wrote:

> I've narrowed down the difference between the case where it fails to
> timeout and where it does timeout to whether the http2 ConfigureServer is
> manually called on the *http.Server. I had to export the
> http2ConfigureServer in h2_bundle.go to be able to call it from the std
> http package but when I did, the timeout was honored. Without it, the
> timeout on the http2 stream doesn't happen.
>
> I've updated the issue #49741 although it is closed so I don't know if
> anyone will see it.
>
> On Saturday, January 29, 2022 at 10:52:56 AM UTC-5 frankre...@gmail.com
> wrote:
>
>> Sorry. I misrepresented the problem. The issue was that the example
>> should print "wrote 4096, err http2: stream closed" after a second, having
>> filled the buffer with 64 64KiB writes first. Even with go1.17.6, it
>> doesn't do that. The 65th write is not timing out.
>>
>> But it does work if I use the recent golang.org/x/net.
>>
>> I see the http2 code is in h2_bundle.go and the cherry picked changes are
>> in fact there, in the go1.17.6 tagged checkout. So the cherry-pick
>> operation was done correctly. Maybe that cherry-pick was necessary but it
>> appears it isn't sufficient.
>>
>> To get the intended behavior, the timeout after a second of being hung, I
>> still have to require the golang.org/x/net from 20220127 and configure
>> the server with it
>>
>>     func main() {
>>         sv := httptest.NewUnstartedServer(http.HandlerFunc(handler))
>>         err := http2.ConfigureServer(sv.Config, &http2.Server{})
>>
>>         if err != nil {
>>             log.Fatal(err)
>>         }
>>         // defer sv.Close()
>>
>>         sv.EnableHTTP2 = true
>>         sv.Config.WriteTimeout = 1 * time.Second
>>         sv.StartTLS()
>>
>>         resp, err := sv.Client().Get(sv.URL + "/")
>>         if err != nil {
>>             log.Fatal(err)
>>         }
>>         defer resp.Body.Close()
>>
>>         select {} // block forever
>>     }
>>
>> My go.mod:
>>
>>     module main
>>
>>     go 1.17
>>
>>     require golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd
>>
>>     require golang.org/x/text v0.3.7 // indirect
>> On Friday, January 28, 2022 at 4:29:07 PM UTC-5 Ian Lance Taylor wrote:
>>
>>> On Fri, Jan 28, 2022 at 6:44 AM frankre...@gmail.com
>>> <frankre...@gmail.com> wrote:
>>> >
>>> > https://github.com/golang/go/issues/49741
>>> >
>>> > x/net/http2: http.Server.WriteTimeout does not fire if the http2
>>> stream's window is out of space. #49741
>>> >
>>> > The 1.17 back port issue:
>>> > x/net/http2: http.Server.WriteTimeout does not fire if the http2
>>> stream's window is out of space. [1.17 backport] #49921
>>> >
>>> > Loaded go1.17.6 on Mac and Linux machines. Saw the release notes say
>>> issue #49741 is cherry-picked as #49921. Looked at the issue and found a
>>> very concise hanging example and expected the example would no longer hang.
>>> But it hangs on both Mac and Linux.
>>> >
>>> > I admit to being confused by how the x/net/http2 source is being
>>> vendored. I did not find the source files in the go1.17.6 source tree
>>> created from the go1.17.6.tar.gz download.
>>>
>>> The x/net/http2 sources are bundled into the generated file
>>> net/http/h2_bundle.go.
>>>
>>>
>>> > Here's the example @davecheney provided:
>>>
>>> That program is always going to hang, because the main function never
>>> returns. I'm not sure what the buggy behavior is here.
>>>
>>> Ian
>>>
>> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/e07ab828-f8a1-4fca-8aa3-4f7205d058ean%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/e07ab828-f8a1-4fca-8aa3-4f7205d058ean%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CABhP%3Dtb508FM0JqWd1-3X54WomCEaJK7a3Wh9qAAZnf-GwGmvQ%40mail.gmail.com.

Reply via email to