mirror of
https://github.com/ipfs/kubo.git
synced 2025-06-26 15:42:21 +08:00
Significanly improve GC UX with verifcid
License: MIT Signed-off-by: Jakub Sztandera <kubuxu@protonmail.ch>
This commit is contained in:
@ -17,6 +17,7 @@ import (
|
|||||||
path "github.com/ipfs/go-ipfs/path"
|
path "github.com/ipfs/go-ipfs/path"
|
||||||
resolver "github.com/ipfs/go-ipfs/path/resolver"
|
resolver "github.com/ipfs/go-ipfs/path/resolver"
|
||||||
pin "github.com/ipfs/go-ipfs/pin"
|
pin "github.com/ipfs/go-ipfs/pin"
|
||||||
|
"github.com/ipfs/go-ipfs/thirdparty/verifcid"
|
||||||
uio "github.com/ipfs/go-ipfs/unixfs/io"
|
uio "github.com/ipfs/go-ipfs/unixfs/io"
|
||||||
|
|
||||||
u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util"
|
u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util"
|
||||||
@ -608,6 +609,15 @@ func pinVerify(ctx context.Context, n *core.IpfsNode, opts pinVerifyOpts) <-chan
|
|||||||
return status
|
return status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := verifcid.ValidateCid(root); err != nil {
|
||||||
|
status := PinStatus{Ok: false}
|
||||||
|
if opts.explain {
|
||||||
|
status.BadNodes = []BadNode{BadNode{Cid: key, Err: err.Error()}}
|
||||||
|
}
|
||||||
|
visited[key] = status
|
||||||
|
return status
|
||||||
|
}
|
||||||
|
|
||||||
links, err := getLinks(ctx, root)
|
links, err := getLinks(ctx, root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
status := PinStatus{Ok: false}
|
status := PinStatus{Ok: false}
|
||||||
|
26
pin/gc/gc.go
26
pin/gc/gc.go
@ -5,11 +5,13 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
bserv "github.com/ipfs/go-ipfs/blockservice"
|
bserv "github.com/ipfs/go-ipfs/blockservice"
|
||||||
offline "github.com/ipfs/go-ipfs/exchange/offline"
|
offline "github.com/ipfs/go-ipfs/exchange/offline"
|
||||||
dag "github.com/ipfs/go-ipfs/merkledag"
|
dag "github.com/ipfs/go-ipfs/merkledag"
|
||||||
pin "github.com/ipfs/go-ipfs/pin"
|
pin "github.com/ipfs/go-ipfs/pin"
|
||||||
|
"github.com/ipfs/go-ipfs/thirdparty/verifcid"
|
||||||
|
|
||||||
dstore "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
|
dstore "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
|
||||||
logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log"
|
logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log"
|
||||||
@ -129,12 +131,34 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn
|
|||||||
// adds them to the given cid.Set, using the provided dag.GetLinks function
|
// adds them to the given cid.Set, using the provided dag.GetLinks function
|
||||||
// to walk the tree.
|
// to walk the tree.
|
||||||
func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []*cid.Cid) error {
|
func Descendants(ctx context.Context, getLinks dag.GetLinks, set *cid.Set, roots []*cid.Cid) error {
|
||||||
|
verifyGetLinks := func(ctx context.Context, c *cid.Cid) ([]*ipld.Link, error) {
|
||||||
|
err := verifcid.ValidateCid(c)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return getLinks(ctx, c)
|
||||||
|
}
|
||||||
|
|
||||||
|
verboseCidError := func(err error) error {
|
||||||
|
if strings.Contains(err.Error(), verifcid.ErrBelowMinimumHashLength.Error()) ||
|
||||||
|
strings.Contains(err.Error(), verifcid.ErrPossiblyInsecureHashFunction.Error()) {
|
||||||
|
err = fmt.Errorf("\"%s\"\nPlease run 'ipfs pin verify'"+
|
||||||
|
" to list insecure hashes. If you want to read them,"+
|
||||||
|
" please downgrade your go-ipfs to 0.4.13\n", err)
|
||||||
|
log.Error(err)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
for _, c := range roots {
|
for _, c := range roots {
|
||||||
set.Add(c)
|
set.Add(c)
|
||||||
|
|
||||||
// EnumerateChildren recursively walks the dag and adds the keys to the given set
|
// EnumerateChildren recursively walks the dag and adds the keys to the given set
|
||||||
err := dag.EnumerateChildren(ctx, getLinks, c, set.Visit)
|
err := dag.EnumerateChildren(ctx, verifyGetLinks, c, set.Visit)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
err = verboseCidError(err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user