mirror of
https://github.com/ipfs/kubo.git
synced 2025-08-06 11:31:54 +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
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
mp := n.Pinning.GetManual()
|
n.Pinning.RemovePinWithMode(rnk, pin.Indirect)
|
||||||
mp.RemovePinWithMode(rnk, pin.Indirect)
|
n.Pinning.PinWithMode(rnk, pin.Recursive)
|
||||||
mp.PinWithMode(rnk, pin.Recursive)
|
|
||||||
return n.Pinning.Flush()
|
return n.Pinning.Flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -326,13 +325,13 @@ func add(n *core.IpfsNode, reader io.Reader, useTrickle bool, chunker string) (*
|
|||||||
node, err = importer.BuildTrickleDagFromReader(
|
node, err = importer.BuildTrickleDagFromReader(
|
||||||
n.DAG,
|
n.DAG,
|
||||||
chnk,
|
chnk,
|
||||||
importer.PinIndirectCB(n.Pinning.GetManual()),
|
importer.PinIndirectCB(n.Pinning),
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
node, err = importer.BuildDagFromReader(
|
node, err = importer.BuildDagFromReader(
|
||||||
n.DAG,
|
n.DAG,
|
||||||
chnk,
|
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
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
params.node.Pinning.GetManual().PinWithMode(k, pin.Indirect)
|
params.node.Pinning.PinWithMode(k, pin.Indirect)
|
||||||
|
|
||||||
return tree, nil
|
return tree, nil
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ func (i *gatewayHandler) newDagFromReader(r io.Reader) (*dag.Node, error) {
|
|||||||
return importer.BuildDagFromReader(
|
return importer.BuildDagFromReader(
|
||||||
i.node.DAG,
|
i.node.DAG,
|
||||||
chunk.DefaultSplitter(r),
|
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
|
// 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(
|
dagNode, err := importer.BuildDagFromReader(
|
||||||
n.DAG,
|
n.DAG,
|
||||||
chunk.NewSizeSplitter(r, chunk.DefaultBlockSize),
|
chunk.NewSizeSplitter(r, chunk.DefaultBlockSize),
|
||||||
importer.BasicPinnerCB(n.Pinning.GetManual()),
|
importer.BasicPinnerCB(n.Pinning),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
@ -64,7 +64,7 @@ func AddR(n *core.IpfsNode, root string) (key string, err error) {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
n.Pinning.GetManual().RemovePinWithMode(k, pin.Indirect)
|
n.Pinning.RemovePinWithMode(k, pin.Indirect)
|
||||||
if err := n.Pinning.Flush(); err != nil {
|
if err := n.Pinning.Flush(); err != nil {
|
||||||
return "", err
|
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) {
|
func add(n *core.IpfsNode, reader io.Reader) (*merkledag.Node, error) {
|
||||||
mp := n.Pinning.GetManual()
|
|
||||||
|
|
||||||
return importer.BuildDagFromReader(
|
return importer.BuildDagFromReader(
|
||||||
n.DAG,
|
n.DAG,
|
||||||
chunk.DefaultSplitter(reader),
|
chunk.DefaultSplitter(reader),
|
||||||
importer.PinIndirectCB(mp),
|
importer.PinIndirectCB(n.Pinning),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ func arrComp(a, b []byte) error {
|
|||||||
|
|
||||||
type dagservAndPinner struct {
|
type dagservAndPinner struct {
|
||||||
ds dag.DAGService
|
ds dag.DAGService
|
||||||
mp pin.ManualPinner
|
mp pin.Pinner
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestIndirectBlocks(t *testing.T) {
|
func TestIndirectBlocks(t *testing.T) {
|
||||||
|
@ -17,7 +17,7 @@ var nilFunc NodeCB = func(_ *dag.Node, _ bool) error { return nil }
|
|||||||
// efficiently create unixfs dag trees
|
// efficiently create unixfs dag trees
|
||||||
type DagBuilderHelper struct {
|
type DagBuilderHelper struct {
|
||||||
dserv dag.DAGService
|
dserv dag.DAGService
|
||||||
mp pin.ManualPinner
|
mp pin.Pinner
|
||||||
in <-chan []byte
|
in <-chan []byte
|
||||||
errs <-chan error
|
errs <-chan error
|
||||||
recvdErr 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
|
// Builds a DAG from the given file, writing created blocks to disk as they are
|
||||||
// created
|
// 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)
|
stat, err := os.Lstat(fpath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
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))
|
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 {
|
return func(n *dag.Node, last bool) error {
|
||||||
k, err := n.Key()
|
k, err := n.Key()
|
||||||
if err != nil {
|
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 {
|
return func(n *dag.Node, last bool) error {
|
||||||
k, err := n.Key()
|
k, err := n.Key()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -125,7 +125,7 @@ func arrComp(a, b []byte) error {
|
|||||||
|
|
||||||
type dagservAndPinner struct {
|
type dagservAndPinner struct {
|
||||||
ds merkledag.DAGService
|
ds merkledag.DAGService
|
||||||
mp pin.ManualPinner
|
mp pin.Pinner
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestIndirectBlocks(t *testing.T) {
|
func TestIndirectBlocks(t *testing.T) {
|
||||||
|
@ -23,7 +23,7 @@ type File struct {
|
|||||||
|
|
||||||
// NewFile returns a NewFile object with the given parameters
|
// NewFile returns a NewFile object with the given parameters
|
||||||
func NewFile(name string, node *dag.Node, parent childCloser, fs *Filesystem) (*File, error) {
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@ import (
|
|||||||
|
|
||||||
type dagservAndPinner struct {
|
type dagservAndPinner struct {
|
||||||
ds DAGService
|
ds DAGService
|
||||||
mp pin.ManualPinner
|
mp pin.Pinner
|
||||||
}
|
}
|
||||||
|
|
||||||
func getDagservAndPinner(t *testing.T) dagservAndPinner {
|
func getDagservAndPinner(t *testing.T) dagservAndPinner {
|
||||||
@ -36,7 +36,7 @@ func getDagservAndPinner(t *testing.T) dagservAndPinner {
|
|||||||
bs := bstore.NewBlockstore(db)
|
bs := bstore.NewBlockstore(db)
|
||||||
blockserv := bserv.New(bs, offline.Exchange(bs))
|
blockserv := bserv.New(bs, offline.Exchange(bs))
|
||||||
dserv := NewDAGService(blockserv)
|
dserv := NewDAGService(blockserv)
|
||||||
mpin := pin.NewPinner(db, dserv).GetManual()
|
mpin := pin.NewPinner(db, dserv)
|
||||||
return dagservAndPinner{
|
return dagservAndPinner{
|
||||||
ds: dserv,
|
ds: dserv,
|
||||||
mp: mpin,
|
mp: mpin,
|
||||||
|
28
pin/pin.go
28
pin/pin.go
@ -34,22 +34,22 @@ type Pinner interface {
|
|||||||
IsPinned(key.Key) bool
|
IsPinned(key.Key) bool
|
||||||
Pin(context.Context, *mdag.Node, bool) error
|
Pin(context.Context, *mdag.Node, bool) error
|
||||||
Unpin(context.Context, key.Key, 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
|
Flush() error
|
||||||
GetManual() ManualPinner
|
|
||||||
DirectKeys() []key.Key
|
DirectKeys() []key.Key
|
||||||
IndirectKeys() map[key.Key]int
|
IndirectKeys() map[key.Key]int
|
||||||
RecursiveKeys() []key.Key
|
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
|
// pinner implements the Pinner interface
|
||||||
type pinner struct {
|
type pinner struct {
|
||||||
lock sync.RWMutex
|
lock sync.RWMutex
|
||||||
@ -308,8 +308,8 @@ func loadSet(d ds.Datastore, k ds.Key, val interface{}) error {
|
|||||||
return json.Unmarshal(bf, val)
|
return json.Unmarshal(bf, val)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PinWithMode is a method on ManualPinners, allowing the user to have fine
|
// PinWithMode allows the user to have fine grained control over pin
|
||||||
// grained control over pin counts
|
// counts
|
||||||
func (p *pinner) PinWithMode(k key.Key, mode PinMode) {
|
func (p *pinner) PinWithMode(k key.Key, mode PinMode) {
|
||||||
p.lock.Lock()
|
p.lock.Lock()
|
||||||
defer p.lock.Unlock()
|
defer p.lock.Unlock()
|
||||||
@ -322,7 +322,3 @@ func (p *pinner) PinWithMode(k key.Key, mode PinMode) {
|
|||||||
p.indirPin.Increment(k)
|
p.indirPin.Increment(k)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *pinner) GetManual() ManualPinner {
|
|
||||||
return p
|
|
||||||
}
|
|
||||||
|
@ -37,7 +37,7 @@ var log = logging.Logger("dagio")
|
|||||||
type DagModifier struct {
|
type DagModifier struct {
|
||||||
dagserv mdag.DAGService
|
dagserv mdag.DAGService
|
||||||
curNode *mdag.Node
|
curNode *mdag.Node
|
||||||
mp pin.ManualPinner
|
mp pin.Pinner
|
||||||
|
|
||||||
splitter chunk.SplitterGen
|
splitter chunk.SplitterGen
|
||||||
ctx context.Context
|
ctx context.Context
|
||||||
@ -50,7 +50,7 @@ type DagModifier struct {
|
|||||||
read *uio.DagReader
|
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{
|
return &DagModifier{
|
||||||
curNode: from.Copy(),
|
curNode: from.Copy(),
|
||||||
dagserv: serv,
|
dagserv: serv,
|
||||||
|
@ -27,25 +27,25 @@ import (
|
|||||||
context "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
|
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()
|
dstore := ds.NewMapDatastore()
|
||||||
tsds := sync.MutexWrap(dstore)
|
tsds := sync.MutexWrap(dstore)
|
||||||
bstore := blockstore.NewBlockstore(tsds)
|
bstore := blockstore.NewBlockstore(tsds)
|
||||||
bserv := bs.New(bstore, offline.Exchange(bstore))
|
bserv := bs.New(bstore, offline.Exchange(bstore))
|
||||||
dserv := mdag.NewDAGService(bserv)
|
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()
|
dstore := ds.NewMapDatastore()
|
||||||
tsds := sync.MutexWrap(dstore)
|
tsds := sync.MutexWrap(dstore)
|
||||||
bstore := blockstore.NewBlockstore(tsds)
|
bstore := blockstore.NewBlockstore(tsds)
|
||||||
bserv := bs.New(bstore, offline.Exchange(bstore))
|
bserv := bs.New(bstore, offline.Exchange(bstore))
|
||||||
dserv := mdag.NewDAGService(bserv)
|
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)
|
in := io.LimitReader(u.NewTimeSeededRand(), size)
|
||||||
node, err := imp.BuildTrickleDagFromReader(dserv, sizeSplitterGen(500)(in), imp.BasicPinnerCB(pinner))
|
node, err := imp.BuildTrickleDagFromReader(dserv, sizeSplitterGen(500)(in), imp.BasicPinnerCB(pinner))
|
||||||
if err != nil {
|
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())
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
defer cancel() // in case error occurs during operation
|
defer cancel() // in case error occurs during operation
|
||||||
keychan, err := bs.AllKeysChan(ctx)
|
keychan, err := bs.AllKeysChan(ctx)
|
||||||
|
Reference in New Issue
Block a user