mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-24 11:57:44 +08:00
* update go-libp2p to v0.18.0
* initialize the resource manager
* add resource manager stats/limit commands
* load limit file when building resource manager
* log absent limit file
* write rcmgr to file when IPFS_DEBUG_RCMGR is set
* fix: mark swarm limit|stats as experimental
* feat(cfg): opt-in Swarm.ResourceMgr
This ensures we can safely test the resource manager without impacting
default behavior.
- Resource manager is disabled by default
- Default for Swarm.ResourceMgr.Enabled is false for now
- Swarm.ResourceMgr.Limits allows user to tweak limits per specific
scope in a way that is persisted across restarts
- 'ipfs swarm limit system' outputs human-readable json
- 'ipfs swarm limit system new-limits.json' sets new runtime limits
(but does not change Swarm.ResourceMgr.Limits in the config)
Conventions to make libp2p devs life easier:
- 'IPFS_RCMGR=1 ipfs daemon' overrides the config and enables resource manager
- 'limit.json' overrides implicit defaults from libp2p (if present)
* docs(config): small tweaks
* fix: skip libp2p.ResourceManager if disabled
This ensures 'ipfs swarm limit|stats' work only when enabled.
* fix: use NullResourceManager when disabled
This reverts commit b19f7c9eca.
after clarification feedback from
https://github.com/ipfs/go-ipfs/pull/8680#discussion_r841680182
* style: rename IPFS_RCMGR to LIBP2P_RCMGR
preexisting libp2p toggles use LIBP2P_ prefix
* test: Swarm.ResourceMgr
* fix: location of opt-in limit.json and rcmgr.json.gz
Places these files inside of IPFS_PATH
* Update docs/config.md
* feat: expose rcmgr metrics when enabled (#8785)
* add metrics for the resource manager
* export protocol and service name in Prometheus metrics
* fix: expose rcmgr metrics only when enabled
Co-authored-by: Marcin Rataj <lidel@lidel.org>
* refactor: rcmgr_metrics.go
* refactor: rcmgr_defaults.go
This file defines implicit limit defaults used when Swarm.ResourceMgr.Enabled
We keep vendored copy to ensure go-ipfs is not impacted when go-libp2p
decides to change defaults in any of the future releases.
* refactor: adjustedDefaultLimits
Cleans up the way we initialize defaults and adds a fix for case
when connection manager runs with high limits.
It also hides `Swarm.ResourceMgr.Limits` until we have a better
understanding what syntax makes sense.
* chore: cleanup after a review
* fix: restore go-ipld-prime v0.14.2
* fix: restore go-ds-flatfs v0.5.1
Co-authored-by: Lucas Molas <schomatis@gmail.com>
Co-authored-by: Marcin Rataj <lidel@lidel.org>
283 lines
5.1 KiB
Go
283 lines
5.1 KiB
Go
package commands
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
cmds "github.com/ipfs/go-ipfs-cmds"
|
|
)
|
|
|
|
func collectPaths(prefix string, cmd *cmds.Command, out map[string]struct{}) {
|
|
for name, sub := range cmd.Subcommands {
|
|
path := prefix + "/" + name
|
|
out[path] = struct{}{}
|
|
collectPaths(path, sub, out)
|
|
}
|
|
}
|
|
|
|
func TestROCommands(t *testing.T) {
|
|
list := []string{
|
|
"/block",
|
|
"/block/get",
|
|
"/block/stat",
|
|
"/cat",
|
|
"/commands",
|
|
"/commands/completion",
|
|
"/commands/completion/bash",
|
|
"/dag",
|
|
"/dag/get",
|
|
"/dag/resolve",
|
|
"/dag/stat",
|
|
"/dag/export",
|
|
"/dns",
|
|
"/get",
|
|
"/ls",
|
|
"/name",
|
|
"/name/resolve",
|
|
"/object",
|
|
"/object/data",
|
|
"/object/get",
|
|
"/object/links",
|
|
"/object/stat",
|
|
"/refs",
|
|
"/resolve",
|
|
"/version",
|
|
}
|
|
|
|
cmdSet := make(map[string]struct{})
|
|
collectPaths("", RootRO, cmdSet)
|
|
|
|
for _, path := range list {
|
|
if _, ok := cmdSet[path]; !ok {
|
|
t.Errorf("%q not in result", path)
|
|
} else {
|
|
delete(cmdSet, path)
|
|
}
|
|
}
|
|
|
|
for path := range cmdSet {
|
|
t.Errorf("%q in result but shouldn't be", path)
|
|
}
|
|
|
|
for _, path := range list {
|
|
path = path[1:] // remove leading slash
|
|
split := strings.Split(path, "/")
|
|
sub, err := RootRO.Get(split)
|
|
if err != nil {
|
|
t.Errorf("error getting subcommand %q: %v", path, err)
|
|
} else if sub == nil {
|
|
t.Errorf("subcommand %q is nil even though there was no error", path)
|
|
}
|
|
}
|
|
}
|
|
func TestCommands(t *testing.T) {
|
|
list := []string{
|
|
"/add",
|
|
"/bitswap",
|
|
"/bitswap/ledger",
|
|
"/bitswap/reprovide",
|
|
"/bitswap/stat",
|
|
"/bitswap/wantlist",
|
|
"/block",
|
|
"/block/get",
|
|
"/block/put",
|
|
"/block/rm",
|
|
"/block/stat",
|
|
"/bootstrap",
|
|
"/bootstrap/add",
|
|
"/bootstrap/add/default",
|
|
"/bootstrap/list",
|
|
"/bootstrap/rm",
|
|
"/bootstrap/rm/all",
|
|
"/cat",
|
|
"/cid",
|
|
"/cid/base32",
|
|
"/cid/bases",
|
|
"/cid/codecs",
|
|
"/cid/format",
|
|
"/cid/hashes",
|
|
"/commands",
|
|
"/commands/completion",
|
|
"/commands/completion/bash",
|
|
"/config",
|
|
"/config/edit",
|
|
"/config/profile",
|
|
"/config/profile/apply",
|
|
"/config/replace",
|
|
"/config/show",
|
|
"/dag",
|
|
"/dag/export",
|
|
"/dag/get",
|
|
"/dag/import",
|
|
"/dag/put",
|
|
"/dag/resolve",
|
|
"/dag/stat",
|
|
"/dht",
|
|
"/dht/findpeer",
|
|
"/dht/findprovs",
|
|
"/dht/get",
|
|
"/dht/provide",
|
|
"/dht/put",
|
|
"/dht/query",
|
|
"/diag",
|
|
"/diag/cmds",
|
|
"/diag/cmds/clear",
|
|
"/diag/cmds/set-time",
|
|
"/diag/profile",
|
|
"/diag/sys",
|
|
"/dns",
|
|
"/file",
|
|
"/file/ls",
|
|
"/files",
|
|
"/files/chcid",
|
|
"/files/cp",
|
|
"/files/flush",
|
|
"/files/ls",
|
|
"/files/mkdir",
|
|
"/files/mv",
|
|
"/files/read",
|
|
"/files/rm",
|
|
"/files/stat",
|
|
"/files/write",
|
|
"/filestore",
|
|
"/filestore/dups",
|
|
"/filestore/ls",
|
|
"/filestore/verify",
|
|
"/get",
|
|
"/id",
|
|
"/key",
|
|
"/key/export",
|
|
"/key/gen",
|
|
"/key/import",
|
|
"/key/list",
|
|
"/key/rename",
|
|
"/key/rm",
|
|
"/key/rotate",
|
|
"/log",
|
|
"/log/level",
|
|
"/log/ls",
|
|
"/log/tail",
|
|
"/ls",
|
|
"/mount",
|
|
"/multibase",
|
|
"/multibase/decode",
|
|
"/multibase/encode",
|
|
"/multibase/transcode",
|
|
"/multibase/list",
|
|
"/name",
|
|
"/name/publish",
|
|
"/name/pubsub",
|
|
"/name/pubsub/cancel",
|
|
"/name/pubsub/state",
|
|
"/name/pubsub/subs",
|
|
"/name/resolve",
|
|
"/object",
|
|
"/object/data",
|
|
"/object/diff",
|
|
"/object/get",
|
|
"/object/links",
|
|
"/object/new",
|
|
"/object/patch",
|
|
"/object/patch/add-link",
|
|
"/object/patch/append-data",
|
|
"/object/patch/rm-link",
|
|
"/object/patch/set-data",
|
|
"/object/put",
|
|
"/object/stat",
|
|
"/p2p",
|
|
"/p2p/close",
|
|
"/p2p/forward",
|
|
"/p2p/listen",
|
|
"/p2p/ls",
|
|
"/p2p/stream",
|
|
"/p2p/stream/close",
|
|
"/p2p/stream/ls",
|
|
"/pin",
|
|
"/pin/add",
|
|
"/pin/ls",
|
|
"/pin/remote",
|
|
"/pin/remote/add",
|
|
"/pin/remote/ls",
|
|
"/pin/remote/rm",
|
|
"/pin/remote/service",
|
|
"/pin/remote/service/add",
|
|
"/pin/remote/service/ls",
|
|
"/pin/remote/service/rm",
|
|
"/pin/rm",
|
|
"/pin/update",
|
|
"/pin/verify",
|
|
"/ping",
|
|
"/pubsub",
|
|
"/pubsub/ls",
|
|
"/pubsub/peers",
|
|
"/pubsub/pub",
|
|
"/pubsub/sub",
|
|
"/refs",
|
|
"/refs/local",
|
|
"/repo",
|
|
"/repo/fsck",
|
|
"/repo/gc",
|
|
"/repo/stat",
|
|
"/repo/verify",
|
|
"/repo/version",
|
|
"/resolve",
|
|
"/shutdown",
|
|
"/stats",
|
|
"/stats/bitswap",
|
|
"/stats/bw",
|
|
"/stats/dht",
|
|
"/stats/provide",
|
|
"/stats/repo",
|
|
"/swarm",
|
|
"/swarm/addrs",
|
|
"/swarm/addrs/listen",
|
|
"/swarm/addrs/local",
|
|
"/swarm/connect",
|
|
"/swarm/disconnect",
|
|
"/swarm/filters",
|
|
"/swarm/filters/add",
|
|
"/swarm/filters/rm",
|
|
"/swarm/limit",
|
|
"/swarm/peers",
|
|
"/swarm/peering",
|
|
"/swarm/peering/add",
|
|
"/swarm/peering/ls",
|
|
"/swarm/peering/rm",
|
|
"/swarm/stats",
|
|
"/tar",
|
|
"/tar/add",
|
|
"/tar/cat",
|
|
"/update",
|
|
"/urlstore",
|
|
"/urlstore/add",
|
|
"/version",
|
|
"/version/deps",
|
|
}
|
|
|
|
cmdSet := make(map[string]struct{})
|
|
collectPaths("", Root, cmdSet)
|
|
|
|
for _, path := range list {
|
|
if _, ok := cmdSet[path]; !ok {
|
|
t.Errorf("%q not in result", path)
|
|
} else {
|
|
delete(cmdSet, path)
|
|
}
|
|
}
|
|
|
|
for path := range cmdSet {
|
|
t.Errorf("%q in result but shouldn't be", path)
|
|
}
|
|
|
|
for _, path := range list {
|
|
path = path[1:] // remove leading slash
|
|
split := strings.Split(path, "/")
|
|
sub, err := Root.Get(split)
|
|
if err != nil {
|
|
t.Errorf("error getting subcommand %q: %v", path, err)
|
|
} else if sub == nil {
|
|
t.Errorf("subcommand %q is nil even though there was no error", path)
|
|
}
|
|
}
|
|
}
|