pin: honor the context more accurately
Michael Muré committed
May 5, 2020 at 14:19 UTC
6388f5a1c2439a3d3677f67c0deb79d3cb91f504
1 file changed
+26
-8
core/coreapi/pin.go
+26
-8
@@ -53,7 +53,7 @@ func (api *PinAPI) Ls(ctx context.Context, opts ...caopts.PinLsOption) (<-chan c
53
return nil, fmt.Errorf("invalid type '%s', must be one of {direct, indirect, recursive, all}", settings.Type)
54
}
55
56
- return api.pinLsAll(settings.Type, ctx), nil
56
+ return api.pinLsAll(ctx, settings.Type), nil
57
}
58
59
func (api *PinAPI) IsPinned(ctx context.Context, p path.Path, opts ...caopts.PinIsPinnedOption) (string, bool, error) {
@@ -218,20 +218,26 @@ func (p *pinInfo) Err() error {
218
return p.err
219
}
220
221
-func (api *PinAPI) pinLsAll(typeStr string, ctx context.Context) <-chan coreiface.Pin {
221
+// pinLsAll is an internal function for returning a list of pins
222
+func (api *PinAPI) pinLsAll(ctx context.Context, typeStr string) <-chan coreiface.Pin {
223
out := make(chan coreiface.Pin)
224
225
keys := cid.NewSet()
226
226
- AddToResultKeys := func(keyList []cid.Cid, typeStr string) {
227
+ AddToResultKeys := func(keyList []cid.Cid, typeStr string) error {
228
for _, c := range keyList {
229
if keys.Visit(c) {
229
- out <- &pinInfo{
230
+ select {
231
+ case out <- &pinInfo{
232
pinType: typeStr,
233
path: path.IpldPath(c),
234
+ }:
235
+ case <-ctx.Done():
236
+ return ctx.Err()
237
}
238
}
239
}
240
+ return nil
241
}
242
243
VisitKeys := func(keyList []cid.Cid) {
@@ -249,7 +255,10 @@ func (api *PinAPI) pinLsAll(typeStr string, ctx context.Context) <-chan coreifac
255
out <- &pinInfo{err: err}
256
return
257
}
252
- AddToResultKeys(rkeys, "recursive")
258
+ if err := AddToResultKeys(rkeys, "recursive"); err != nil {
259
+ out <- &pinInfo{err: err}
260
+ return
261
+ }
262
}
263
if typeStr == "direct" || typeStr == "all" {
264
dkeys, err := api.pinning.DirectKeys(ctx)
@@ -257,7 +266,10 @@ func (api *PinAPI) pinLsAll(typeStr string, ctx context.Context) <-chan coreifac
266
out <- &pinInfo{err: err}
267
return
268
}
260
- AddToResultKeys(dkeys, "direct")
269
+ if err := AddToResultKeys(dkeys, "direct"); err != nil {
270
+ out <- &pinInfo{err: err}
271
+ return
272
+ }
273
}
274
if typeStr == "all" {
275
set := cid.NewSet()
@@ -277,7 +289,10 @@ func (api *PinAPI) pinLsAll(typeStr string, ctx context.Context) <-chan coreifac
289
return
290
}
291
}
280
- AddToResultKeys(set.Keys(), "indirect")
292
+ if err := AddToResultKeys(set.Keys(), "indirect"); err != nil {
293
+ out <- &pinInfo{err: err}
294
+ return
295
+ }
296
}
297
if typeStr == "indirect" {
298
// We need to first visit the direct pins that have priority
@@ -309,7 +324,10 @@ func (api *PinAPI) pinLsAll(typeStr string, ctx context.Context) <-chan coreifac
324
return
325
}
326
}
312
- AddToResultKeys(set.Keys(), "indirect")
327
+ if err := AddToResultKeys(set.Keys(), "indirect"); err != nil {
328
+ out <- &pinInfo{err: err}
329
+ return
330
+ }
331
}
332
}()
333