mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-16 08:53:46 +00:00
p2p/simulations: Only register services once
Signed-off-by: Lewis Marshall <lewis@lmars.net>
This commit is contained in:
parent
c8e645817b
commit
74d40d67b0
1 changed files with 21 additions and 12 deletions
|
|
@ -140,13 +140,14 @@ func (s *SimAdapter) GetNode(id discover.NodeID) (*SimNode, bool) {
|
||||||
// It implements the p2p.Server interface so it can be used transparently
|
// It implements the p2p.Server interface so it can be used transparently
|
||||||
// by the underlying service.
|
// by the underlying service.
|
||||||
type SimNode struct {
|
type SimNode struct {
|
||||||
lock sync.RWMutex
|
lock sync.RWMutex
|
||||||
ID discover.NodeID
|
ID discover.NodeID
|
||||||
config *NodeConfig
|
config *NodeConfig
|
||||||
adapter *SimAdapter
|
adapter *SimAdapter
|
||||||
node *node.Node
|
node *node.Node
|
||||||
running map[string]node.Service
|
running map[string]node.Service
|
||||||
client *rpc.Client
|
client *rpc.Client
|
||||||
|
registerOnce sync.Once
|
||||||
}
|
}
|
||||||
|
|
||||||
// Addr returns the node's discovery address
|
// Addr returns the node's discovery address
|
||||||
|
|
@ -210,8 +211,6 @@ func (self *SimNode) Snapshots() (map[string][]byte, error) {
|
||||||
|
|
||||||
// Start starts the RPC handler and the underlying service
|
// Start starts the RPC handler and the underlying service
|
||||||
func (self *SimNode) Start(snapshots map[string][]byte) error {
|
func (self *SimNode) Start(snapshots map[string][]byte) error {
|
||||||
self.lock.Lock()
|
|
||||||
defer self.lock.Unlock()
|
|
||||||
newService := func(name string) func(ctx *node.ServiceContext) (node.Service, error) {
|
newService := func(name string) func(ctx *node.ServiceContext) (node.Service, error) {
|
||||||
return func(nodeCtx *node.ServiceContext) (node.Service, error) {
|
return func(nodeCtx *node.ServiceContext) (node.Service, error) {
|
||||||
ctx := &ServiceContext{
|
ctx := &ServiceContext{
|
||||||
|
|
@ -232,10 +231,17 @@ func (self *SimNode) Start(snapshots map[string][]byte) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, name := range self.config.Services {
|
var regErr error
|
||||||
if err := self.node.Register(newService(name)); err != nil {
|
self.registerOnce.Do(func() {
|
||||||
return err
|
for _, name := range self.config.Services {
|
||||||
|
if err := self.node.Register(newService(name)); err != nil {
|
||||||
|
regErr = err
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
})
|
||||||
|
if regErr != nil {
|
||||||
|
return regErr
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := self.node.Start(); err != nil {
|
if err := self.node.Start(); err != nil {
|
||||||
|
|
@ -247,7 +253,10 @@ func (self *SimNode) Start(snapshots map[string][]byte) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.lock.Lock()
|
||||||
self.client = rpc.DialInProc(handler)
|
self.client = rpc.DialInProc(handler)
|
||||||
|
self.lock.Unlock()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue