@@ -534,6 +534,7 @@ func (t *http2Client) CloseStream(s *Stream, err error) {
534
534
if err != nil {
535
535
rst = true
536
536
rstCode = http2 .ErrCodeCancel
537
+ klog .CtxInfof (s .ctx , "KITEX: stream closed by user side ctx canceled, err: %v, code: %d [send RSTStream Frame]" , err , rstCode )
537
538
}
538
539
t .closeStream (s , err , rst , rstCode , status .Convert (err ), nil , false )
539
540
}
@@ -557,6 +558,15 @@ func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2.
557
558
// This will unblock reads eventually.
558
559
s .write (recvMsg {err : err })
559
560
}
561
+
562
+ // store closeStreamErr
563
+ if err == io .EOF {
564
+ err = st .Err ()
565
+ }
566
+ if err != nil {
567
+ s .closeStreamErr .Store (err )
568
+ }
569
+
560
570
// If headerChan isn't closed, then close it.
561
571
if atomic .CompareAndSwapUint32 (& s .headerChanClosed , 0 , 1 ) {
562
572
s .noHeaders = true
@@ -597,6 +607,9 @@ func (t *http2Client) closeStream(s *Stream, err error, rst bool, rstCode http2.
597
607
// re-connected. This happens because t.onClose() begins reconnect logic at the
598
608
// addrConn level and blocks until the addrConn is successfully connected.
599
609
func (t * http2Client ) Close (err error ) error {
610
+ if rawErr , ok := err .(ConnectionError ); ok {
611
+ err = status .Err (codes .Unavailable , rawErr .Desc )
612
+ }
600
613
t .mu .Lock ()
601
614
// Make sure we only Close once.
602
615
if t .state == closing {
@@ -617,7 +630,7 @@ func (t *http2Client) Close(err error) error {
617
630
t .kpDormancyCond .Signal ()
618
631
}
619
632
t .mu .Unlock ()
620
- t .controlBuf .finish ()
633
+ t .controlBuf .finish (err )
621
634
t .cancel ()
622
635
cErr := t .conn .Close ()
623
636
@@ -656,10 +669,10 @@ func (t *http2Client) Write(s *Stream, hdr, data []byte, opts *Options) error {
656
669
if opts .Last {
657
670
// If it's the last message, update stream state.
658
671
if ! s .compareAndSwapState (streamActive , streamWriteDone ) {
659
- return errStreamDone
672
+ return s . getCloseStreamErr ()
660
673
}
661
674
} else if s .getState () != streamActive {
662
- return errStreamDone
675
+ return s . getCloseStreamErr ()
663
676
}
664
677
df := newDataFrame ()
665
678
df .streamID = s .id
@@ -670,7 +683,7 @@ func (t *http2Client) Write(s *Stream, hdr, data []byte, opts *Options) error {
670
683
df .originD = df .d
671
684
if hdr != nil || data != nil { // If it's not an empty data frame, check quota.
672
685
if err := s .wq .get (int32 (len (hdr ) + len (data ))); err != nil {
673
- return err
686
+ return s . getCloseStreamErr ()
674
687
}
675
688
}
676
689
return t .controlBuf .put (df )
@@ -766,6 +779,7 @@ func (t *http2Client) handleData(f *grpcframe.DataFrame) {
766
779
}
767
780
if size > 0 {
768
781
if err := s .fc .onData (size ); err != nil {
782
+ klog .CtxErrorf (s .ctx , "KITEX: http2Client.handleData inflow control err: %v, code: %d [send RSTStream Frame]" , err , http2 .ErrCodeFlowControl )
769
783
t .closeStream (s , io .EOF , true , http2 .ErrCodeFlowControl , status .New (codes .Internal , err .Error ()), nil , false )
770
784
return
771
785
}
@@ -983,6 +997,7 @@ func (t *http2Client) operateHeaders(frame *grpcframe.MetaHeadersFrame) {
983
997
if ! initialHeader && ! endStream {
984
998
// As specified by gRPC over HTTP2, a HEADERS frame (and associated CONTINUATION frames) can only appear at the start or end of a stream. Therefore, second HEADERS frame must have EOS bit set.
985
999
st := status .New (codes .Internal , "a HEADERS frame cannot appear in the middle of a stream" )
1000
+ klog .CtxErrorf (s .ctx , "KITEX: http2Client.operateHeaders received HEADERS frame in the middle of a stream, code: %d [send RSTStream Frame]" , http2 .ErrCodeProtocol )
986
1001
t .closeStream (s , st .Err (), true , http2 .ErrCodeProtocol , st , nil , false )
987
1002
return
988
1003
}
@@ -991,6 +1006,7 @@ func (t *http2Client) operateHeaders(frame *grpcframe.MetaHeadersFrame) {
991
1006
// Initialize isGRPC value to be !initialHeader, since if a gRPC Response-Headers has already been received, then it means that the peer is speaking gRPC and we are in gRPC mode.
992
1007
state .data .isGRPC = ! initialHeader
993
1008
if err := state .decodeHeader (frame ); err != nil {
1009
+ klog .CtxErrorf (s .ctx , "KITEX: http2Client.operateHeaders decode HEADERS frame failed, err: %v, code: %d [send RSTStream Frame]" , err , http2 .ErrCodeProtocol )
994
1010
t .closeStream (s , err , true , http2 .ErrCodeProtocol , status .Convert (err ), nil , endStream )
995
1011
return
996
1012
}
@@ -1034,7 +1050,7 @@ func (t *http2Client) reader() {
1034
1050
// Check the validity of server preface.
1035
1051
frame , err := t .framer .ReadFrame ()
1036
1052
if err != nil {
1037
- err = connectionErrorf (true , err , "error reading from server, remoteAddress=%s, error=%v" , t .conn .RemoteAddr (), err )
1053
+ err = connectionErrorf (true , err , "error reading from server, remoteAddress=%s, error=%v" , t .conn .RemoteAddr (), err )
1038
1054
t .Close (err ) // this kicks off resetTransport, so must be last before return
1039
1055
return
1040
1056
}
@@ -1073,12 +1089,13 @@ func (t *http2Client) reader() {
1073
1089
if err != nil {
1074
1090
msg = err .Error ()
1075
1091
}
1092
+ klog .CtxErrorf (s .ctx , "KITEX: http2Client.reader encountered http2.StreamError: %v, code: %d [send RSTStream Frame]" , se , http2 .ErrCodeProtocol )
1076
1093
t .closeStream (s , status .New (code , msg ).Err (), true , http2 .ErrCodeProtocol , status .New (code , msg ), nil , false )
1077
1094
}
1078
1095
continue
1079
1096
} else {
1080
1097
// Transport error.
1081
- err = connectionErrorf (true , err , "error reading from server, remoteAddress=%s, error=%v" , t .conn .RemoteAddr (), err )
1098
+ err = connectionErrorf (true , err , "error reading from server, remoteAddress=%s, error=%v" , t .conn .RemoteAddr (), err )
1082
1099
t .Close (err )
1083
1100
return
1084
1101
}
0 commit comments