Skip to content

Commit b19f7c9

Browse files
committed
fix: skip libp2p.ResourceManager if disabled
This ensures 'ipfs swarm limit|stats' work only when enabled.
1 parent cb511e1 commit b19f7c9

File tree

3 files changed

+48
-55
lines changed

3 files changed

+48
-55
lines changed

core/commands/swarm.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ For permanent limits set Swarm.ResourceMgr.Limits in the $IPFS_PATH/config file.
394394
}
395395

396396
if node.ResourceManager == nil {
397-
return fmt.Errorf("no resource manager available, make sure the daemon is running")
397+
return fmt.Errorf("no resource manager available: make sure the daemon is running with Swarm.ResourceMgr.Enabled in the config")
398398
}
399399

400400
scope := req.Arguments[0]

core/node/groups.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"os"
78
"time"
89

910
blockstore "github.com/ipfs/go-ipfs-blockstore"
@@ -140,12 +141,22 @@ func LibP2P(bcfg *BuildCfg, cfg *config.Config) fx.Option {
140141
"If you want to continue running a circuit v1 relay, please use the standalone relay daemon: https://github.com/libp2p/go-libp2p-relay-daemon (with RelayV1.Enabled: true)")
141142
}
142143

144+
// Swarm.ResourceMgr
145+
enableResourceMgr := cfg.Swarm.ResourceMgr.Enabled.WithDefault(false)
146+
/// ENV overrides Config (if present)
147+
switch os.Getenv("IPFS_RCMGR") {
148+
case "0", "false":
149+
enableResourceMgr = false
150+
case "1", "true":
151+
enableResourceMgr = true
152+
}
153+
143154
// Gather all the options
144155
opts := fx.Options(
145156
BaseLibP2P,
146157

147158
// Services (resource management)
148-
fx.Provide(libp2p.ResourceManager(cfg.Swarm.ResourceMgr)),
159+
maybeProvide(libp2p.ResourceManager(cfg.Swarm.ResourceMgr), enableResourceMgr),
149160

150161
fx.Provide(libp2p.AddrFilters(cfg.Swarm.AddrFilters)),
151162
fx.Provide(libp2p.AddrsFactory(cfg.Addresses.Announce, cfg.Addresses.AppendAnnounce, cfg.Addresses.NoAnnounce)),

core/node/libp2p/rcmgr.go

+35-53
Original file line numberDiff line numberDiff line change
@@ -26,66 +26,48 @@ func ResourceManager(cfg cfg.ResourceMgr) func(fx.Lifecycle, repo.Repo) (network
2626
var manager network.ResourceManager
2727
var opts Libp2pOpts
2828

29-
// Config Swarm.ResourceMgr.Enabled decides if we run a real manager
30-
enabled := cfg.Enabled.WithDefault(false)
31-
32-
/// ENV overrides Config (if present)
33-
// TODO: document IPFS_RCMGR and IPFS_DEBUG_RCMGR in docs/environment-variables.md
34-
switch os.Getenv("IPFS_RCMGR") {
35-
case "0", "false":
36-
enabled = false
37-
case "1", "true":
38-
enabled = true
29+
log.Debug("libp2p resource manager is enabled")
30+
31+
// Try defaults from limit.json if provided
32+
// (a convention to make libp2p team life easier)
33+
// TODO: look in current dir and in IPFS_PATH
34+
_, err := os.Stat(NetLimitDefaultFilename)
35+
if !errors.Is(err, os.ErrNotExist) {
36+
limitFile, err := os.Open(NetLimitDefaultFilename)
37+
if err != nil {
38+
return nil, opts, fmt.Errorf("error opening limit JSON file %s: %w",
39+
NetLimitDefaultFilename, err)
40+
}
41+
defer limitFile.Close() //nolint:errcheck
42+
limiter, err = rcmgr.NewDefaultLimiterFromJSON(limitFile)
43+
if err != nil {
44+
return nil, opts, fmt.Errorf("error parsing limit file: %w", err)
45+
}
46+
47+
} else {
48+
// Use defaults from go-libp2p
49+
log.Debug("limit file %s not found, creating a default resource manager", NetLimitDefaultFilename)
50+
limiter = rcmgr.NewDefaultLimiter()
3951
}
4052

41-
if enabled {
42-
log.Debug("libp2p resource manager is enabled")
43-
44-
// Try defaults from limit.json if provided
45-
// (a convention to make libp2p team life easier)
46-
// TODO: look in current dir and in IPFS_PATH
47-
_, err := os.Stat(NetLimitDefaultFilename)
48-
if !errors.Is(err, os.ErrNotExist) {
49-
limitFile, err := os.Open(NetLimitDefaultFilename)
50-
if err != nil {
51-
return nil, opts, fmt.Errorf("error opening limit JSON file %s: %w",
52-
NetLimitDefaultFilename, err)
53-
}
54-
defer limitFile.Close() //nolint:errcheck
55-
limiter, err = rcmgr.NewDefaultLimiterFromJSON(limitFile)
56-
if err != nil {
57-
return nil, opts, fmt.Errorf("error parsing limit file: %w", err)
58-
}
59-
60-
} else {
61-
// Use defaults from go-libp2p
62-
log.Debug("limit file %s not found, creating a default resource manager", NetLimitDefaultFilename)
63-
limiter = rcmgr.NewDefaultLimiter()
64-
}
53+
libp2p.SetDefaultServiceLimits(limiter)
6554

66-
libp2p.SetDefaultServiceLimits(limiter)
55+
var ropts []rcmgr.Option
56+
if os.Getenv("IPFS_DEBUG_RCMGR") != "" {
57+
ropts = append(ropts, rcmgr.WithTrace("rcmgr.json.gz"))
58+
}
6759

68-
var ropts []rcmgr.Option
69-
if os.Getenv("IPFS_DEBUG_RCMGR") != "" {
70-
ropts = append(ropts, rcmgr.WithTrace("rcmgr.json.gz"))
71-
}
60+
manager, err = rcmgr.NewResourceManager(limiter, ropts...)
61+
if err != nil {
62+
return nil, opts, fmt.Errorf("error creating resource manager: %w", err)
63+
}
7264

73-
manager, err = rcmgr.NewResourceManager(limiter, ropts...)
65+
// Apply user-defined Swarm.ResourceMgr.Limits
66+
for scope, userLimit := range cfg.Limits {
67+
err := NetSetLimit(manager, scope, userLimit)
7468
if err != nil {
75-
return nil, opts, fmt.Errorf("error creating resource manager: %w", err)
69+
return nil, opts, fmt.Errorf("error while applying Swarm.ResourceMgr.Limits for scope %q: %w", scope, err)
7670
}
77-
78-
// Apply user-defined Swarm.ResourceMgr.Limits
79-
for scope, userLimit := range cfg.Limits {
80-
err := NetSetLimit(manager, scope, userLimit)
81-
if err != nil {
82-
return nil, opts, fmt.Errorf("error while applying Swarm.ResourceMgr.Limits for scope %q: %w", scope, err)
83-
}
84-
}
85-
86-
} else {
87-
log.Debug("libp2p resource manager is disabled")
88-
manager = network.NullResourceManager
8971
}
9072

9173
opts.Opts = append(opts.Opts, libp2p.ResourceManager(manager))

0 commit comments

Comments
 (0)