Skip to content

Commit c0284d3

Browse files
authored
Merge pull request #24 from tetratelabs/add-ctx
Check for context cancellation in loop
2 parents 773c935 + 0253ab7 commit c0284d3

File tree

4 files changed

+28
-12
lines changed

4 files changed

+28
-12
lines changed

pkg/healthcheck/http.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ func HealthCheck(ctx context.Context, data *HttpHealthArgs, diag *diag.Diagnosti
8888
}
8989

9090
window := helpers.RetryWindow{
91+
Context: ctx,
9192
Timeout: time.Duration(data.Timeout) * time.Millisecond,
9293
Interval: time.Duration(data.Interval) * time.Millisecond,
9394
ConsecutiveSuccesses: int(data.ConsecutiveSuccesses),

pkg/helpers/retry.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,13 @@
1414

1515
package helpers
1616

17-
import "time"
17+
import (
18+
"context"
19+
"time"
20+
)
1821

1922
type RetryWindow struct {
23+
Context context.Context
2024
Timeout time.Duration
2125
Interval time.Duration
2226
ConsecutiveSuccesses int
@@ -27,33 +31,42 @@ type RetryResult int
2731
const (
2832
Success RetryResult = iota
2933
TimeoutExceeded
34+
Failure
3035
)
3136

3237
func (r *RetryWindow) Do(action func(attempt int, successes int) bool) RetryResult {
33-
success := make(chan bool)
38+
success := make(chan struct{})
39+
failure := make(chan struct{})
3440
go func() {
3541
attempt := 0
3642
successCount := 0
3743
// run a while true loop, exiting when the timeout expires
3844
for {
39-
attempt++
40-
if action(attempt, successCount) {
41-
successCount++
42-
if successCount >= r.ConsecutiveSuccesses {
43-
success <- true
44-
return
45+
select {
46+
case <-r.Context.Done():
47+
failure <- struct{}{}
48+
return
49+
default:
50+
attempt++
51+
if action(attempt, successCount) {
52+
successCount++
53+
if successCount >= r.ConsecutiveSuccesses {
54+
success <- struct{}{}
55+
return
56+
}
57+
} else {
58+
successCount = 0
4559
}
46-
} else {
47-
successCount = 0
60+
time.Sleep(r.Interval)
4861
}
49-
time.Sleep(r.Interval)
5062
}
51-
5263
}()
5364

5465
select {
5566
case <-success:
5667
return Success
68+
case <-failure:
69+
return Failure
5770
case <-time.After(r.Timeout):
5871
return TimeoutExceeded
5972
}

pkg/provider/resource_local_command.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ func (r *LocalCommandResource) RunCommand(ctx context.Context, data *LocalComman
202202
data.Stderr = types.StringNull()
203203

204204
window := helpers.RetryWindow{
205+
Context: ctx,
205206
Timeout: time.Duration(data.Timeout.ValueInt64()) * time.Millisecond,
206207
Interval: time.Duration(data.Interval.ValueInt64()) * time.Millisecond,
207208
ConsecutiveSuccesses: int(data.ConsecutiveSuccesses.ValueInt64()),

pkg/provider/resource_tcp_echo.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ func (r *TCPEchoResource) TCPEcho(ctx context.Context, data *TCPEchoResourceMode
184184
data.Passed = types.BoolValue(false)
185185

186186
window := helpers.RetryWindow{
187+
Context: ctx,
187188
Timeout: time.Duration(data.Timeout.ValueInt64()) * time.Millisecond,
188189
Interval: time.Duration(data.Interval.ValueInt64()) * time.Millisecond,
189190
ConsecutiveSuccesses: int(data.ConsecutiveSuccesses.ValueInt64()),

0 commit comments

Comments
 (0)