p2p/simulations: Only register services once

Signed-off-by: Lewis Marshall <lewis@lmars.net>
This commit is contained in:
Lewis Marshall 2017-06-27 19:12:24 +01:00
parent c8e645817b
commit 74d40d67b0

View file

@ -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
} }