From 74d40d67b0628fd1eae16e0a1ae15158052335a3 Mon Sep 17 00:00:00 2001 From: Lewis Marshall Date: Tue, 27 Jun 2017 19:12:24 +0100 Subject: [PATCH] p2p/simulations: Only register services once Signed-off-by: Lewis Marshall --- p2p/simulations/adapters/inproc.go | 33 +++++++++++++++++++----------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/p2p/simulations/adapters/inproc.go b/p2p/simulations/adapters/inproc.go index 3e69728d98..ea5cafc84a 100644 --- a/p2p/simulations/adapters/inproc.go +++ b/p2p/simulations/adapters/inproc.go @@ -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 // by the underlying service. type SimNode struct { - lock sync.RWMutex - ID discover.NodeID - config *NodeConfig - adapter *SimAdapter - node *node.Node - running map[string]node.Service - client *rpc.Client + lock sync.RWMutex + ID discover.NodeID + config *NodeConfig + adapter *SimAdapter + node *node.Node + running map[string]node.Service + client *rpc.Client + registerOnce sync.Once } // 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 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) { return func(nodeCtx *node.ServiceContext) (node.Service, error) { ctx := &ServiceContext{ @@ -232,10 +231,17 @@ func (self *SimNode) Start(snapshots map[string][]byte) error { } } - for _, name := range self.config.Services { - if err := self.node.Register(newService(name)); err != nil { - return err + var regErr error + self.registerOnce.Do(func() { + 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 { @@ -247,7 +253,10 @@ func (self *SimNode) Start(snapshots map[string][]byte) error { if err != nil { return err } + + self.lock.Lock() self.client = rpc.DialInProc(handler) + self.lock.Unlock() return nil }