1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-06-20 10:42:11 +08:00

fix(pin): goroutine leaks

License: MIT
Signed-off-by: Overbool <overbool.xu@gmail.com>
This commit is contained in:
Overbool
2018-09-13 13:53:08 +08:00
parent cf963724a7
commit 81453fec3a

View File

@ -58,7 +58,10 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn
gcs, err := ColoredSet(ctx, pn, ds, bestEffortRoots, output) gcs, err := ColoredSet(ctx, pn, ds, bestEffortRoots, output)
if err != nil { if err != nil {
output <- Result{Error: err} select {
case output <- Result{Error: err}:
case <-ctx.Done():
}
return return
} }
emark.Append(logging.LoggableMap{ emark.Append(logging.LoggableMap{
@ -69,7 +72,10 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn
keychan, err := bs.AllKeysChan(ctx) keychan, err := bs.AllKeysChan(ctx)
if err != nil { if err != nil {
output <- Result{Error: err} select {
case output <- Result{Error: err}:
case <-ctx.Done():
}
return return
} }
@ -108,7 +114,11 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn
}) })
esweep.Done() esweep.Done()
if errors { if errors {
output <- Result{Error: ErrCannotDeleteSomeBlocks} select {
case output <- Result{Error: ErrCannotDeleteSomeBlocks}:
case <-ctx.Done():
return
}
} }
defer log.EventBegin(ctx, "GC.datastore").Done() defer log.EventBegin(ctx, "GC.datastore").Done()
@ -119,7 +129,10 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn
err = gds.CollectGarbage() err = gds.CollectGarbage()
if err != nil { if err != nil {
output <- Result{Error: err} select {
case output <- Result{Error: err}:
case <-ctx.Done():
}
return return
} }
}() }()
@ -177,28 +190,40 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo
links, err := ipld.GetLinks(ctx, ng, cid) links, err := ipld.GetLinks(ctx, ng, cid)
if err != nil { if err != nil {
errors = true errors = true
output <- Result{Error: &CannotFetchLinksError{cid, err}} select {
case output <- Result{Error: &CannotFetchLinksError{cid, err}}:
case <-ctx.Done():
}
} }
return links, nil return links, nil
} }
err := Descendants(ctx, getLinks, gcs, pn.RecursiveKeys()) err := Descendants(ctx, getLinks, gcs, pn.RecursiveKeys())
if err != nil { if err != nil {
errors = true errors = true
output <- Result{Error: err} select {
case output <- Result{Error: err}:
case <-ctx.Done():
}
} }
bestEffortGetLinks := func(ctx context.Context, cid cid.Cid) ([]*ipld.Link, error) { bestEffortGetLinks := func(ctx context.Context, cid cid.Cid) ([]*ipld.Link, error) {
links, err := ipld.GetLinks(ctx, ng, cid) links, err := ipld.GetLinks(ctx, ng, cid)
if err != nil && err != ipld.ErrNotFound { if err != nil && err != ipld.ErrNotFound {
errors = true errors = true
output <- Result{Error: &CannotFetchLinksError{cid, err}} select {
case output <- Result{Error: &CannotFetchLinksError{cid, err}}:
case <-ctx.Done():
}
} }
return links, nil return links, nil
} }
err = Descendants(ctx, bestEffortGetLinks, gcs, bestEffortRoots) err = Descendants(ctx, bestEffortGetLinks, gcs, bestEffortRoots)
if err != nil { if err != nil {
errors = true errors = true
output <- Result{Error: err} select {
case output <- Result{Error: err}:
case <-ctx.Done():
}
} }
for _, k := range pn.DirectKeys() { for _, k := range pn.DirectKeys() {
@ -208,7 +233,10 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo
err = Descendants(ctx, getLinks, gcs, pn.InternalPins()) err = Descendants(ctx, getLinks, gcs, pn.InternalPins())
if err != nil { if err != nil {
errors = true errors = true
output <- Result{Error: err} select {
case output <- Result{Error: err}:
case <-ctx.Done():
}
} }
if errors { if errors {