From 6a2e458f908d359818654a620202d40fbb76ede1 Mon Sep 17 00:00:00 2001 From: wei liu Date: Mon, 14 Nov 2022 14:51:06 +0800 Subject: [PATCH] fix collection not exist cause query coord panic (#20553) Signed-off-by: Wei Liu Signed-off-by: Wei Liu --- internal/querycoordv2/server.go | 10 ++++++---- internal/querycoordv2/server_test.go | 21 +++++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/internal/querycoordv2/server.go b/internal/querycoordv2/server.go index 32d682c440..d63c9582da 100644 --- a/internal/querycoordv2/server.go +++ b/internal/querycoordv2/server.go @@ -46,7 +46,6 @@ import ( "github.com/milvus-io/milvus/internal/querycoordv2/params" "github.com/milvus-io/milvus/internal/querycoordv2/session" "github.com/milvus-io/milvus/internal/querycoordv2/task" - "github.com/milvus-io/milvus/internal/querycoordv2/utils" "github.com/milvus-io/milvus/internal/types" "github.com/milvus-io/milvus/internal/util/dependency" "github.com/milvus-io/milvus/internal/util/metricsinfo" @@ -515,9 +514,12 @@ func (s *Server) recover() error { func (s *Server) recoverCollectionTargets(ctx context.Context, collection int64) error { err := s.targetMgr.UpdateCollectionNextTarget(collection) if err != nil { - msg := "failed to update next target for collection" - log.Error(msg, zap.Error(err)) - return utils.WrapError(msg, err) + s.meta.CollectionManager.RemoveCollection(collection) + s.meta.ReplicaManager.RemoveCollection(collection) + log.Error("failed to recover collection due to update next target failed", + zap.Int64("collectionID", collection), + zap.Error(err), + ) } return nil } diff --git a/internal/querycoordv2/server_test.go b/internal/querycoordv2/server_test.go index 34cfebbc8a..6baa83643c 100644 --- a/internal/querycoordv2/server_test.go +++ b/internal/querycoordv2/server_test.go @@ -18,6 +18,7 @@ package querycoordv2 import ( "context" + "errors" "sync" "testing" "time" @@ -141,6 +142,26 @@ func (suite *ServerSuite) TestRecover() { } } +func (suite *ServerSuite) TestRecoverFailed() { + err := suite.server.Stop() + suite.NoError(err) + + suite.server, err = newQueryCoord() + suite.NoError(err) + + broker := meta.NewMockBroker(suite.T()) + broker.EXPECT().GetPartitions(context.TODO(), int64(1000)).Return(nil, errors.New("CollectionNotExist")) + broker.EXPECT().GetRecoveryInfo(context.TODO(), int64(1001), mock.Anything).Return(nil, nil, errors.New("CollectionNotExist")) + suite.server.targetMgr = meta.NewTargetManager(broker, suite.server.meta) + err = suite.server.Start() + suite.NoError(err) + + for _, collection := range suite.collections { + suite.False(suite.server.meta.Exist(collection)) + suite.Nil(suite.server.targetMgr.GetDmChannelsByCollection(collection, meta.NextTarget)) + } +} + func (suite *ServerSuite) TestNodeUp() { newNode := mocks.NewMockQueryNode(suite.T(), suite.server.etcdCli, 100) newNode.EXPECT().GetDataDistribution(mock.Anything, mock.Anything).Return(&querypb.GetDataDistributionResponse{}, nil)