mirror of
https://github.com/ipfs/kubo.git
synced 2026-03-01 14:28:02 +08:00
92 lines
2.0 KiB
Go
92 lines
2.0 KiB
Go
/*
|
|
Package corerepo provides pinning and garbage collection for local
|
|
IPFS block services.
|
|
|
|
IPFS nodes will keep local copies of any object that have either been
|
|
added or requested locally. Not all of these objects are worth
|
|
preserving forever though, so the node adminstrator can pin objects
|
|
they want to keep and unpin objects that they don't care about.
|
|
|
|
Garbage collection sweeps iterate through the local block store
|
|
removing objects that aren't pinned, which frees storage space for new
|
|
objects.
|
|
*/
|
|
package corerepo
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/ipfs/go-ipfs/core"
|
|
path "github.com/ipfs/go-ipfs/path"
|
|
uio "github.com/ipfs/go-ipfs/unixfs/io"
|
|
|
|
cid "gx/ipfs/QmNp85zy9RLrQ5oQD4hPyS39ezrrXpcaa7R4Y9kxdWQLLQ/go-cid"
|
|
)
|
|
|
|
func Pin(n *core.IpfsNode, ctx context.Context, paths []string, recursive bool) ([]*cid.Cid, error) {
|
|
out := make([]*cid.Cid, len(paths))
|
|
|
|
r := &path.Resolver{
|
|
DAG: n.DAG,
|
|
ResolveOnce: uio.ResolveUnixfsOnce,
|
|
}
|
|
|
|
for i, fpath := range paths {
|
|
p, err := path.ParsePath(fpath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
dagnode, err := core.Resolve(ctx, n.Namesys, r, p)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("pin: %s", err)
|
|
}
|
|
err = n.Pinning.Pin(ctx, dagnode, recursive)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("pin: %s", err)
|
|
}
|
|
out[i] = dagnode.Cid()
|
|
}
|
|
|
|
err := n.Pinning.Flush()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return out, nil
|
|
}
|
|
|
|
func Unpin(n *core.IpfsNode, ctx context.Context, paths []string, recursive bool) ([]*cid.Cid, error) {
|
|
unpinned := make([]*cid.Cid, len(paths))
|
|
|
|
r := &path.Resolver{
|
|
DAG: n.DAG,
|
|
ResolveOnce: uio.ResolveUnixfsOnce,
|
|
}
|
|
|
|
for i, p := range paths {
|
|
p, err := path.ParsePath(p)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
k, err := core.ResolveToCid(ctx, n.Namesys, r, p)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = n.Pinning.Unpin(ctx, k, recursive)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
unpinned[i] = k
|
|
}
|
|
|
|
err := n.Pinning.Flush()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return unpinned, nil
|
|
}
|