Make server starts and stops idempotent
This commit is contained in:
		| @@ -30,6 +30,8 @@ type rpcServer struct { | ||||
| 	opts        Options | ||||
| 	handlers    map[string]Handler | ||||
| 	subscribers map[*subscriber][]broker.Subscriber | ||||
| 	// marks the serve as started | ||||
| 	started bool | ||||
| 	// used for first registration | ||||
| 	registered bool | ||||
| 	// graceful exit | ||||
| @@ -584,6 +586,13 @@ func (s *rpcServer) Deregister() error { | ||||
| } | ||||
|  | ||||
| func (s *rpcServer) Start() error { | ||||
| 	s.RLock() | ||||
| 	if s.started { | ||||
| 		s.RUnlock() | ||||
| 		return nil | ||||
| 	} | ||||
| 	s.RUnlock() | ||||
|  | ||||
| 	config := s.Options() | ||||
|  | ||||
| 	// start listening on the transport | ||||
| @@ -708,13 +717,32 @@ func (s *rpcServer) Start() error { | ||||
| 		s.Unlock() | ||||
| 	}() | ||||
|  | ||||
| 	// mark the server as started | ||||
| 	s.Lock() | ||||
| 	s.started = true | ||||
| 	s.Unlock() | ||||
|  | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (s *rpcServer) Stop() error { | ||||
| 	s.RLock() | ||||
| 	if !s.started { | ||||
| 		s.RUnlock() | ||||
| 		return nil | ||||
| 	} | ||||
| 	s.RUnlock() | ||||
|  | ||||
| 	ch := make(chan error) | ||||
| 	s.exit <- ch | ||||
| 	return <-ch | ||||
|  | ||||
| 	var err error | ||||
| 	select { | ||||
| 	case err = <-ch: | ||||
| 		s.started = false | ||||
| 	} | ||||
|  | ||||
| 	return err | ||||
| } | ||||
|  | ||||
| func (s *rpcServer) String() string { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user