1
0
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:
Tommi Virtanen
2015-05-08 11:00:55 -07:00
committed by Jeromy
parent c4d2988c11
commit c9ce2e724a
12 changed files with 38 additions and 45 deletions

View File

@ -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
}

View File

@ -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

View File

@ -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),
)
}

View File

@ -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) {

View File

@ -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

View File

@ -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 {

View File

@ -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) {

View File

@ -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
}

View File

@ -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,

View File

@ -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
}

View File

@ -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,

View File

@ -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)