Skip to content
This repository was archived by the owner on Jun 26, 2023. It is now read-only.

Commit d86645f

Browse files
authored
Merge pull request #6 from ipfs/feat/optimize-check-if-pinned
optimize CheckIfPinned
2 parents 9ed588a + 49ac7c3 commit d86645f

File tree

2 files changed

+25
-57
lines changed

2 files changed

+25
-57
lines changed

dspinner/pin.go

+15-33
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
"github.com/ipfs/go-ipfs-pinner/dsindex"
1818
ipld "github.com/ipfs/go-ipld-format"
1919
logging "github.com/ipfs/go-log"
20+
"github.com/ipfs/go-merkledag"
2021
mdag "github.com/ipfs/go-merkledag"
2122
"github.com/ipfs/go-merkledag/dagutils"
2223
"github.com/polydawn/refmt/cbor"
@@ -489,49 +490,30 @@ func (p *pinner) CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]ipfspinn
489490
}
490491
}
491492

492-
// Now walk all recursive pins to check for indirect pins
493-
var checkChildren func(cid.Cid, cid.Cid) error
494-
checkChildren = func(rk, parentKey cid.Cid) error {
495-
links, err := ipld.GetLinks(ctx, p.dserv, parentKey)
496-
if err != nil {
497-
return err
498-
}
499-
for _, lnk := range links {
500-
c := lnk.Cid
501-
502-
if toCheck.Has(c) {
503-
pinned = append(pinned,
504-
ipfspinner.Pinned{Key: c, Mode: ipfspinner.Indirect, Via: rk})
505-
toCheck.Remove(c)
506-
}
507-
508-
err = checkChildren(rk, c)
509-
if err != nil {
510-
return err
511-
}
512-
513-
if toCheck.Len() == 0 {
514-
return nil
515-
}
516-
}
517-
return nil
518-
}
519-
520493
var e error
494+
visited := cid.NewSet()
521495
err := p.cidRIndex.ForEach(ctx, "", func(key, value string) bool {
522496
var rk cid.Cid
523497
rk, e = cid.Cast([]byte(key))
524498
if e != nil {
525499
return false
526500
}
527-
e = checkChildren(rk, rk)
501+
e = merkledag.Walk(ctx, merkledag.GetLinksWithDAG(p.dserv), rk, func(c cid.Cid) bool {
502+
if toCheck.Len() == 0 || !visited.Visit(c) {
503+
return false
504+
}
505+
506+
if toCheck.Has(c) {
507+
pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Indirect, Via: rk})
508+
toCheck.Remove(c)
509+
}
510+
511+
return true
512+
}, merkledag.Concurrent())
528513
if e != nil {
529514
return false
530515
}
531-
if toCheck.Len() == 0 {
532-
return false
533-
}
534-
return true
516+
return toCheck.Len() > 0
535517
})
536518
if err != nil {
537519
return nil, err

ipldpinner/pin.go

+10-24
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import (
1414
ds "github.com/ipfs/go-datastore"
1515
ipld "github.com/ipfs/go-ipld-format"
1616
logging "github.com/ipfs/go-log"
17+
"github.com/ipfs/go-merkledag"
1718
mdag "github.com/ipfs/go-merkledag"
1819
"github.com/ipfs/go-merkledag/dagutils"
1920

@@ -328,35 +329,20 @@ func (p *pinner) CheckIfPinned(ctx context.Context, cids ...cid.Cid) ([]ipfspinn
328329
}
329330

330331
// Now walk all recursive pins to check for indirect pins
331-
var checkChildren func(cid.Cid, cid.Cid) error
332-
checkChildren = func(rk, parentKey cid.Cid) error {
333-
links, err := ipld.GetLinks(ctx, p.dserv, parentKey)
334-
if err != nil {
335-
return err
336-
}
337-
for _, lnk := range links {
338-
c := lnk.Cid
332+
visited := cid.NewSet()
333+
for _, rk := range p.recursePin.Keys() {
334+
err := merkledag.Walk(ctx, merkledag.GetLinksWithDAG(p.dserv), rk, func(c cid.Cid) bool {
335+
if toCheck.Len() == 0 || !visited.Visit(c) {
336+
return false
337+
}
339338

340339
if toCheck.Has(c) {
341-
pinned = append(pinned,
342-
ipfspinner.Pinned{Key: c, Mode: ipfspinner.Indirect, Via: rk})
340+
pinned = append(pinned, ipfspinner.Pinned{Key: c, Mode: ipfspinner.Indirect, Via: rk})
343341
toCheck.Remove(c)
344342
}
345343

346-
err := checkChildren(rk, c)
347-
if err != nil {
348-
return err
349-
}
350-
351-
if toCheck.Len() == 0 {
352-
return nil
353-
}
354-
}
355-
return nil
356-
}
357-
358-
for _, rk := range p.recursePin.Keys() {
359-
err := checkChildren(rk, rk)
344+
return true
345+
}, merkledag.Concurrent())
360346
if err != nil {
361347
return nil, err
362348
}

0 commit comments

Comments
 (0)