1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-06-28 17:03:58 +08:00

Merge pull request #4696 from ipfs/doc/golint-pin

Doc: golint-ify pin package
This commit is contained in:
Whyrusleeping
2018-02-13 12:54:52 -08:00
committed by GitHub
3 changed files with 52 additions and 25 deletions

View File

@ -494,7 +494,7 @@ type RefKeyList struct {
func pinLsKeys(args []string, typeStr string, ctx context.Context, n *core.IpfsNode) (map[string]RefKeyObject, error) { func pinLsKeys(args []string, typeStr string, ctx context.Context, n *core.IpfsNode) (map[string]RefKeyObject, error) {
mode, ok := pin.StringToPinMode(typeStr) mode, ok := pin.StringToMode(typeStr)
if !ok { if !ok {
return nil, fmt.Errorf("invalid pin mode '%s'", typeStr) return nil, fmt.Errorf("invalid pin mode '%s'", typeStr)
} }

View File

@ -1,3 +1,4 @@
// Package gc provides garbage collection for go-ipfs.
package gc package gc
import ( import (
@ -35,7 +36,6 @@ type Result struct {
// //
// The routine then iterates over every block in the blockstore and // The routine then iterates over every block in the blockstore and
// deletes any block that is not found in the marked set. // deletes any block that is not found in the marked set.
//
func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn pin.Pinner, bestEffortRoots []*cid.Cid) <-chan Result { func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn pin.Pinner, bestEffortRoots []*cid.Cid) <-chan Result {
elock := log.EventBegin(ctx, "GC.lockWait") elock := log.EventBegin(ctx, "GC.lockWait")
@ -125,6 +125,9 @@ func GC(ctx context.Context, bs bstore.GCBlockstore, dstor dstore.Datastore, pn
return output return output
} }
// Descendants recursively finds all the descendants of the given roots and
// adds them to the given cid.Set, using the provided dag.GetLinks function
// 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 {
for _, c := range roots { for _, c := range roots {
set.Add(c) set.Add(c)
@ -191,24 +194,38 @@ func ColoredSet(ctx context.Context, pn pin.Pinner, ng ipld.NodeGetter, bestEffo
return gcs, nil return gcs, nil
} }
// ErrCannotFetchAllLinks is returned as the last Result in the GC output
// channel when there was a error creating the marked set because of a
// problem when finding descendants.
var ErrCannotFetchAllLinks = errors.New("garbage collection aborted: could not retrieve some links") var ErrCannotFetchAllLinks = errors.New("garbage collection aborted: could not retrieve some links")
// ErrCannotDeleteSomeBlocks is returned when removing blocks marked for
// deletion fails as the last Result in GC output channel.
var ErrCannotDeleteSomeBlocks = errors.New("garbage collection incomplete: could not delete some blocks") var ErrCannotDeleteSomeBlocks = errors.New("garbage collection incomplete: could not delete some blocks")
// CannotFetchLinksError provides detailed information about which links
// could not be fetched and can appear as a Result in the GC output channel.
type CannotFetchLinksError struct { type CannotFetchLinksError struct {
Key *cid.Cid Key *cid.Cid
Err error Err error
} }
// Error implements the error interface for this type with a useful
// message.
func (e *CannotFetchLinksError) Error() string { func (e *CannotFetchLinksError) Error() string {
return fmt.Sprintf("could not retrieve links for %s: %s", e.Key, e.Err) return fmt.Sprintf("could not retrieve links for %s: %s", e.Key, e.Err)
} }
// CannotDeleteBlockError provides detailed information about which
// blocks could not be deleted and can appear as a Result in the GC output
// channel.
type CannotDeleteBlockError struct { type CannotDeleteBlockError struct {
Key *cid.Cid Key *cid.Cid
Err error Err error
} }
// Error implements the error interface for this type with a
// useful message.
func (e *CannotDeleteBlockError) Error() string { func (e *CannotDeleteBlockError) Error() string {
return fmt.Sprintf("could not remove %s: %s", e.Key, e.Err) return fmt.Sprintf("could not remove %s: %s", e.Key, e.Err)
} }

View File

@ -1,4 +1,4 @@
// package pin implements structures and methods to keep track of // Package pin implements structures and methods to keep track of
// which objects a user wants to keep stored locally. // which objects a user wants to keep stored locally.
package pin package pin
@ -43,11 +43,14 @@ const (
linkAll = "all" linkAll = "all"
) )
type PinMode int // Mode allows to specify different types of pin (recursive, direct etc.).
// See the Pin Modes constants for a full list.
type Mode int
// Pin Modes
const ( const (
// Recursive pins pin the target cids along with any reachable children. // Recursive pins pin the target cids along with any reachable children.
Recursive PinMode = iota Recursive Mode = iota
// Direct pins pin just the target cid. // Direct pins pin just the target cid.
Direct Direct
@ -65,8 +68,9 @@ const (
Any Any
) )
func PinModeToString(mode PinMode) (string, bool) { // ModeToString returns a human-readable name for the Mode.
m := map[PinMode]string{ func ModeToString(mode Mode) (string, bool) {
m := map[Mode]string{
Recursive: linkRecursive, Recursive: linkRecursive,
Direct: linkDirect, Direct: linkDirect,
Indirect: linkIndirect, Indirect: linkIndirect,
@ -78,8 +82,10 @@ func PinModeToString(mode PinMode) (string, bool) {
return s, ok return s, ok
} }
func StringToPinMode(s string) (PinMode, bool) { // StringToMode parses the result of ModeToString() back to a Mode.
m := map[string]PinMode{ // It returns a boolean which is set to false if the mode is unknown.
func StringToMode(s string) (Mode, bool) {
m := map[string]Mode{
linkRecursive: Recursive, linkRecursive: Recursive,
linkDirect: Direct, linkDirect: Direct,
linkIndirect: Indirect, linkIndirect: Indirect,
@ -92,6 +98,10 @@ func StringToPinMode(s string) (PinMode, bool) {
return mode, ok return mode, ok
} }
// A Pinner provides the necessary methods to keep track of Nodes which are
// to be kept locally, according to a pin mode. In practice, a Pinner is in
// in charge of keeping the list of items from the local storage that should
// not be garbaged-collected.
type Pinner interface { type Pinner interface {
// IsPinned returns whether or not the given cid is pinned // IsPinned returns whether or not the given cid is pinned
// and an explanation of why its pinned // and an explanation of why its pinned
@ -99,7 +109,7 @@ type Pinner interface {
// IsPinnedWithType returns whether or not the given cid is pinned with the // IsPinnedWithType returns whether or not the given cid is pinned with the
// given pin type, as well as returning the type of pin its pinned with. // given pin type, as well as returning the type of pin its pinned with.
IsPinnedWithType(*cid.Cid, PinMode) (string, bool, error) IsPinnedWithType(*cid.Cid, Mode) (string, bool, error)
// Pin the given node, optionally recursively. // Pin the given node, optionally recursively.
Pin(ctx context.Context, node ipld.Node, recursive bool) error Pin(ctx context.Context, node ipld.Node, recursive bool) error
@ -120,12 +130,12 @@ type Pinner interface {
// PinWithMode is for manually editing the pin structure. Use with // PinWithMode is for manually editing the pin structure. Use with
// care! If used improperly, garbage collection may not be // care! If used improperly, garbage collection may not be
// successful. // successful.
PinWithMode(*cid.Cid, PinMode) PinWithMode(*cid.Cid, Mode)
// RemovePinWithMode is for manually editing the pin structure. // RemovePinWithMode is for manually editing the pin structure.
// Use with care! If used improperly, garbage collection may not // Use with care! If used improperly, garbage collection may not
// be successful. // be successful.
RemovePinWithMode(*cid.Cid, PinMode) RemovePinWithMode(*cid.Cid, Mode)
// Flush writes the pin state to the backing datastore // Flush writes the pin state to the backing datastore
Flush() error Flush() error
@ -141,19 +151,19 @@ type Pinner interface {
InternalPins() []*cid.Cid InternalPins() []*cid.Cid
} }
// Pinned represents CID which has been pinned with a pinning strategy.
// The Via field allows to identify the pinning parent of this CID, in the
// case that the item is not pinned directly (but rather pinned recursively
// by some ascendant).
type Pinned struct { type Pinned struct {
Key *cid.Cid Key *cid.Cid
Mode PinMode Mode Mode
Via *cid.Cid Via *cid.Cid
} }
// Pinned returns whether or not the given cid is pinned // Pinned returns whether or not the given cid is pinned
func (p Pinned) Pinned() bool { func (p Pinned) Pinned() bool {
if p.Mode == NotPinned { return p.Mode != NotPinned
return false
} else {
return true
}
} }
// String Returns pin status as string // String Returns pin status as string
@ -164,7 +174,7 @@ func (p Pinned) String() string {
case Indirect: case Indirect:
return fmt.Sprintf("pinned via %s", p.Via) return fmt.Sprintf("pinned via %s", p.Via)
default: default:
modeStr, _ := PinModeToString(p.Mode) modeStr, _ := ModeToString(p.Mode)
return fmt.Sprintf("pinned: %s", modeStr) return fmt.Sprintf("pinned: %s", modeStr)
} }
} }
@ -240,6 +250,7 @@ func (p *pinner) Pin(ctx context.Context, node ipld.Node, recurse bool) error {
return nil return nil
} }
// ErrNotPinned is returned when trying to unpin items which are not pinned.
var ErrNotPinned = fmt.Errorf("not pinned") var ErrNotPinned = fmt.Errorf("not pinned")
// Unpin a given key // Unpin a given key
@ -258,9 +269,8 @@ func (p *pinner) Unpin(ctx context.Context, c *cid.Cid, recursive bool) error {
if recursive { if recursive {
p.recursePin.Remove(c) p.recursePin.Remove(c)
return nil return nil
} else {
return fmt.Errorf("%s is pinned recursively", c)
} }
return fmt.Errorf("%s is pinned recursively", c)
case "direct": case "direct":
p.directPin.Remove(c) p.directPin.Remove(c)
return nil return nil
@ -283,7 +293,7 @@ func (p *pinner) IsPinned(c *cid.Cid) (string, bool, error) {
// IsPinnedWithType returns whether or not the given cid is pinned with the // IsPinnedWithType returns whether or not the given cid is pinned with the
// given pin type, as well as returning the type of pin its pinned with. // given pin type, as well as returning the type of pin its pinned with.
func (p *pinner) IsPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error) { func (p *pinner) IsPinnedWithType(c *cid.Cid, mode Mode) (string, bool, error) {
p.lock.RLock() p.lock.RLock()
defer p.lock.RUnlock() defer p.lock.RUnlock()
return p.isPinnedWithType(c, mode) return p.isPinnedWithType(c, mode)
@ -291,7 +301,7 @@ func (p *pinner) IsPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error
// isPinnedWithType is the implementation of IsPinnedWithType that does not lock. // isPinnedWithType is the implementation of IsPinnedWithType that does not lock.
// intended for use by other pinned methods that already take locks // intended for use by other pinned methods that already take locks
func (p *pinner) isPinnedWithType(c *cid.Cid, mode PinMode) (string, bool, error) { func (p *pinner) isPinnedWithType(c *cid.Cid, mode Mode) (string, bool, error) {
switch mode { switch mode {
case Any, Direct, Indirect, Recursive, Internal: case Any, Direct, Indirect, Recursive, Internal:
default: default:
@ -404,7 +414,7 @@ func (p *pinner) CheckIfPinned(cids ...*cid.Cid) ([]Pinned, error) {
// RemovePinWithMode is for manually editing the pin structure. // RemovePinWithMode is for manually editing the pin structure.
// Use with care! If used improperly, garbage collection may not // Use with care! If used improperly, garbage collection may not
// be successful. // be successful.
func (p *pinner) RemovePinWithMode(c *cid.Cid, mode PinMode) { func (p *pinner) RemovePinWithMode(c *cid.Cid, mode Mode) {
p.lock.Lock() p.lock.Lock()
defer p.lock.Unlock() defer p.lock.Unlock()
switch mode { switch mode {
@ -584,7 +594,7 @@ func (p *pinner) InternalPins() []*cid.Cid {
// PinWithMode allows the user to have fine grained control over pin // PinWithMode allows the user to have fine grained control over pin
// counts // counts
func (p *pinner) PinWithMode(c *cid.Cid, mode PinMode) { func (p *pinner) PinWithMode(c *cid.Cid, mode Mode) {
p.lock.Lock() p.lock.Lock()
defer p.lock.Unlock() defer p.lock.Unlock()
switch mode { switch mode {