Skip to content

Commit 5986489

Browse files
temporary error retry time limit
1 parent bd92daa commit 5986489

File tree

1 file changed

+27
-19
lines changed

1 file changed

+27
-19
lines changed

session.go

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
126126
func (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+
180188
func (s *Session) pack(ctx *Context) ([]byte, error) {
181189
defer s.ctxPool.Put(ctx)
182190
if ctx.respEntry == nil {

0 commit comments

Comments
 (0)