From 3a9e1bab62717d0e6e3e34c1db8bdb7f3f62cd42 Mon Sep 17 00:00:00 2001 From: mmukhi Date: Mon, 12 Mar 2018 09:09:31 -0700 Subject: [PATCH] Reset ping strike counter right before sending out data. (#1905) Eliminate race which causes a ping to be scheduled between pingStrike counter being reset and data being scheduled. --- transport/http2_server.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/transport/http2_server.go b/transport/http2_server.go index 24c2c7e18c48..eb73b722a9fd 100644 --- a/transport/http2_server.go +++ b/transport/http2_server.go @@ -896,9 +896,6 @@ func (t *http2Server) Write(s *Stream, hdr []byte, data []byte, opts *Options) e // ltq is only a soft limit. streamQuota -= size p := r[:size] - // Reset ping strikes when sending data since this might cause - // the peer to send ping. - atomic.StoreUint32(&t.resetPingStrikes, 1) success := func() { ltq := ltq t.controlBuf.put(&dataFrame{streamID: s.id, endStream: false, d: p, f: func() { @@ -1013,6 +1010,9 @@ var goAwayPing = &ping{data: [8]byte{1, 6, 1, 8, 0, 3, 3, 9}} func (t *http2Server) itemHandler(i item) error { switch i := i.(type) { case *dataFrame: + // Reset ping strikes when sending data since this might cause + // the peer to send ping. + atomic.StoreUint32(&t.resetPingStrikes, 1) if err := t.framer.fr.WriteData(i.streamID, i.endStream, i.d); err != nil { return err }