mirror of
https://github.com/ipfs/kubo.git
synced 2025-08-05 19:02:21 +08:00
Simplify Pinner interface by folding ManualPinner into Pinner
Pinner had method GetManual that returned a ManualPinner, so every Pinner had to implement ManualPinner anyway. License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>
This commit is contained in:
@ -169,9 +169,8 @@ remains to be implemented.
|
||||
return err
|
||||
}
|
||||
|
||||
mp := n.Pinning.GetManual()
|
||||
mp.RemovePinWithMode(rnk, pin.Indirect)
|
||||
mp.PinWithMode(rnk, pin.Recursive)
|
||||
n.Pinning.RemovePinWithMode(rnk, pin.Indirect)
|
||||
n.Pinning.PinWithMode(rnk, pin.Recursive)
|
||||
return n.Pinning.Flush()
|
||||
}
|
||||
|
||||
@ -326,13 +325,13 @@ func add(n *core.IpfsNode, reader io.Reader, useTrickle bool, chunker string) (*
|
||||
node, err = importer.BuildTrickleDagFromReader(
|
||||
n.DAG,
|
||||
chnk,
|
||||
importer.PinIndirectCB(n.Pinning.GetManual()),
|
||||
importer.PinIndirectCB(n.Pinning),
|
||||
)
|
||||
} else {
|
||||
node, err = importer.BuildDagFromReader(
|
||||
n.DAG,
|
||||
chnk,
|
||||
importer.PinIndirectCB(n.Pinning.GetManual()),
|
||||
importer.PinIndirectCB(n.Pinning),
|
||||
)
|
||||
}
|
||||
|
||||
@ -464,7 +463,7 @@ func (params *adder) addDir(file files.File) (*dag.Node, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
params.node.Pinning.GetManual().PinWithMode(k, pin.Indirect)
|
||||
params.node.Pinning.PinWithMode(k, pin.Indirect)
|
||||
|
||||
return tree, nil
|
||||
}
|
||||
|
@ -51,7 +51,7 @@ func (i *gatewayHandler) newDagFromReader(r io.Reader) (*dag.Node, error) {
|
||||
return importer.BuildDagFromReader(
|
||||
i.node.DAG,
|
||||
chunk.DefaultSplitter(r),
|
||||
importer.BasicPinnerCB(i.node.Pinning.GetManual()))
|
||||
importer.BasicPinnerCB(i.node.Pinning))
|
||||
}
|
||||
|
||||
// TODO(btc): break this apart into separate handlers using a more expressive muxer
|
||||
|
@ -28,7 +28,7 @@ func Add(n *core.IpfsNode, r io.Reader) (string, error) {
|
||||
dagNode, err := importer.BuildDagFromReader(
|
||||
n.DAG,
|
||||
chunk.NewSizeSplitter(r, chunk.DefaultBlockSize),
|
||||
importer.BasicPinnerCB(n.Pinning.GetManual()),
|
||||
importer.BasicPinnerCB(n.Pinning),
|
||||
)
|
||||
if err != nil {
|
||||
return "", err
|
||||
@ -64,7 +64,7 @@ func AddR(n *core.IpfsNode, root string) (key string, err error) {
|
||||
return "", err
|
||||
}
|
||||
|
||||
n.Pinning.GetManual().RemovePinWithMode(k, pin.Indirect)
|
||||
n.Pinning.RemovePinWithMode(k, pin.Indirect)
|
||||
if err := n.Pinning.Flush(); err != nil {
|
||||
return "", err
|
||||
}
|
||||
@ -91,12 +91,10 @@ func AddWrapped(n *core.IpfsNode, r io.Reader, filename string) (string, *merkle
|
||||
}
|
||||
|
||||
func add(n *core.IpfsNode, reader io.Reader) (*merkledag.Node, error) {
|
||||
mp := n.Pinning.GetManual()
|
||||
|
||||
return importer.BuildDagFromReader(
|
||||
n.DAG,
|
||||
chunk.DefaultSplitter(reader),
|
||||
importer.PinIndirectCB(mp),
|
||||
importer.PinIndirectCB(n.Pinning),
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -128,7 +128,7 @@ func arrComp(a, b []byte) error {
|
||||
|
||||
type dagservAndPinner struct {
|
||||
ds dag.DAGService
|
||||
mp pin.ManualPinner
|
||||
mp pin.Pinner
|
||||
}
|
||||
|
||||
func TestIndirectBlocks(t *testing.T) {
|
||||
|
@ -17,7 +17,7 @@ var nilFunc NodeCB = func(_ *dag.Node, _ bool) error { return nil }
|
||||
// efficiently create unixfs dag trees
|
||||
type DagBuilderHelper struct {
|
||||
dserv dag.DAGService
|
||||
mp pin.ManualPinner
|
||||
mp pin.Pinner
|
||||
in <-chan []byte
|
||||
errs <-chan error
|
||||
recvdErr error
|
||||
|
@ -20,7 +20,7 @@ var log = logging.Logger("importer")
|
||||
|
||||
// Builds a DAG from the given file, writing created blocks to disk as they are
|
||||
// created
|
||||
func BuildDagFromFile(fpath string, ds dag.DAGService, mp pin.ManualPinner) (*dag.Node, error) {
|
||||
func BuildDagFromFile(fpath string, ds dag.DAGService, mp pin.Pinner) (*dag.Node, error) {
|
||||
stat, err := os.Lstat(fpath)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -65,7 +65,7 @@ func BuildTrickleDagFromReader(ds dag.DAGService, spl chunk.Splitter, ncb h.Node
|
||||
return trickle.TrickleLayout(dbp.New(blkch, errch))
|
||||
}
|
||||
|
||||
func BasicPinnerCB(p pin.ManualPinner) h.NodeCB {
|
||||
func BasicPinnerCB(p pin.Pinner) h.NodeCB {
|
||||
return func(n *dag.Node, last bool) error {
|
||||
k, err := n.Key()
|
||||
if err != nil {
|
||||
@ -82,7 +82,7 @@ func BasicPinnerCB(p pin.ManualPinner) h.NodeCB {
|
||||
}
|
||||
}
|
||||
|
||||
func PinIndirectCB(p pin.ManualPinner) h.NodeCB {
|
||||
func PinIndirectCB(p pin.Pinner) h.NodeCB {
|
||||
return func(n *dag.Node, last bool) error {
|
||||
k, err := n.Key()
|
||||
if err != nil {
|
||||
|
@ -125,7 +125,7 @@ func arrComp(a, b []byte) error {
|
||||
|
||||
type dagservAndPinner struct {
|
||||
ds merkledag.DAGService
|
||||
mp pin.ManualPinner
|
||||
mp pin.Pinner
|
||||
}
|
||||
|
||||
func TestIndirectBlocks(t *testing.T) {
|
||||
|
@ -23,7 +23,7 @@ type File struct {
|
||||
|
||||
// NewFile returns a NewFile object with the given parameters
|
||||
func NewFile(name string, node *dag.Node, parent childCloser, fs *Filesystem) (*File, error) {
|
||||
dmod, err := mod.NewDagModifier(context.Background(), node, fs.dserv, fs.pins.GetManual(), chunk.DefaultSplitter)
|
||||
dmod, err := mod.NewDagModifier(context.Background(), node, fs.dserv, fs.pins, chunk.DefaultSplitter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ import (
|
||||
|
||||
type dagservAndPinner struct {
|
||||
ds DAGService
|
||||
mp pin.ManualPinner
|
||||
mp pin.Pinner
|
||||
}
|
||||
|
||||
func getDagservAndPinner(t *testing.T) dagservAndPinner {
|
||||
@ -36,7 +36,7 @@ func getDagservAndPinner(t *testing.T) dagservAndPinner {
|
||||
bs := bstore.NewBlockstore(db)
|
||||
blockserv := bserv.New(bs, offline.Exchange(bs))
|
||||
dserv := NewDAGService(blockserv)
|
||||
mpin := pin.NewPinner(db, dserv).GetManual()
|
||||
mpin := pin.NewPinner(db, dserv)
|
||||
return dagservAndPinner{
|
||||
ds: dserv,
|
||||
mp: mpin,
|
||||
|
28
pin/pin.go
28
pin/pin.go
@ -34,22 +34,22 @@ type Pinner interface {
|
||||
IsPinned(key.Key) bool
|
||||
Pin(context.Context, *mdag.Node, bool) error
|
||||
Unpin(context.Context, key.Key, bool) error
|
||||
|
||||
// PinWithMode is for manually editing the pin structure. Use with
|
||||
// care! If used improperly, garbage collection may not be
|
||||
// successful.
|
||||
PinWithMode(key.Key, PinMode)
|
||||
// RemovePinWithMode is for manually editing the pin structure.
|
||||
// Use with care! If used improperly, garbage collection may not
|
||||
// be successful.
|
||||
RemovePinWithMode(key.Key, PinMode)
|
||||
|
||||
Flush() error
|
||||
GetManual() ManualPinner
|
||||
DirectKeys() []key.Key
|
||||
IndirectKeys() map[key.Key]int
|
||||
RecursiveKeys() []key.Key
|
||||
}
|
||||
|
||||
// ManualPinner is for manually editing the pin structure
|
||||
// Use with care! If used improperly, garbage collection
|
||||
// may not be successful
|
||||
type ManualPinner interface {
|
||||
PinWithMode(key.Key, PinMode)
|
||||
RemovePinWithMode(key.Key, PinMode)
|
||||
Pinner
|
||||
}
|
||||
|
||||
// pinner implements the Pinner interface
|
||||
type pinner struct {
|
||||
lock sync.RWMutex
|
||||
@ -308,8 +308,8 @@ func loadSet(d ds.Datastore, k ds.Key, val interface{}) error {
|
||||
return json.Unmarshal(bf, val)
|
||||
}
|
||||
|
||||
// PinWithMode is a method on ManualPinners, allowing the user to have fine
|
||||
// grained control over pin counts
|
||||
// PinWithMode allows the user to have fine grained control over pin
|
||||
// counts
|
||||
func (p *pinner) PinWithMode(k key.Key, mode PinMode) {
|
||||
p.lock.Lock()
|
||||
defer p.lock.Unlock()
|
||||
@ -322,7 +322,3 @@ func (p *pinner) PinWithMode(k key.Key, mode PinMode) {
|
||||
p.indirPin.Increment(k)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *pinner) GetManual() ManualPinner {
|
||||
return p
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ var log = logging.Logger("dagio")
|
||||
type DagModifier struct {
|
||||
dagserv mdag.DAGService
|
||||
curNode *mdag.Node
|
||||
mp pin.ManualPinner
|
||||
mp pin.Pinner
|
||||
|
||||
splitter chunk.SplitterGen
|
||||
ctx context.Context
|
||||
@ -50,7 +50,7 @@ type DagModifier struct {
|
||||
read *uio.DagReader
|
||||
}
|
||||
|
||||
func NewDagModifier(ctx context.Context, from *mdag.Node, serv mdag.DAGService, mp pin.ManualPinner, spl chunk.SplitterGen) (*DagModifier, error) {
|
||||
func NewDagModifier(ctx context.Context, from *mdag.Node, serv mdag.DAGService, mp pin.Pinner, spl chunk.SplitterGen) (*DagModifier, error) {
|
||||
return &DagModifier{
|
||||
curNode: from.Copy(),
|
||||
dagserv: serv,
|
||||
|
@ -27,25 +27,25 @@ import (
|
||||
context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
|
||||
)
|
||||
|
||||
func getMockDagServ(t testing.TB) (mdag.DAGService, pin.ManualPinner) {
|
||||
func getMockDagServ(t testing.TB) (mdag.DAGService, pin.Pinner) {
|
||||
dstore := ds.NewMapDatastore()
|
||||
tsds := sync.MutexWrap(dstore)
|
||||
bstore := blockstore.NewBlockstore(tsds)
|
||||
bserv := bs.New(bstore, offline.Exchange(bstore))
|
||||
dserv := mdag.NewDAGService(bserv)
|
||||
return dserv, pin.NewPinner(tsds, dserv).GetManual()
|
||||
return dserv, pin.NewPinner(tsds, dserv)
|
||||
}
|
||||
|
||||
func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blockstore, pin.ManualPinner) {
|
||||
func getMockDagServAndBstore(t testing.TB) (mdag.DAGService, blockstore.Blockstore, pin.Pinner) {
|
||||
dstore := ds.NewMapDatastore()
|
||||
tsds := sync.MutexWrap(dstore)
|
||||
bstore := blockstore.NewBlockstore(tsds)
|
||||
bserv := bs.New(bstore, offline.Exchange(bstore))
|
||||
dserv := mdag.NewDAGService(bserv)
|
||||
return dserv, bstore, pin.NewPinner(tsds, dserv).GetManual()
|
||||
return dserv, bstore, pin.NewPinner(tsds, dserv)
|
||||
}
|
||||
|
||||
func getNode(t testing.TB, dserv mdag.DAGService, size int64, pinner pin.ManualPinner) ([]byte, *mdag.Node) {
|
||||
func getNode(t testing.TB, dserv mdag.DAGService, size int64, pinner pin.Pinner) ([]byte, *mdag.Node) {
|
||||
in := io.LimitReader(u.NewTimeSeededRand(), size)
|
||||
node, err := imp.BuildTrickleDagFromReader(dserv, sizeSplitterGen(500)(in), imp.BasicPinnerCB(pinner))
|
||||
if err != nil {
|
||||
@ -469,7 +469,7 @@ func TestSparseWrite(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func basicGC(t *testing.T, bs blockstore.Blockstore, pins pin.ManualPinner) {
|
||||
func basicGC(t *testing.T, bs blockstore.Blockstore, pins pin.Pinner) {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel() // in case error occurs during operation
|
||||
keychan, err := bs.AllKeysChan(ctx)
|
||||
|
Reference in New Issue
Block a user