Skip to content

Commit 0cc0988

Browse files
committedAug 22, 2020
fix #10 race conditions issue
1 parent 1a184d5 commit 0cc0988

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed
 

‎client.go

+12-4
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ func (c *clientAttr) run(q *query) {
115115
)
116116

117117
if c.client == nil {
118-
c.setErr(errNotConn)
118+
setErr(c, errNotConn)
119119
q.errResp(c.addr, errNotConn)
120120
return
121121
}
@@ -129,21 +129,21 @@ func (c *clientAttr) run(q *query) {
129129

130130
session, err := c.newSession()
131131
if err != nil {
132-
c.setErr(err)
132+
setErr(c, err)
133133
q.errResp(c.addr, err)
134134
return
135135
}
136136

137137
writer, err := session.StdinPipe()
138138
if err != nil {
139-
c.setErr(err)
139+
setErr(c, err)
140140
q.errResp(c.addr, err)
141141
return
142142
}
143143

144144
scanOut, scanErr, err := c.getScanners(session, q.limitReadOut, q.limitReadErr)
145145
if err != nil {
146-
c.setErr(err)
146+
setErr(c, err)
147147
q.errResp(c.addr, err)
148148
return
149149
}
@@ -370,6 +370,7 @@ func (c *clientAttr) connect() {
370370
c.client = ssh.NewClient(sshConn, chans, req)
371371
c.lastUpdate = time.Now()
372372
c.err = nil
373+
c.stats.errRecent = 0
373374
}
374375

375376
func (c *clientAttr) close() {
@@ -576,3 +577,10 @@ func (s *Stream) Input(in io.Reader) {
576577
buf.ReadFrom(in)
577578
s.r.inChan <- buf.Bytes()
578579
}
580+
581+
// setErr is a helper func to update error with mutex
582+
func setErr(c *clientAttr, err error) {
583+
c.Lock()
584+
defer c.Unlock()
585+
c.setErr(err)
586+
}

‎query.go

+2
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ func (q *query) run(v *VSSH) {
7272
}
7373

7474
if client.getErr() != nil {
75+
client.RLock()
7576
q.respChan <- &Response{id: client.addr, err: client.err}
77+
client.RUnlock()
7678
return
7779
}
7880

‎vssh.go

+2
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ func (v *VSSH) reConnect(ctx context.Context) {
366366
select {
367367
case <-ticker.C:
368368
for client := range v.clients.enum() {
369+
client.Lock()
369370
if client.err != nil && client.stats.errRecent < maxErrRecent {
370371
if client.client != nil {
371372
client.client.Close()
@@ -374,6 +375,7 @@ func (v *VSSH) reConnect(ctx context.Context) {
374375
} else if time.Since(client.lastUpdate) > resetErrRecentDur {
375376
client.stats.errRecent = 0
376377
}
378+
client.Unlock()
377379
}
378380
case <-ctx.Done():
379381
return

0 commit comments

Comments
 (0)