@@ -631,17 +631,16 @@ func (t *http2Client) getCallAuthData(ctx context.Context, audience string, call
631631// the wire. However, there are two notable exceptions:
632632//
633633// 1. If the stream headers violate the max header list size allowed by the
634- // server. In this case there is no reason to retry at all, as it is
635- // assumed the RPC would continue to fail on subsequent attempts .
634+ // server. It's possible this could succeed on another transport, even if
635+ // it's unlikely, but do not transparently retry .
636636// 2. If the credentials errored when requesting their headers. In this case,
637637// it's possible a retry can fix the problem, but indefinitely transparently
638638// retrying is not appropriate as it is likely the credentials, if they can
639639// eventually succeed, would need I/O to do so.
640640type NewStreamError struct {
641641 Err error
642642
643- DoNotRetry bool
644- DoNotTransparentRetry bool
643+ AllowTransparentRetry bool
645644}
646645
647646func (e NewStreamError ) Error () string {
@@ -650,11 +649,11 @@ func (e NewStreamError) Error() string {
650649
651650// NewStream creates a stream and registers it into the transport as "active"
652651// streams. All non-nil errors returned will be *NewStreamError.
653- func (t * http2Client ) NewStream (ctx context.Context , callHdr * CallHdr ) (_ * Stream , err error ) {
652+ func (t * http2Client ) NewStream (ctx context.Context , callHdr * CallHdr ) (* Stream , error ) {
654653 ctx = peer .NewContext (ctx , t .getPeer ())
655654 headerFields , err := t .createHeaderFields (ctx , callHdr )
656655 if err != nil {
657- return nil , & NewStreamError {Err : err , DoNotTransparentRetry : true }
656+ return nil , & NewStreamError {Err : err , AllowTransparentRetry : false }
658657 }
659658 s := t .newStream (ctx , callHdr )
660659 cleanup := func (err error ) {
@@ -754,23 +753,24 @@ func (t *http2Client) NewStream(ctx context.Context, callHdr *CallHdr) (_ *Strea
754753 return true
755754 }, hdr )
756755 if err != nil {
757- return nil , & NewStreamError {Err : err }
756+ // Connection closed.
757+ return nil , & NewStreamError {Err : err , AllowTransparentRetry : true }
758758 }
759759 if success {
760760 break
761761 }
762762 if hdrListSizeErr != nil {
763- return nil , & NewStreamError {Err : hdrListSizeErr , DoNotRetry : true }
763+ return nil , & NewStreamError {Err : hdrListSizeErr }
764764 }
765765 firstTry = false
766766 select {
767767 case <- ch :
768768 case <- ctx .Done ():
769769 return nil , & NewStreamError {Err : ContextErr (ctx .Err ())}
770770 case <- t .goAway :
771- return nil , & NewStreamError {Err : errStreamDrain }
771+ return nil , & NewStreamError {Err : errStreamDrain , AllowTransparentRetry : true }
772772 case <- t .ctx .Done ():
773- return nil , & NewStreamError {Err : ErrConnClosing }
773+ return nil , & NewStreamError {Err : ErrConnClosing , AllowTransparentRetry : true }
774774 }
775775 }
776776 if t .statsHandler != nil {
0 commit comments