@@ -28,18 +28,19 @@ func NewComposableParallel(routers []*ParallelRouter) *ComposableParallel {
28
28
func (r * ComposableParallel ) Provide (ctx context.Context , cid cid.Cid , provide bool ) error {
29
29
var wg sync.WaitGroup
30
30
errCh := make (chan error )
31
- closeCh := make (chan bool )
32
31
for _ , r := range r .routers {
33
32
r := r
34
33
wg .Add (1 )
35
34
go func () {
36
35
defer wg .Done ()
36
+ tim := time .NewTimer (r .ExecuteAfter )
37
+ defer tim .Stop ()
37
38
select {
38
39
case <- ctx .Done ():
39
- if ctx . Err () != nil && ! r .IgnoreError {
40
+ if ! r .IgnoreError {
40
41
errCh <- ctx .Err ()
41
42
}
42
- case <- time . After ( r . ExecuteAfter ) :
43
+ case <- tim . C :
43
44
ctx , cancel := context .WithTimeout (ctx , r .Timeout )
44
45
defer cancel ()
45
46
err := r .Router .Provide (ctx , cid , provide )
@@ -48,22 +49,18 @@ func (r *ComposableParallel) Provide(ctx context.Context, cid cid.Cid, provide b
48
49
! r .IgnoreError {
49
50
errCh <- err
50
51
}
51
- case <- closeCh :
52
- return
53
52
}
54
53
}()
55
54
}
56
55
57
56
go func () {
58
57
wg .Wait ()
59
- close (closeCh )
58
+ close (errCh )
60
59
}()
61
60
62
61
var errOut error
63
- select {
64
- case err := <- errCh :
62
+ for err := range errCh {
65
63
errOut = multierror .Append (errOut , err )
66
- case <- closeCh :
67
64
}
68
65
69
66
return errOut
@@ -72,13 +69,18 @@ func (r *ComposableParallel) Provide(ctx context.Context, cid cid.Cid, provide b
72
69
func (r * ComposableParallel ) FindProvidersAsync (ctx context.Context , cid cid.Cid , count int ) <- chan peer.AddrInfo {
73
70
addrChanOut := make (chan peer.AddrInfo )
74
71
var totalCount int64
72
+ var wg sync.WaitGroup
75
73
for _ , r := range r .routers {
76
74
r := r
75
+ wg .Add (1 )
77
76
go func () {
77
+ wg .Done ()
78
+ tim := time .NewTimer (r .ExecuteAfter )
79
+ defer tim .Stop ()
78
80
select {
79
81
case <- ctx .Done ():
80
82
return
81
- case <- time . After ( r . ExecuteAfter ) :
83
+ case <- tim . C :
82
84
ctx , cancel := context .WithTimeout (ctx , r .Timeout )
83
85
defer cancel ()
84
86
addrChan := r .Router .FindProvidersAsync (ctx , cid , count )
@@ -95,13 +97,23 @@ func (r *ComposableParallel) FindProvidersAsync(ctx context.Context, cid cid.Cid
95
97
return
96
98
}
97
99
98
- addrChanOut <- addr
100
+ select {
101
+ case <- ctx .Done ():
102
+ return
103
+ case addrChanOut <- addr :
104
+ }
105
+
99
106
}
100
107
}
101
108
}
102
109
}()
103
110
}
104
111
112
+ go func () {
113
+ wg .Wait ()
114
+ close (addrChanOut )
115
+ }()
116
+
105
117
return addrChanOut
106
118
}
107
119
@@ -116,12 +128,14 @@ func (r *ComposableParallel) FindPeer(ctx context.Context, id peer.ID) (peer.Add
116
128
wg .Add (1 )
117
129
go func () {
118
130
defer wg .Done ()
131
+ tim := time .NewTimer (r .ExecuteAfter )
132
+ defer tim .Stop ()
119
133
select {
120
134
case <- ctx .Done ():
121
- if ctx . Err () != nil && ! r .IgnoreError {
135
+ if ! r .IgnoreError {
122
136
errCh <- ctx .Err ()
123
137
}
124
- case <- time . After ( r . ExecuteAfter ) :
138
+ case <- tim . C :
125
139
ctx , cancel := context .WithTimeout (ctx , r .Timeout )
126
140
defer cancel ()
127
141
addr , err := r .Router .FindPeer (ctx , id )
@@ -163,18 +177,19 @@ func (r *ComposableParallel) FindPeer(ctx context.Context, id peer.ID) (peer.Add
163
177
func (r * ComposableParallel ) PutValue (ctx context.Context , key string , val []byte , opts ... routing.Option ) error {
164
178
var wg sync.WaitGroup
165
179
errCh := make (chan error )
166
- closeCh := make (chan bool )
167
180
for _ , r := range r .routers {
168
181
r := r
169
182
wg .Add (1 )
170
183
go func () {
171
184
defer wg .Done ()
185
+ tim := time .NewTimer (r .ExecuteAfter )
186
+ defer tim .Stop ()
172
187
select {
173
188
case <- ctx .Done ():
174
- if ctx . Err () != nil && ! r .IgnoreError {
189
+ if ! r .IgnoreError {
175
190
errCh <- ctx .Err ()
176
191
}
177
- case <- time . After ( r . ExecuteAfter ) :
192
+ case <- tim . C :
178
193
ctx , cancel := context .WithTimeout (ctx , r .Timeout )
179
194
defer cancel ()
180
195
err := r .Router .PutValue (ctx , key , val , opts ... )
@@ -183,22 +198,18 @@ func (r *ComposableParallel) PutValue(ctx context.Context, key string, val []byt
183
198
! r .IgnoreError {
184
199
errCh <- err
185
200
}
186
- case <- closeCh :
187
- return
188
201
}
189
202
}()
190
203
}
191
204
192
205
go func () {
193
206
wg .Wait ()
194
- close (closeCh )
207
+ close (errCh )
195
208
}()
196
209
197
210
var errOut error
198
- select {
199
- case err := <- errCh :
211
+ for err := range errCh {
200
212
errOut = multierror .Append (errOut , err )
201
- case <- closeCh :
202
213
}
203
214
204
215
return errOut
@@ -215,12 +226,14 @@ func (r *ComposableParallel) GetValue(ctx context.Context, key string, opts ...r
215
226
wg .Add (1 )
216
227
go func () {
217
228
defer wg .Done ()
229
+ tim := time .NewTimer (r .ExecuteAfter )
230
+ defer tim .Stop ()
218
231
select {
219
232
case <- ctx .Done ():
220
- if ctx . Err () != nil && ! r .IgnoreError {
233
+ if ! r .IgnoreError {
221
234
errCh <- ctx .Err ()
222
235
}
223
- case <- time . After ( r . ExecuteAfter ) :
236
+ case <- tim . C :
224
237
ctx , cancel := context .WithTimeout (ctx , r .Timeout )
225
238
defer cancel ()
226
239
val , err := r .Router .GetValue (ctx , key , opts ... )
0 commit comments