@@ -21,6 +21,7 @@ package transport
2121import (
2222 "bytes"
2323 "context"
24+ "errors"
2425 "fmt"
2526 "io"
2627 "math"
@@ -293,7 +294,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport,
293294
294295 defer func () {
295296 if err != nil {
296- t .Close ()
297+ t .Close (err )
297298 }
298299 }()
299300
@@ -331,10 +332,9 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport,
331332 go func () {
332333 t .loopy = newLoopyWriter (serverSide , t .framer , t .controlBuf , t .bdpEst )
333334 t .loopy .ssGoAwayHandler = t .outgoingGoAwayHandler
334- if err := t .loopy .run (); err != nil {
335- if logger .V (logLevel ) {
336- logger .Errorf ("transport: loopyWriter.run returning. Err: %v" , err )
337- }
335+ err := t .loopy .run ()
336+ if logger .V (logLevel ) {
337+ logger .Infof ("transport: loopyWriter exited. Closing connection. Err: %v" , err )
338338 }
339339 t .conn .Close ()
340340 t .controlBuf .finish ()
@@ -344,8 +344,9 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport,
344344 return t , nil
345345}
346346
347- // operateHeader takes action on the decoded headers.
348- func (t * http2Server ) operateHeaders (frame * http2.MetaHeadersFrame , handle func (* Stream ), traceCtx func (context.Context , string ) context.Context ) (fatal bool ) {
347+ // operateHeaders takes action on the decoded headers. Returns an error if fatal
348+ // error encountered and transport needs to close, otherwise returns nil.
349+ func (t * http2Server ) operateHeaders (frame * http2.MetaHeadersFrame , handle func (* Stream ), traceCtx func (context.Context , string ) context.Context ) error {
349350 // Acquire max stream ID lock for entire duration
350351 t .maxStreamMu .Lock ()
351352 defer t .maxStreamMu .Unlock ()
@@ -361,15 +362,12 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
361362 rstCode : http2 .ErrCodeFrameSize ,
362363 onWrite : func () {},
363364 })
364- return false
365+ return nil
365366 }
366367
367368 if streamID % 2 != 1 || streamID <= t .maxStreamID {
368369 // illegal gRPC stream id.
369- if logger .V (logLevel ) {
370- logger .Errorf ("transport: http2Server.HandleStreams received an illegal stream id: %v" , streamID )
371- }
372- return true
370+ return fmt .Errorf ("received an illegal stream id: %v. headers frame: %+v" , streamID , frame )
373371 }
374372 t .maxStreamID = streamID
375373
@@ -453,7 +451,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
453451 status : status .New (codes .Internal , errMsg ),
454452 rst : ! frame .StreamEnded (),
455453 })
456- return false
454+ return nil
457455 }
458456
459457 if ! isGRPC || headerError {
@@ -463,7 +461,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
463461 rstCode : http2 .ErrCodeProtocol ,
464462 onWrite : func () {},
465463 })
466- return false
464+ return nil
467465 }
468466
469467 // "If :authority is missing, Host must be renamed to :authority." - A41
@@ -503,7 +501,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
503501 if t .state != reachable {
504502 t .mu .Unlock ()
505503 s .cancel ()
506- return false
504+ return nil
507505 }
508506 if uint32 (len (t .activeStreams )) >= t .maxStreams {
509507 t .mu .Unlock ()
@@ -514,7 +512,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
514512 onWrite : func () {},
515513 })
516514 s .cancel ()
517- return false
515+ return nil
518516 }
519517 if httpMethod != http .MethodPost {
520518 t .mu .Unlock ()
@@ -530,7 +528,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
530528 rst : ! frame .StreamEnded (),
531529 })
532530 s .cancel ()
533- return false
531+ return nil
534532 }
535533 if t .inTapHandle != nil {
536534 var err error
@@ -550,7 +548,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
550548 status : stat ,
551549 rst : ! frame .StreamEnded (),
552550 })
553- return false
551+ return nil
554552 }
555553 }
556554 t .activeStreams [streamID ] = s
@@ -597,7 +595,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
597595 wq : s .wq ,
598596 })
599597 handle (s )
600- return false
598+ return nil
601599}
602600
603601// HandleStreams receives incoming streams using the given handler. This is
@@ -630,19 +628,16 @@ func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context.
630628 continue
631629 }
632630 if err == io .EOF || err == io .ErrUnexpectedEOF {
633- t .Close ()
631+ t .Close (err )
634632 return
635633 }
636- if logger .V (logLevel ) {
637- logger .Warningf ("transport: http2Server.HandleStreams failed to read frame: %v" , err )
638- }
639- t .Close ()
634+ t .Close (err )
640635 return
641636 }
642637 switch frame := frame .(type ) {
643638 case * http2.MetaHeadersFrame :
644- if t .operateHeaders (frame , handle , traceCtx ) {
645- t .Close ()
639+ if err := t .operateHeaders (frame , handle , traceCtx ); err != nil {
640+ t .Close (err )
646641 break
647642 }
648643 case * http2.DataFrame :
@@ -886,10 +881,7 @@ func (t *http2Server) handlePing(f *http2.PingFrame) {
886881
887882 if t .pingStrikes > maxPingStrikes {
888883 // Send goaway and close the connection.
889- if logger .V (logLevel ) {
890- logger .Errorf ("transport: Got too many pings from the client, closing the connection." )
891- }
892- t .controlBuf .put (& goAway {code : http2 .ErrCodeEnhanceYourCalm , debugData : []byte ("too_many_pings" ), closeConn : true })
884+ t .controlBuf .put (& goAway {code : http2 .ErrCodeEnhanceYourCalm , debugData : []byte ("too_many_pings" ), closeConn : errors .New ("got too many pings from the client" )})
893885 }
894886}
895887
@@ -1169,10 +1161,7 @@ func (t *http2Server) keepalive() {
11691161 continue
11701162 }
11711163 if outstandingPing && kpTimeoutLeft <= 0 {
1172- if logger .V (logLevel ) {
1173- logger .Infof ("transport: closing server transport due to idleness." )
1174- }
1175- t .Close ()
1164+ t .Close (fmt .Errorf ("keepalive ping not acked within timeout %s" , t .kp .Time ))
11761165 return
11771166 }
11781167 if ! outstandingPing {
@@ -1199,12 +1188,15 @@ func (t *http2Server) keepalive() {
11991188// Close starts shutting down the http2Server transport.
12001189// TODO(zhaoq): Now the destruction is not blocked on any pending streams. This
12011190// could cause some resource issue. Revisit this later.
1202- func (t * http2Server ) Close () {
1191+ func (t * http2Server ) Close (err error ) {
12031192 t .mu .Lock ()
12041193 if t .state == closing {
12051194 t .mu .Unlock ()
12061195 return
12071196 }
1197+ if logger .V (logLevel ) {
1198+ logger .Infof ("transport: closing: %v" , err )
1199+ }
12081200 t .state = closing
12091201 streams := t .activeStreams
12101202 t .activeStreams = nil
@@ -1319,19 +1311,20 @@ func (t *http2Server) outgoingGoAwayHandler(g *goAway) (bool, error) {
13191311 // Stop accepting more streams now.
13201312 t .state = draining
13211313 sid := t .maxStreamID
1314+ retErr := g .closeConn
13221315 if len (t .activeStreams ) == 0 {
1323- g . closeConn = true
1316+ retErr = errors . New ( "second GOAWAY written and no active streams left to process" )
13241317 }
13251318 t .mu .Unlock ()
13261319 t .maxStreamMu .Unlock ()
13271320 if err := t .framer .fr .WriteGoAway (sid , g .code , g .debugData ); err != nil {
13281321 return false , err
13291322 }
1330- if g . closeConn {
1323+ if retErr != nil {
13311324 // Abruptly close the connection following the GoAway (via
13321325 // loopywriter). But flush out what's inside the buffer first.
13331326 t .framer .writer .Flush ()
1334- return false , fmt . Errorf ( "transport: Connection closing" )
1327+ return false , retErr
13351328 }
13361329 return true , nil
13371330 }
0 commit comments