mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-23 11:27:42 +08:00
This implements #5133 introducing an option to limit how deep we fetch and store the DAG associated to a recursive pin ("--max-depth"). This feature comes motivated by the need to fetch and pin partial DAGs in order to do DAG sharding with IPFS Cluster. This means that, when pinning something to --max-depth, the DAG will be fetched only to that depth and not more. In order to get this, the PR introduces new recursive pin types: "recursive1" means: the given CID is pinned along with its direct children (maxDepth=1) "recursive2" means: the given CID is pinned along with its direct children and its grandchildren. And so on... This required introducing "maxDepth" limits to all the functions walking down DAGs (in merkledag, pin, core/commands, core/coreapi, exchange/reprovide modules). maxDepth == -1 effectively acts as no-limit, and all these functions behave like they did before. In order to facilitate the task, a new CID Set type has been added: thirdparty/recpinset. This set carries the MaxDepth associated to every Cid. This allows to shortcut exploring already explored branches just like the original cid.Set does. It also allows to store the Recursive pinset (and replaces cid.Set). recpinset should be moved outside to a different repo eventually. TODO: tests TODO: refs -r with --max-depth License: MIT Signed-off-by: Hector Sanjuan <code@hector.link>
131 lines
2.8 KiB
Go
131 lines
2.8 KiB
Go
package options
|
|
|
|
type PinAddSettings struct {
|
|
Recursive bool
|
|
MaxDepth int
|
|
}
|
|
|
|
type PinLsSettings struct {
|
|
Type string
|
|
}
|
|
|
|
type PinUpdateSettings struct {
|
|
Unpin bool
|
|
}
|
|
|
|
type PinAddOption func(*PinAddSettings) error
|
|
type PinLsOption func(settings *PinLsSettings) error
|
|
type PinUpdateOption func(*PinUpdateSettings) error
|
|
|
|
func PinAddOptions(opts ...PinAddOption) (*PinAddSettings, error) {
|
|
options := &PinAddSettings{
|
|
Recursive: true,
|
|
MaxDepth: -1,
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
err := opt(options)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return options, nil
|
|
}
|
|
|
|
func PinLsOptions(opts ...PinLsOption) (*PinLsSettings, error) {
|
|
options := &PinLsSettings{
|
|
Type: "all",
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
err := opt(options)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return options, nil
|
|
}
|
|
|
|
func PinUpdateOptions(opts ...PinUpdateOption) (*PinUpdateSettings, error) {
|
|
options := &PinUpdateSettings{
|
|
Unpin: true,
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
err := opt(options)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
return options, nil
|
|
}
|
|
|
|
type pinType struct{}
|
|
|
|
type pinOpts struct {
|
|
Type pinType
|
|
}
|
|
|
|
var Pin pinOpts
|
|
|
|
// All is an option for Pin.Ls which will make it return all pins. It is
|
|
// the default
|
|
func (pinType) All() PinLsOption {
|
|
return Pin.pinType("all")
|
|
}
|
|
|
|
// Recursive is an option for Pin.Ls which will make it only return recursive
|
|
// pins
|
|
func (pinType) Recursive() PinLsOption {
|
|
return Pin.pinType("recursive")
|
|
}
|
|
|
|
// Direct is an option for Pin.Ls which will make it only return direct (non
|
|
// recursive) pins
|
|
func (pinType) Direct() PinLsOption {
|
|
return Pin.pinType("direct")
|
|
}
|
|
|
|
// Indirect is an option for Pin.Ls which will make it only return indirect pins
|
|
// (objects referenced by other recursively pinned objects)
|
|
func (pinType) Indirect() PinLsOption {
|
|
return Pin.pinType("indirect")
|
|
}
|
|
|
|
// Recursive is an option for Pin.Add which specifies whether to pin an entire
|
|
// object tree or just one object. Default: true
|
|
func (pinOpts) Recursive(recursive bool) PinAddOption {
|
|
return func(settings *PinAddSettings) error {
|
|
settings.Recursive = recursive
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// Type is an option for Pin.Ls which allows to specify which pin types should
|
|
// be returned
|
|
//
|
|
// Supported values:
|
|
// * "direct" - directly pinned objects
|
|
// * "recursive" - roots of recursive pins
|
|
// * "indirect" - indirectly pinned objects (referenced by recursively pinned
|
|
// objects)
|
|
// * "all" - all pinned objects (default)
|
|
func (pinOpts) pinType(t string) PinLsOption {
|
|
return func(settings *PinLsSettings) error {
|
|
settings.Type = t
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// Unpin is an option for Pin.Update which specifies whether to remove the old pin.
|
|
// Default is true.
|
|
func (pinOpts) Unpin(unpin bool) PinUpdateOption {
|
|
return func(settings *PinUpdateSettings) error {
|
|
settings.Unpin = unpin
|
|
return nil
|
|
}
|
|
}
|