@cryptotaxi247 / kubo / commits / 6388f5a1c

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