Merge pull request #15094 from karalabe/eth-auto-maxpeers
eth: use maxpeers from p2p layer instead of extra config
This commit is contained in:
		
						commit
						1e67378df8
					
				| @ -949,10 +949,6 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { | ||||
| 		cfg.NetworkId = ctx.GlobalUint64(NetworkIdFlag.Name) | ||||
| 	} | ||||
| 
 | ||||
| 	// Ethereum needs to know maxPeers to calculate the light server peer ratio.
 | ||||
| 	// TODO(fjl): ensure Ethereum can get MaxPeers from node.
 | ||||
| 	cfg.MaxPeers = ctx.GlobalInt(MaxPeersFlag.Name) | ||||
| 
 | ||||
| 	if ctx.GlobalIsSet(CacheFlag.Name) { | ||||
| 		cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) | ||||
| 	} | ||||
|  | ||||
| @ -57,15 +57,19 @@ type LesServer interface { | ||||
| 
 | ||||
| // Ethereum implements the Ethereum full node service.
 | ||||
| type Ethereum struct { | ||||
| 	config      *Config | ||||
| 	chainConfig *params.ChainConfig | ||||
| 
 | ||||
| 	// Channel for shutting down the service
 | ||||
| 	shutdownChan  chan bool    // Channel for shutting down the ethereum
 | ||||
| 	stopDbUpgrade func() error // stop chain db sequential key upgrade
 | ||||
| 
 | ||||
| 	// Handlers
 | ||||
| 	txPool          *core.TxPool | ||||
| 	blockchain      *core.BlockChain | ||||
| 	protocolManager *ProtocolManager | ||||
| 	lesServer       LesServer | ||||
| 
 | ||||
| 	// DB interfaces
 | ||||
| 	chainDb ethdb.Database // Block chain database
 | ||||
| 
 | ||||
| @ -98,7 +102,6 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { | ||||
| 	if !config.SyncMode.IsValid() { | ||||
| 		return nil, fmt.Errorf("invalid sync mode %d", config.SyncMode) | ||||
| 	} | ||||
| 
 | ||||
| 	chainDb, err := CreateDB(ctx, config, "chaindata") | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| @ -111,6 +114,7 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { | ||||
| 	log.Info("Initialised chain configuration", "config", chainConfig) | ||||
| 
 | ||||
| 	eth := &Ethereum{ | ||||
| 		config:         config, | ||||
| 		chainDb:        chainDb, | ||||
| 		chainConfig:    chainConfig, | ||||
| 		eventMux:       ctx.EventMux, | ||||
| @ -153,21 +157,9 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { | ||||
| 	} | ||||
| 	eth.txPool = core.NewTxPool(config.TxPool, eth.chainConfig, eth.blockchain) | ||||
| 
 | ||||
| 	maxPeers := config.MaxPeers | ||||
| 	if config.LightServ > 0 { | ||||
| 		// if we are running a light server, limit the number of ETH peers so that we reserve some space for incoming LES connections
 | ||||
| 		// temporary solution until the new peer connectivity API is finished
 | ||||
| 		halfPeers := maxPeers / 2 | ||||
| 		maxPeers -= config.LightPeers | ||||
| 		if maxPeers < halfPeers { | ||||
| 			maxPeers = halfPeers | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if eth.protocolManager, err = NewProtocolManager(eth.chainConfig, config.SyncMode, config.NetworkId, maxPeers, eth.eventMux, eth.txPool, eth.engine, eth.blockchain, chainDb); err != nil { | ||||
| 	if eth.protocolManager, err = NewProtocolManager(eth.chainConfig, config.SyncMode, config.NetworkId, eth.eventMux, eth.txPool, eth.engine, eth.blockchain, chainDb); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	eth.miner = miner.New(eth, eth.chainConfig, eth.EventMux(), eth.engine) | ||||
| 	eth.miner.SetExtra(makeExtraData(config.ExtraData)) | ||||
| 
 | ||||
| @ -376,7 +368,15 @@ func (s *Ethereum) Protocols() []p2p.Protocol { | ||||
| func (s *Ethereum) Start(srvr *p2p.Server) error { | ||||
| 	s.netRPCService = ethapi.NewPublicNetAPI(srvr, s.NetVersion()) | ||||
| 
 | ||||
| 	s.protocolManager.Start() | ||||
| 	// Figure out a max peers count based on the server limits
 | ||||
| 	maxPeers := srvr.MaxPeers | ||||
| 	if s.config.LightServ > 0 { | ||||
| 		maxPeers -= s.config.LightPeers | ||||
| 		if maxPeers < srvr.MaxPeers/2 { | ||||
| 			maxPeers = srvr.MaxPeers / 2 | ||||
| 		} | ||||
| 	} | ||||
| 	s.protocolManager.Start(maxPeers) | ||||
| 	if s.lesServer != nil { | ||||
| 		s.lesServer.Start(srvr) | ||||
| 	} | ||||
|  | ||||
| @ -79,7 +79,6 @@ type Config struct { | ||||
| 	// Light client options
 | ||||
| 	LightServ  int `toml:",omitempty"` // Maximum percentage of time allowed for serving LES requests
 | ||||
| 	LightPeers int `toml:",omitempty"` // Maximum number of LES client peers
 | ||||
| 	MaxPeers   int `toml:"-"`          // Maximum number of global peers
 | ||||
| 
 | ||||
| 	// Database options
 | ||||
| 	SkipBcVersionCheck bool `toml:"-"` | ||||
|  | ||||
| @ -47,7 +47,6 @@ func (c Config) MarshalTOML() (interface{}, error) { | ||||
| 	enc.SyncMode = c.SyncMode | ||||
| 	enc.LightServ = c.LightServ | ||||
| 	enc.LightPeers = c.LightPeers | ||||
| 	enc.MaxPeers = c.MaxPeers | ||||
| 	enc.SkipBcVersionCheck = c.SkipBcVersionCheck | ||||
| 	enc.DatabaseHandles = c.DatabaseHandles | ||||
| 	enc.DatabaseCache = c.DatabaseCache | ||||
| @ -119,9 +118,6 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { | ||||
| 	if dec.LightPeers != nil { | ||||
| 		c.LightPeers = *dec.LightPeers | ||||
| 	} | ||||
| 	if dec.MaxPeers != nil { | ||||
| 		c.MaxPeers = *dec.MaxPeers | ||||
| 	} | ||||
| 	if dec.SkipBcVersionCheck != nil { | ||||
| 		c.SkipBcVersionCheck = *dec.SkipBcVersionCheck | ||||
| 	} | ||||
|  | ||||
| @ -99,7 +99,7 @@ type ProtocolManager struct { | ||||
| 
 | ||||
| // NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable
 | ||||
| // with the ethereum network.
 | ||||
| func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, networkId uint64, maxPeers int, mux *event.TypeMux, txpool txPool, engine consensus.Engine, blockchain *core.BlockChain, chaindb ethdb.Database) (*ProtocolManager, error) { | ||||
| func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, networkId uint64, mux *event.TypeMux, txpool txPool, engine consensus.Engine, blockchain *core.BlockChain, chaindb ethdb.Database) (*ProtocolManager, error) { | ||||
| 	// Create the protocol manager with the base fields
 | ||||
| 	manager := &ProtocolManager{ | ||||
| 		networkId:   networkId, | ||||
| @ -108,7 +108,6 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne | ||||
| 		blockchain:  blockchain, | ||||
| 		chaindb:     chaindb, | ||||
| 		chainconfig: config, | ||||
| 		maxPeers:    maxPeers, | ||||
| 		peers:       newPeerSet(), | ||||
| 		newPeerCh:   make(chan *peer), | ||||
| 		noMorePeers: make(chan struct{}), | ||||
| @ -203,11 +202,14 @@ func (pm *ProtocolManager) removePeer(id string) { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (pm *ProtocolManager) Start() { | ||||
| func (pm *ProtocolManager) Start(maxPeers int) { | ||||
| 	pm.maxPeers = maxPeers | ||||
| 
 | ||||
| 	// broadcast transactions
 | ||||
| 	pm.txCh = make(chan core.TxPreEvent, txChanSize) | ||||
| 	pm.txSub = pm.txpool.SubscribeTxPreEvent(pm.txCh) | ||||
| 	go pm.txBroadcastLoop() | ||||
| 
 | ||||
| 	// broadcast mined blocks
 | ||||
| 	pm.minedBlockSub = pm.eventMux.Subscribe(core.NewMinedBlockEvent{}) | ||||
| 	go pm.minedBroadcastLoop() | ||||
|  | ||||
| @ -476,11 +476,11 @@ func testDAOChallenge(t *testing.T, localForked, remoteForked bool, timeout bool | ||||
| 		genesis       = gspec.MustCommit(db) | ||||
| 		blockchain, _ = core.NewBlockChain(db, config, pow, vm.Config{}) | ||||
| 	) | ||||
| 	pm, err := NewProtocolManager(config, downloader.FullSync, DefaultConfig.NetworkId, 1000, evmux, new(testTxPool), pow, blockchain, db) | ||||
| 	pm, err := NewProtocolManager(config, downloader.FullSync, DefaultConfig.NetworkId, evmux, new(testTxPool), pow, blockchain, db) | ||||
| 	if err != nil { | ||||
| 		t.Fatalf("failed to start test protocol manager: %v", err) | ||||
| 	} | ||||
| 	pm.Start() | ||||
| 	pm.Start(1000) | ||||
| 	defer pm.Stop() | ||||
| 
 | ||||
| 	// Connect a new peer and check that we receive the DAO challenge
 | ||||
|  | ||||
| @ -66,11 +66,11 @@ func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func | ||||
| 		panic(err) | ||||
| 	} | ||||
| 
 | ||||
| 	pm, err := NewProtocolManager(gspec.Config, mode, DefaultConfig.NetworkId, 1000, evmux, &testTxPool{added: newtx}, engine, blockchain, db) | ||||
| 	pm, err := NewProtocolManager(gspec.Config, mode, DefaultConfig.NetworkId, evmux, &testTxPool{added: newtx}, engine, blockchain, db) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	pm.Start() | ||||
| 	pm.Start(1000) | ||||
| 	return pm, nil | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -19,7 +19,6 @@ package params | ||||
| // MainnetBootnodes are the enode URLs of the P2P bootstrap nodes running on
 | ||||
| // the main Ethereum network.
 | ||||
| var MainnetBootnodes = []string{ | ||||
| 
 | ||||
| 	// Ethereum Foundation Go Bootnodes
 | ||||
| 	"enode://a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c@52.16.188.185:30303", // IE
 | ||||
| 	"enode://3f1d12044546b76342d59d4a05532c14b85aa669704bfe1f864fe079415aa2c02d743e03218e57a33fb94523adb54032871a6c51b2cc5514cb7c7e35b3ed0a99@13.93.211.84:30303",  // US-WEST
 | ||||
| @ -29,7 +28,6 @@ var MainnetBootnodes = []string{ | ||||
| 
 | ||||
| 	// Ethereum Foundation Cpp Bootnodes
 | ||||
| 	"enode://979b7fa28feeb35a4741660a16076f1943202cb72b6af70d327f053e248bab9ba81760f39d0701ef1d8f89cc1fbd2cacba0710a12cd5314d5e0c9021aa3637f9@5.1.83.226:30303", // DE
 | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| // TestnetBootnodes are the enode URLs of the P2P bootstrap nodes running on the
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user