@@ -124,7 +124,7 @@ func (s *Session) sendReq(ctx *Context, reqQueue chan<- *Context) (ok bool) {
124124// Parameter writeTimeout specified the connection writing timeout.
125125// The loop breaks if errors occurred, or the session is closed.
126126func (s * Session ) writeOutbound (writeTimeout time.Duration ) {
127- FOR :
127+ LOOP :
128128 for {
129129 select {
130130 case <- s .closed :
@@ -148,35 +148,43 @@ FOR:
148148 if writeTimeout > 0 {
149149 if err := s .conn .SetWriteDeadline (time .Now ().Add (writeTimeout )); err != nil {
150150 Log .Errorf ("session %s set write deadline err: %s" , s .id , err )
151- break FOR
151+ break LOOP
152152 }
153153 }
154- for {
155- _ , err := s .conn .Write (outboundMsg )
156- if err == nil {
157- break
158- }
159154
160- if ne , ok := err .(net.Error ); ok {
161- if ne .Timeout () {
162- Log .Errorf ("session %s conn write err: %s" , s .id , err )
163- break FOR
164- }
165- if ne .Temporary () {
166- Log .Errorf ("session %s conn write err: %s; retrying in %s" , s .id , err , tempErrDelay )
167- time .Sleep (tempErrDelay )
168- continue
169- }
170- }
155+ if err := s .tryConnWrite (outboundMsg ); err != nil {
171156 Log .Errorf ("session %s conn write err: %s" , s .id , err )
172- break FOR
157+ break LOOP
173158 }
174159 }
175160 }
176161 s .close ()
177162 Log .Tracef ("session %s writeOutbound exit because of error" , s .id )
178163}
179164
165+ func (s * Session ) tryConnWrite (outboundMsg []byte ) error {
166+ for i := 1 ; i <= 10 ; i ++ {
167+ _ , err := s .conn .Write (outboundMsg )
168+ if err == nil {
169+ break
170+ }
171+
172+ if ne , ok := err .(net.Error ); ok {
173+ if ne .Timeout () {
174+ return err
175+ }
176+ if ne .Temporary () {
177+ delay := tempErrDelay * time .Duration (i )
178+ Log .Errorf ("session %s conn write err: %s; retrying in %s" , s .id , err , delay )
179+ time .Sleep (delay )
180+ continue
181+ }
182+ }
183+ return err
184+ }
185+ return nil
186+ }
187+
180188func (s * Session ) pack (ctx * Context ) ([]byte , error ) {
181189 defer s .ctxPool .Put (ctx )
182190 if ctx .respEntry == nil {
0 commit comments