event, p2p/simulations/adapters: fix rare goroutine leaks (#20657)
Co-authored-by: Felix Lange <fjl@twurst.com>
This commit is contained in:
		| @@ -145,7 +145,6 @@ func (s *resubscribeSub) loop() { | ||||
| func (s *resubscribeSub) subscribe() Subscription { | ||||
| 	subscribed := make(chan error) | ||||
| 	var sub Subscription | ||||
| retry: | ||||
| 	for { | ||||
| 		s.lastTry = mclock.Now() | ||||
| 		ctx, cancel := context.WithCancel(context.Background()) | ||||
| @@ -157,19 +156,19 @@ retry: | ||||
| 		select { | ||||
| 		case err := <-subscribed: | ||||
| 			cancel() | ||||
| 			if err != nil { | ||||
| 				// Subscribing failed, wait before launching the next try. | ||||
| 				if s.backoffWait() { | ||||
| 					return nil | ||||
| 			if err == nil { | ||||
| 				if sub == nil { | ||||
| 					panic("event: ResubscribeFunc returned nil subscription and no error") | ||||
| 				} | ||||
| 				continue retry | ||||
| 				return sub | ||||
| 			} | ||||
| 			if sub == nil { | ||||
| 				panic("event: ResubscribeFunc returned nil subscription and no error") | ||||
| 			// Subscribing failed, wait before launching the next try. | ||||
| 			if s.backoffWait() { | ||||
| 				return nil // unsubscribed during wait | ||||
| 			} | ||||
| 			return sub | ||||
| 		case <-s.unsub: | ||||
| 			cancel() | ||||
| 			<-subscribed // avoid leaking the s.fn goroutine. | ||||
| 			return nil | ||||
| 		} | ||||
| 	} | ||||
|   | ||||
| @@ -102,7 +102,7 @@ func TestResubscribe(t *testing.T) { | ||||
| func TestResubscribeAbort(t *testing.T) { | ||||
| 	t.Parallel() | ||||
|  | ||||
| 	done := make(chan error) | ||||
| 	done := make(chan error, 1) | ||||
| 	sub := Resubscribe(0, func(ctx context.Context) (Subscription, error) { | ||||
| 		select { | ||||
| 		case <-ctx.Done(): | ||||
|   | ||||
| @@ -287,7 +287,7 @@ func (n *ExecNode) Stop() error { | ||||
| 	if err := n.Cmd.Process.Signal(syscall.SIGTERM); err != nil { | ||||
| 		return n.Cmd.Process.Kill() | ||||
| 	} | ||||
| 	waitErr := make(chan error) | ||||
| 	waitErr := make(chan error, 1) | ||||
| 	go func() { | ||||
| 		waitErr <- n.Cmd.Wait() | ||||
| 	}() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user