mirror of
				https://github.com/yggdrasil-network/yggdrasil-go.git
				synced 2025-11-04 03:05:07 +03:00 
			
		
		
		
	more cleanup and fix a busyloop when the admin socket is shut down
This commit is contained in:
		
							parent
							
								
									e25ad9ed21
								
							
						
					
					
						commit
						1db7437b80
					
				
					 5 changed files with 36 additions and 15 deletions
				
			
		| 
						 | 
				
			
			@ -25,7 +25,7 @@ type AdminSocket struct {
 | 
			
		|||
	listenaddr string
 | 
			
		||||
	listener   net.Listener
 | 
			
		||||
	handlers   map[string]handler
 | 
			
		||||
	started    bool
 | 
			
		||||
	done       chan struct{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type AdminSocketResponse struct {
 | 
			
		||||
| 
						 | 
				
			
			@ -69,6 +69,8 @@ func (a *AdminSocket) Init(c *core.Core, state *config.NodeState, log *log.Logge
 | 
			
		|||
	a.handlers = make(map[string]handler)
 | 
			
		||||
	current := state.GetCurrent()
 | 
			
		||||
	a.listenaddr = current.AdminListen
 | 
			
		||||
	a.done = make(chan struct{})
 | 
			
		||||
	close(a.done) // Start in a done / not-started state
 | 
			
		||||
	_ = a.AddHandler("list", []string{}, func(_ json.RawMessage) (interface{}, error) {
 | 
			
		||||
		res := &ListResponse{
 | 
			
		||||
			List: map[string]ListEntry{},
 | 
			
		||||
| 
						 | 
				
			
			@ -144,21 +146,32 @@ func (a *AdminSocket) SetupAdminHandlers(na *AdminSocket) {
 | 
			
		|||
// Start runs the admin API socket to listen for / respond to admin API calls.
 | 
			
		||||
func (a *AdminSocket) Start() error {
 | 
			
		||||
	if a.listenaddr != "none" && a.listenaddr != "" {
 | 
			
		||||
		a.done = make(chan struct{})
 | 
			
		||||
		go a.listen()
 | 
			
		||||
		a.started = true
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsStarted returns true if the module has been started.
 | 
			
		||||
func (a *AdminSocket) IsStarted() bool {
 | 
			
		||||
	return a.started
 | 
			
		||||
	select {
 | 
			
		||||
	case <-a.done:
 | 
			
		||||
		// Not blocking, so we're not currently running
 | 
			
		||||
		return false
 | 
			
		||||
	default:
 | 
			
		||||
		// Blocked, so we must have started
 | 
			
		||||
		return true
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Stop will stop the admin API and close the socket.
 | 
			
		||||
func (a *AdminSocket) Stop() error {
 | 
			
		||||
	if a.listener != nil {
 | 
			
		||||
		a.started = false
 | 
			
		||||
		select {
 | 
			
		||||
		case <-a.done:
 | 
			
		||||
		default:
 | 
			
		||||
			close(a.done)
 | 
			
		||||
		}
 | 
			
		||||
		return a.listener.Close()
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
| 
						 | 
				
			
			@ -215,6 +228,14 @@ func (a *AdminSocket) listen() {
 | 
			
		|||
		conn, err := a.listener.Accept()
 | 
			
		||||
		if err == nil {
 | 
			
		||||
			go a.handleRequest(conn)
 | 
			
		||||
		} else {
 | 
			
		||||
			select {
 | 
			
		||||
			case <-a.done:
 | 
			
		||||
				// Not blocked, so we havent started or already stopped
 | 
			
		||||
				return
 | 
			
		||||
			default:
 | 
			
		||||
				// Blocked, so we're supposed to keep running
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue