fix: resolve deadlock in Restart method

The Restart() method was acquiring a lock then calling Stop() which
tried to acquire the same lock, causing a deadlock.

Fixed by creating stopLocked() method that assumes lock is already held,
and having Restart() call stopLocked() directly.
This commit is contained in:
Vishnuvardhan Reddy 2026-02-24 18:31:59 +00:00
parent 998c49e52d
commit 1b75778658

View file

@ -190,7 +190,12 @@ func (s *Service) Start() error {
func (s *Service) Stop() error {
s.mu.Lock()
defer s.mu.Unlock()
return s.stopLocked()
}
// stopLocked stops the running gateway daemon without acquiring the lock.
// Must be called with the lock already held.
func (s *Service) stopLocked() error {
logger.InfoC("daemon", "Stopping gateway daemon")
pid := s.pidFile.Read()
@ -254,9 +259,9 @@ func (s *Service) Restart() error {
logger.InfoC("daemon", "Restarting gateway daemon")
// Stop if running
// Stop if running (call stopLocked to avoid deadlock)
if s.pidFile.IsProcessRunning() {
if err := s.Stop(); err != nil {
if err := s.stopLocked(); err != nil {
return fmt.Errorf("failed to stop daemon: %w", err)
}
}