Skip to content

Commit c84173a

Browse files
authored
Add Resource Manager to P2P Host (#4815)
Add Resource Manager to P2P Host
2 parents 89b0c63 + a539159 commit c84173a

File tree

9 files changed

+305
-70
lines changed

9 files changed

+305
-70
lines changed

cmd/bootnode/main.go

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,9 @@ func main() {
114114
maxConnPerIP := flag.Int("max_conn_per_ip", 10, "max connections number for same ip")
115115
forceReachabilityPublic := flag.Bool("force_public", false, "forcing the local node to believe it is reachable externally")
116116
connMgrHighWaterMark := flag.Int("cmg_high_watermark", 900, "connection manager trims excess connections when they pass the high watermark")
117+
resourceManagerEnabled := flag.Bool("resmgr-enabled", true, "enable p2p resource manager")
118+
resourceManagerMemoryLimitBytes := flag.Uint64("resmgr-memory-limit-bytes", 0, "memory limit for p2p resource manager")
119+
resourceManagerFileDescriptorsLimit := flag.Uint64("resmgr-file-descriptor-limit", 0, "file descriptor limit for p2p resource manager")
117120
noTransportSecurity := flag.Bool("no_transport_security", false, "disable TLS encrypted transport")
118121
muxer := flag.String("muxer", "mplex, yamux", "protocol muxer to mux per-protocol streams (mplex, yamux)")
119122
userAgent := flag.String("user_agent", defUserAgent, "explicitly set the user-agent, so we can differentiate from other Go libp2p users")
@@ -149,20 +152,23 @@ func main() {
149152
selfPeer := p2p.Peer{IP: *ip, Port: *port}
150153

151154
host, err := p2p.NewHost(p2p.HostConfig{
152-
Self: &selfPeer,
153-
BLSKey: privKey,
154-
BootNodes: nil, // Boot nodes have no boot nodes :) Will be connected when other nodes joined
155-
TrustedNodes: nil,
156-
DataStoreFile: &dataStorePath,
157-
MaxConnPerIP: *maxConnPerIP,
158-
ForceReachabilityPublic: *forceReachabilityPublic,
159-
ConnManagerHighWatermark: *connMgrHighWaterMark,
160-
NoTransportSecurity: *noTransportSecurity,
161-
NAT: true,
162-
UserAgent: *userAgent,
163-
DialTimeout: time.Minute,
164-
Muxer: *muxer,
165-
NoRelay: *noRelay,
155+
Self: &selfPeer,
156+
BLSKey: privKey,
157+
BootNodes: nil, // Boot nodes have no boot nodes :) Will be connected when other nodes joined
158+
TrustedNodes: nil,
159+
DataStoreFile: &dataStorePath,
160+
MaxConnPerIP: *maxConnPerIP,
161+
ForceReachabilityPublic: *forceReachabilityPublic,
162+
ConnManagerHighWatermark: *connMgrHighWaterMark,
163+
ResourceMgrEnabled: *resourceManagerEnabled,
164+
ResourceMgrMemoryLimitBytes: *resourceManagerMemoryLimitBytes,
165+
ResourceMgrFileDescriptorsLimit: *resourceManagerFileDescriptorsLimit,
166+
NoTransportSecurity: *noTransportSecurity,
167+
NAT: true,
168+
UserAgent: *userAgent,
169+
DialTimeout: time.Minute,
170+
Muxer: *muxer,
171+
NoRelay: *noRelay,
166172
})
167173
if err != nil {
168174
utils.FatalErrMsg(err, "cannot initialize network")

cmd/config/config_migrations.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,20 @@ func init() {
466466
return confTree
467467
}
468468

469+
migrations["2.6.4"] = func(confTree *toml.Tree) *toml.Tree {
470+
if confTree.Get("P2P.ResourceMgrEnabled") == nil {
471+
confTree.Set("P2P.ResourceMgrEnabled", defaultConfig.P2P.ResourceMgrEnabled)
472+
}
473+
if confTree.Get("P2P.ResourceMgrMemoryLimitBytes") == nil {
474+
confTree.Set("P2P.ResourceMgrMemoryLimitBytes", defaultConfig.P2P.ResourceMgrMemoryLimitBytes)
475+
}
476+
if confTree.Get("Sync.ResourceMgrFileDescriptorsLimit") == nil {
477+
confTree.Set("Sync.ResourceMgrFileDescriptorsLimit", defaultConfig.P2P.ResourceMgrFileDescriptorsLimit)
478+
}
479+
confTree.Set("Version", "2.6.5")
480+
return confTree
481+
}
482+
469483
// check that the latest version here is the same as in default.go
470484
largestKey := getNextVersion(migrations)
471485
if largestKey != tomlConfigVersion {

cmd/config/default.go

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
nodeconfig "github.com/harmony-one/harmony/internal/configs/node"
1010
)
1111

12-
const tomlConfigVersion = "2.6.4"
12+
const tomlConfigVersion = "2.6.5"
1313

1414
const (
1515
defNetworkType = nodeconfig.Mainnet
@@ -30,22 +30,25 @@ var defaultConfig = harmonyconfig.HarmonyConfig{
3030
Network: GetDefaultNetworkConfig(defNetworkType),
3131
Localnet: GetDefaultLocalnetConfig(),
3232
P2P: harmonyconfig.P2pConfig{
33-
Port: nodeconfig.DefaultP2PPort,
34-
IP: nodeconfig.DefaultPublicListenIP,
35-
KeyFile: "./.hmykey",
36-
DiscConcurrency: nodeconfig.DefaultP2PConcurrency,
37-
MaxConnsPerIP: nodeconfig.DefaultMaxConnPerIP,
38-
DisablePrivateIPScan: false,
39-
MaxPeers: nodeconfig.DefaultMaxPeers,
40-
ConnManagerLowWatermark: nodeconfig.DefaultConnManagerLowWatermark,
41-
ConnManagerHighWatermark: nodeconfig.DefaultConnManagerHighWatermark,
42-
WaitForEachPeerToConnect: nodeconfig.DefaultWaitForEachPeerToConnect,
43-
NoTransportSecurity: nodeconfig.DefaultNoTransportSecurity,
44-
NAT: nodeconfig.DefaultNAT,
45-
UserAgent: nodeconfig.DefaultUserAgent,
46-
DialTimeout: nodeconfig.DefaultDialTimeout,
47-
Muxer: nodeconfig.DefaultMuxer,
48-
NoRelay: nodeconfig.DefaultNoRelay,
33+
Port: nodeconfig.DefaultP2PPort,
34+
IP: nodeconfig.DefaultPublicListenIP,
35+
KeyFile: "./.hmykey",
36+
DiscConcurrency: nodeconfig.DefaultP2PConcurrency,
37+
MaxConnsPerIP: nodeconfig.DefaultMaxConnPerIP,
38+
DisablePrivateIPScan: false,
39+
MaxPeers: nodeconfig.DefaultMaxPeers,
40+
ConnManagerLowWatermark: nodeconfig.DefaultConnManagerLowWatermark,
41+
ConnManagerHighWatermark: nodeconfig.DefaultConnManagerHighWatermark,
42+
ResourceMgrEnabled: nodeconfig.DefaultResourceMgrEnabled,
43+
ResourceMgrMemoryLimitBytes: nodeconfig.DefaultResourceMgrMemoryLimitBytes,
44+
ResourceMgrFileDescriptorsLimit: nodeconfig.DefaultResourceMgrFileDescriptorsLimit,
45+
WaitForEachPeerToConnect: nodeconfig.DefaultWaitForEachPeerToConnect,
46+
NoTransportSecurity: nodeconfig.DefaultNoTransportSecurity,
47+
NAT: nodeconfig.DefaultNAT,
48+
UserAgent: nodeconfig.DefaultUserAgent,
49+
DialTimeout: nodeconfig.DefaultDialTimeout,
50+
Muxer: nodeconfig.DefaultMuxer,
51+
NoRelay: nodeconfig.DefaultNoRelay,
4952
},
5053
HTTP: harmonyconfig.HttpConfig{
5154
Enabled: true,

cmd/config/flags.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ var (
6666
maxPeersFlag,
6767
connManagerLowWatermarkFlag,
6868
connManagerHighWatermarkFlag,
69+
resourceManagerEnabledFlag,
70+
resourceManagerMemoryLimitBytesFlag,
71+
resourceManagerFileDescriptorsLimitFlag,
6972
noTransportSecurityFlag,
7073
natFlag,
7174
userAgentFlag,
@@ -653,6 +656,21 @@ var (
653656
Usage: "highest number of connections that'll be maintained in connection manager. Set both high and low watermarks to zero to disable connection manager",
654657
DefValue: defaultConfig.P2P.ConnManagerHighWatermark,
655658
}
659+
resourceManagerEnabledFlag = cli.BoolFlag{
660+
Name: "p2p.resmgr-enabled",
661+
Usage: "enable p2p resource manager",
662+
DefValue: defaultConfig.P2P.ResourceMgrEnabled,
663+
}
664+
resourceManagerMemoryLimitBytesFlag = cli.Uint64Flag{
665+
Name: "p2p.resmgr-memory-limit-bytes",
666+
Usage: "memory limit for p2p resource manager",
667+
DefValue: defaultConfig.P2P.ResourceMgrMemoryLimitBytes,
668+
}
669+
resourceManagerFileDescriptorsLimitFlag = cli.Uint64Flag{
670+
Name: "p2p.resmgr-file-descriptor-limit",
671+
Usage: "file descriptor limit for p2p resource manager",
672+
DefValue: defaultConfig.P2P.ResourceMgrFileDescriptorsLimit,
673+
}
656674
waitForEachPeerToConnectFlag = cli.BoolFlag{
657675
Name: "p2p.wait-for-connections",
658676
Usage: "node waits for each single peer to connect and it doesn't add them to peers list after timeout",
@@ -730,7 +748,15 @@ func applyP2PFlags(cmd *cobra.Command, config *harmonyconfig.HarmonyConfig) {
730748
if cli.IsFlagChanged(cmd, connManagerHighWatermarkFlag) {
731749
config.P2P.ConnManagerHighWatermark = cli.GetIntFlagValue(cmd, connManagerHighWatermarkFlag)
732750
}
733-
751+
if cli.IsFlagChanged(cmd, resourceManagerEnabledFlag) {
752+
config.P2P.ResourceMgrEnabled = cli.GetBoolFlagValue(cmd, resourceManagerEnabledFlag)
753+
}
754+
if cli.IsFlagChanged(cmd, resourceManagerMemoryLimitBytesFlag) {
755+
config.P2P.ResourceMgrMemoryLimitBytes = cli.GetUint64FlagValue(cmd, resourceManagerMemoryLimitBytesFlag)
756+
}
757+
if cli.IsFlagChanged(cmd, resourceManagerFileDescriptorsLimitFlag) {
758+
config.P2P.ResourceMgrFileDescriptorsLimit = cli.GetUint64FlagValue(cmd, resourceManagerFileDescriptorsLimitFlag)
759+
}
734760
if cli.IsFlagChanged(cmd, p2pDisablePrivateIPScanFlag) {
735761
config.P2P.DisablePrivateIPScan = cli.GetBoolFlagValue(cmd, p2pDisablePrivateIPScanFlag)
736762
}

cmd/harmony/main.go

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -599,25 +599,28 @@ func createGlobalConfig(hc harmonyconfig.HarmonyConfig) (*nodeconfig.ConfigType,
599599
}
600600

601601
myHost, err = p2p.NewHost(p2p.HostConfig{
602-
Self: &selfPeer,
603-
BLSKey: nodeConfig.P2PPriKey,
604-
BootNodes: hc.Network.BootNodes,
605-
TrustedNodes: hc.Network.TrustedNodes,
606-
DataStoreFile: hc.P2P.DHTDataStore,
607-
DiscConcurrency: hc.P2P.DiscConcurrency,
608-
MaxConnPerIP: hc.P2P.MaxConnsPerIP,
609-
DisablePrivateIPScan: hc.P2P.DisablePrivateIPScan,
610-
MaxPeers: hc.P2P.MaxPeers,
611-
ConnManagerLowWatermark: hc.P2P.ConnManagerLowWatermark,
612-
ConnManagerHighWatermark: hc.P2P.ConnManagerHighWatermark,
613-
WaitForEachPeerToConnect: hc.P2P.WaitForEachPeerToConnect,
614-
ForceReachabilityPublic: forceReachabilityPublic,
615-
NoTransportSecurity: hc.P2P.NoTransportSecurity,
616-
NAT: hc.P2P.NAT,
617-
UserAgent: hc.P2P.UserAgent,
618-
DialTimeout: hc.P2P.DialTimeout,
619-
Muxer: hc.P2P.Muxer,
620-
NoRelay: hc.P2P.NoRelay,
602+
Self: &selfPeer,
603+
BLSKey: nodeConfig.P2PPriKey,
604+
BootNodes: hc.Network.BootNodes,
605+
TrustedNodes: hc.Network.TrustedNodes,
606+
DataStoreFile: hc.P2P.DHTDataStore,
607+
DiscConcurrency: hc.P2P.DiscConcurrency,
608+
MaxConnPerIP: hc.P2P.MaxConnsPerIP,
609+
DisablePrivateIPScan: hc.P2P.DisablePrivateIPScan,
610+
MaxPeers: hc.P2P.MaxPeers,
611+
ConnManagerLowWatermark: hc.P2P.ConnManagerLowWatermark,
612+
ConnManagerHighWatermark: hc.P2P.ConnManagerHighWatermark,
613+
ResourceMgrEnabled: hc.P2P.ResourceMgrEnabled,
614+
ResourceMgrMemoryLimitBytes: hc.P2P.ResourceMgrMemoryLimitBytes,
615+
ResourceMgrFileDescriptorsLimit: hc.P2P.ResourceMgrFileDescriptorsLimit,
616+
WaitForEachPeerToConnect: hc.P2P.WaitForEachPeerToConnect,
617+
ForceReachabilityPublic: forceReachabilityPublic,
618+
NoTransportSecurity: hc.P2P.NoTransportSecurity,
619+
NAT: hc.P2P.NAT,
620+
UserAgent: hc.P2P.UserAgent,
621+
DialTimeout: hc.P2P.DialTimeout,
622+
Muxer: hc.P2P.Muxer,
623+
NoRelay: hc.P2P.NoRelay,
621624
})
622625
if err != nil {
623626
return nil, errors.Wrap(err, "cannot create P2P network host")

internal/configs/harmony/harmony.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ type P2pConfig struct {
128128
// using Connection Manager will be an optional feature.
129129
ConnManagerLowWatermark int
130130
ConnManagerHighWatermark int
131+
// P2P Resource Manager configs
132+
ResourceMgrEnabled bool
133+
ResourceMgrMemoryLimitBytes uint64
134+
ResourceMgrFileDescriptorsLimit uint64
135+
// Node waits for each peer to connect before gets connect to next peer
131136
WaitForEachPeerToConnect bool
132137
// to disable p2p security (tls and noise)
133138
NoTransportSecurity bool

internal/configs/node/network.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,12 @@ const (
7777
// When the peer count exceeds the 'high watermark', as many peers will be pruned (and
7878
// their connections terminated) until 'low watermark' peers remain.
7979
DefaultConnManagerHighWatermark = 192
80+
// DefaultResourceMgrEnabled enables P2P host Resource Manager
81+
DefaultResourceMgrEnabled = false
82+
// DefaultResourceMgrMemoryLimitBytes sets the default memory limit for p2p host Resource Manager(0=unlimited)
83+
DefaultResourceMgrMemoryLimitBytes = 0
84+
// DefaultResourceMgrFileDescriptorsLimit sets the default limit for file descriptors in P2P host Resource Manager (0=unlimited)
85+
DefaultResourceMgrFileDescriptorsLimit = 0
8086
// DefaultWaitForEachPeerToConnect sets the sync configs to connect to neighbor peers one by one and waits for each peer to connect.
8187
DefaultWaitForEachPeerToConnect = false
8288
// DefaultNoTransportSecurity

p2p/host.go

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -93,25 +93,28 @@ const (
9393

9494
// HostConfig is the config structure to create a new host
9595
type HostConfig struct {
96-
Self *Peer
97-
BLSKey libp2p_crypto.PrivKey
98-
BootNodes []string
99-
TrustedNodes []string
100-
DataStoreFile *string
101-
DiscConcurrency int
102-
MaxConnPerIP int
103-
DisablePrivateIPScan bool
104-
MaxPeers int64
105-
ConnManagerLowWatermark int
106-
ConnManagerHighWatermark int
107-
WaitForEachPeerToConnect bool
108-
ForceReachabilityPublic bool
109-
NoTransportSecurity bool
110-
NAT bool
111-
UserAgent string
112-
DialTimeout time.Duration
113-
Muxer string
114-
NoRelay bool
96+
Self *Peer
97+
BLSKey libp2p_crypto.PrivKey
98+
BootNodes []string
99+
TrustedNodes []string
100+
DataStoreFile *string
101+
DiscConcurrency int
102+
MaxConnPerIP int
103+
DisablePrivateIPScan bool
104+
MaxPeers int64
105+
ConnManagerLowWatermark int
106+
ConnManagerHighWatermark int
107+
ResourceMgrEnabled bool
108+
ResourceMgrMemoryLimitBytes uint64
109+
ResourceMgrFileDescriptorsLimit uint64
110+
WaitForEachPeerToConnect bool
111+
ForceReachabilityPublic bool
112+
NoTransportSecurity bool
113+
NAT bool
114+
UserAgent string
115+
DialTimeout time.Duration
116+
Muxer string
117+
NoRelay bool
115118
}
116119

117120
func init() {
@@ -162,6 +165,12 @@ func NewHost(cfg HostConfig) (Host, error) {
162165
return nil, fmt.Errorf("failed to open connection manager: %w", err)
163166
}
164167

168+
rmgr, err := makeResourceMgr(cfg.ResourceMgrEnabled, cfg.ResourceMgrMemoryLimitBytes, cfg.ResourceMgrFileDescriptorsLimit, cfg.ConnManagerHighWatermark)
169+
if err != nil {
170+
cancel()
171+
return nil, fmt.Errorf("failed to open resource manager: %w", err)
172+
}
173+
165174
// relay
166175
var relay libp2p_config.Option
167176
if cfg.NoRelay {
@@ -196,6 +205,8 @@ func NewHost(cfg HostConfig) (Host, error) {
196205
*/
197206
// Connection manager
198207
connMngr,
208+
// resource manager
209+
libp2p.ResourceManager(rmgr),
199210
// NAT manager
200211
libp2p.NATManager(nat),
201212
// Band width Reporter

0 commit comments

Comments
 (0)