From b4b1ed6910b15bee3c87ac421a9455dfefaa40ea Mon Sep 17 00:00:00 2001 From: CharlesFeng Date: Thu, 15 Aug 2024 18:16:53 +0800 Subject: [PATCH] fix: before exiting, make sure the goroutine has exited (#35411) https://github.com/milvus-io/milvus/issues/35409 Signed-off-by: fengjun2016 --- internal/datanode/channel/channel_manager.go | 3 ++- internal/datanode/channel/channel_manager_test.go | 8 +++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/internal/datanode/channel/channel_manager.go b/internal/datanode/channel/channel_manager.go index 645063ae64..79954624b7 100644 --- a/internal/datanode/channel/channel_manager.go +++ b/internal/datanode/channel/channel_manager.go @@ -463,9 +463,10 @@ func (r *opRunner) releaseWithTimer(releaseFunc releaseFunc, channel string, opI } } - finishWaiter.Add(1) + finishWaiter.Add(2) go startTimer(&finishWaiter) go func() { + defer finishWaiter.Done() // TODO: failure should panic this DN, but we're not sure how // to recover when releaseFunc stuck. // Whenever we see a stuck, it's a bug need to be fixed. diff --git a/internal/datanode/channel/channel_manager_test.go b/internal/datanode/channel/channel_manager_test.go index 3aa166cb40..7ce5218df8 100644 --- a/internal/datanode/channel/channel_manager_test.go +++ b/internal/datanode/channel/channel_manager_test.go @@ -20,6 +20,7 @@ import ( "context" "os" "testing" + "time" "github.com/cockroachdb/errors" "github.com/stretchr/testify/mock" @@ -181,11 +182,10 @@ func (s *ChannelManagerSuite) TearDownTest() { func (s *ChannelManagerSuite) TestReleaseStuck() { var ( - channel = "by-dev-rootcoord-dml-2" - stuckSig = make(chan struct{}) + channel = "by-dev-rootcoord-dml-2" ) s.manager.releaseFunc = func(channel string) { - stuckSig <- struct{}{} + time.Sleep(1 * time.Second) } info := GetWatchInfoByOpID(100, channel, datapb.ChannelWatchState_ToWatch) @@ -215,8 +215,6 @@ func (s *ChannelManagerSuite) TestReleaseStuck() { s.True(ok) s.Equal(channel, abchannel) - <-stuckSig - resp := s.manager.GetProgress(releaseInfo) s.Equal(datapb.ChannelWatchState_ReleaseFailure, resp.GetState()) }