mirror of
https://gitee.com/milvus-io/milvus.git
synced 2025-12-06 17:18:35 +08:00
Use NodeIds instead of NodeID in segment info (#16912)
The NodeID field is deprecated in current design Query Node segment detector shall read NodeIds instead of NodeID Fix #16911 Signed-off-by: Congqi Xia <congqi.xia@zilliz.com>
This commit is contained in:
parent
13c643a3a4
commit
a0614a3ff8
@ -73,7 +73,7 @@ type segmentEvent struct {
|
|||||||
eventType segmentEventType
|
eventType segmentEventType
|
||||||
segmentID int64
|
segmentID int64
|
||||||
partitionID int64
|
partitionID int64
|
||||||
nodeID int64
|
nodeIDs []int64 // nodes from events
|
||||||
state segmentState
|
state segmentState
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,7 +222,7 @@ func (sc *ShardCluster) removeNode(evt nodeEvent) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// updateSegment apply segment change to shard cluster
|
// updateSegment apply segment change to shard cluster
|
||||||
func (sc *ShardCluster) updateSegment(evt segmentEvent) {
|
func (sc *ShardCluster) updateSegment(evt shardSegmentInfo) {
|
||||||
log.Info("ShardCluster update segment", zap.Int64("nodeID", evt.nodeID), zap.Int64("segmentID", evt.segmentID), zap.Int32("state", int32(evt.state)))
|
log.Info("ShardCluster update segment", zap.Int64("nodeID", evt.nodeID), zap.Int64("segmentID", evt.segmentID), zap.Int32("state", int32(evt.state)))
|
||||||
// notify handoff wait online if any
|
// notify handoff wait online if any
|
||||||
defer func() {
|
defer func() {
|
||||||
@ -273,8 +273,7 @@ func (sc *ShardCluster) SyncSegments(distribution []*querypb.ReplicaSegmentsInfo
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
sc.transferSegment(old, segmentEvent{
|
sc.transferSegment(old, shardSegmentInfo{
|
||||||
eventType: segmentAdd,
|
|
||||||
nodeID: line.GetNodeId(),
|
nodeID: line.GetNodeId(),
|
||||||
partitionID: line.GetPartitionId(),
|
partitionID: line.GetPartitionId(),
|
||||||
segmentID: segmentID,
|
segmentID: segmentID,
|
||||||
@ -289,7 +288,7 @@ func (sc *ShardCluster) SyncSegments(distribution []*querypb.ReplicaSegmentsInfo
|
|||||||
// Offline | OK | OK | OK
|
// Offline | OK | OK | OK
|
||||||
// Loading | OK | OK | NodeID check
|
// Loading | OK | OK | NodeID check
|
||||||
// Loaded | OK | OK | legacy pending
|
// Loaded | OK | OK | legacy pending
|
||||||
func (sc *ShardCluster) transferSegment(old *shardSegmentInfo, evt segmentEvent) {
|
func (sc *ShardCluster) transferSegment(old *shardSegmentInfo, evt shardSegmentInfo) {
|
||||||
switch old.state {
|
switch old.state {
|
||||||
case segmentStateOffline: // safe to update nodeID and state
|
case segmentStateOffline: // safe to update nodeID and state
|
||||||
old.nodeID = evt.nodeID
|
old.nodeID = evt.nodeID
|
||||||
@ -330,7 +329,7 @@ func (sc *ShardCluster) transferSegment(old *shardSegmentInfo, evt segmentEvent)
|
|||||||
|
|
||||||
// removeSegment removes segment from cluster
|
// removeSegment removes segment from cluster
|
||||||
// should only applied in hand-off or load balance procedure
|
// should only applied in hand-off or load balance procedure
|
||||||
func (sc *ShardCluster) removeSegment(evt segmentEvent) {
|
func (sc *ShardCluster) removeSegment(evt shardSegmentInfo) {
|
||||||
log.Info("ShardCluster remove segment", zap.Int64("nodeID", evt.nodeID), zap.Int64("segmentID", evt.segmentID), zap.Int32("state", int32(evt.state)))
|
log.Info("ShardCluster remove segment", zap.Int64("nodeID", evt.nodeID), zap.Int64("segmentID", evt.segmentID), zap.Int32("state", int32(evt.state)))
|
||||||
|
|
||||||
sc.mut.Lock()
|
sc.mut.Lock()
|
||||||
@ -362,13 +361,32 @@ func (sc *ShardCluster) init() {
|
|||||||
// list segments
|
// list segments
|
||||||
segments, segmentEvtCh := sc.segmentDetector.watchSegments(sc.collectionID, sc.replicaID, sc.vchannelName)
|
segments, segmentEvtCh := sc.segmentDetector.watchSegments(sc.collectionID, sc.replicaID, sc.vchannelName)
|
||||||
for _, segment := range segments {
|
for _, segment := range segments {
|
||||||
sc.updateSegment(segment)
|
info, ok := sc.pickNode(segment)
|
||||||
|
if ok {
|
||||||
|
sc.updateSegment(info)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
go sc.watchSegments(segmentEvtCh)
|
go sc.watchSegments(segmentEvtCh)
|
||||||
|
|
||||||
sc.healthCheck()
|
sc.healthCheck()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pickNode selects node id in cluster
|
||||||
|
func (sc *ShardCluster) pickNode(evt segmentEvent) (shardSegmentInfo, bool) {
|
||||||
|
for _, nodeID := range evt.nodeIDs {
|
||||||
|
_, has := sc.getNode(nodeID)
|
||||||
|
if has { // assume one segment shall exist once in one replica
|
||||||
|
return shardSegmentInfo{
|
||||||
|
segmentID: evt.segmentID,
|
||||||
|
partitionID: evt.partitionID,
|
||||||
|
nodeID: nodeID,
|
||||||
|
state: evt.state,
|
||||||
|
}, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return shardSegmentInfo{}, false
|
||||||
|
}
|
||||||
|
|
||||||
// healthCheck iterate all segments to to check cluster could provide service.
|
// healthCheck iterate all segments to to check cluster could provide service.
|
||||||
func (sc *ShardCluster) healthCheck() {
|
func (sc *ShardCluster) healthCheck() {
|
||||||
for _, segment := range sc.segments {
|
for _, segment := range sc.segments {
|
||||||
@ -411,11 +429,15 @@ func (sc *ShardCluster) watchSegments(evtCh <-chan segmentEvent) {
|
|||||||
log.Warn("ShardCluster segment channel closed", zap.Int64("collectionID", sc.collectionID), zap.Int64("replicaID", sc.replicaID))
|
log.Warn("ShardCluster segment channel closed", zap.Int64("collectionID", sc.collectionID), zap.Int64("replicaID", sc.replicaID))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
info, ok := sc.pickNode(evt)
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
switch evt.eventType {
|
switch evt.eventType {
|
||||||
case segmentAdd:
|
case segmentAdd:
|
||||||
sc.updateSegment(evt)
|
sc.updateSegment(info)
|
||||||
case segmentDel:
|
case segmentDel:
|
||||||
sc.removeSegment(evt)
|
sc.removeSegment(info)
|
||||||
}
|
}
|
||||||
case <-sc.closeCh:
|
case <-sc.closeCh:
|
||||||
log.Info("ShardCluster watchSegments quit", zap.Int64("collectionID", sc.collectionID), zap.Int64("replicaID", sc.replicaID), zap.String("vchannelName", sc.vchannelName))
|
log.Info("ShardCluster watchSegments quit", zap.Int64("collectionID", sc.collectionID), zap.Int64("replicaID", sc.replicaID), zap.String("vchannelName", sc.vchannelName))
|
||||||
@ -565,7 +587,7 @@ func (sc *ShardCluster) HandoffSegments(info *querypb.SegmentChangeInfo) error {
|
|||||||
if seg.GetCollectionID() != sc.collectionID || seg.GetDmChannel() != sc.vchannelName {
|
if seg.GetCollectionID() != sc.collectionID || seg.GetDmChannel() != sc.vchannelName {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
sc.removeSegment(segmentEvent{segmentID: seg.GetSegmentID(), nodeID: seg.GetNodeID()})
|
sc.removeSegment(shardSegmentInfo{segmentID: seg.GetSegmentID(), nodeID: seg.GetNodeID()})
|
||||||
|
|
||||||
removes[seg.GetNodeID()] = append(removes[seg.GetNodeID()], seg.SegmentID)
|
removes[seg.GetNodeID()] = append(removes[seg.GetNodeID()], seg.SegmentID)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -117,25 +117,38 @@ func TestShardCluster_Create(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("init segments", func(t *testing.T) {
|
t.Run("init segments", func(t *testing.T) {
|
||||||
|
nodeEvents := []nodeEvent{
|
||||||
|
{
|
||||||
|
nodeID: 1,
|
||||||
|
nodeAddr: "addr_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 2,
|
||||||
|
nodeAddr: "addr_2",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoading,
|
state: segmentStateLoading,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
||||||
&mockNodeDetector{}, &mockSegmentDetector{
|
&mockNodeDetector{
|
||||||
|
initNodes: nodeEvents,
|
||||||
|
}, &mockSegmentDetector{
|
||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
defer sc.Close()
|
defer sc.Close()
|
||||||
@ -143,11 +156,16 @@ func TestShardCluster_Create(t *testing.T) {
|
|||||||
for _, e := range segmentEvents {
|
for _, e := range segmentEvents {
|
||||||
sc.mut.RLock()
|
sc.mut.RLock()
|
||||||
segment, has := sc.segments[e.segmentID]
|
segment, has := sc.segments[e.segmentID]
|
||||||
|
_, inCluster := sc.pickNode(e)
|
||||||
sc.mut.RUnlock()
|
sc.mut.RUnlock()
|
||||||
assert.True(t, has)
|
if inCluster {
|
||||||
assert.Equal(t, e.segmentID, segment.segmentID)
|
assert.True(t, has)
|
||||||
assert.Equal(t, e.nodeID, segment.nodeID)
|
assert.Equal(t, e.segmentID, segment.segmentID)
|
||||||
assert.Equal(t, e.state, segment.state)
|
assert.Contains(t, e.nodeIDs, segment.nodeID)
|
||||||
|
assert.Equal(t, e.state, segment.state)
|
||||||
|
} else {
|
||||||
|
assert.False(t, has)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
assert.EqualValues(t, unavailable, sc.state.Load())
|
assert.EqualValues(t, unavailable, sc.state.Load())
|
||||||
})
|
})
|
||||||
@ -238,17 +256,17 @@ func TestShardCluster_nodeEvent(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoading,
|
state: segmentStateLoading,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -310,27 +328,44 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
replicaID := int64(0)
|
replicaID := int64(0)
|
||||||
|
|
||||||
t.Run("from loading", func(t *testing.T) {
|
t.Run("from loading", func(t *testing.T) {
|
||||||
|
nodeEvents := []nodeEvent{
|
||||||
|
{
|
||||||
|
nodeID: 1,
|
||||||
|
nodeAddr: "addr_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 2,
|
||||||
|
nodeAddr: "addr_2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 3,
|
||||||
|
nodeAddr: "addr_3",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoading,
|
state: segmentStateLoading,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoading,
|
state: segmentStateLoading,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
state: segmentStateLoading,
|
state: segmentStateLoading,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh := make(chan segmentEvent, 10)
|
evtCh := make(chan segmentEvent, 10)
|
||||||
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
||||||
&mockNodeDetector{}, &mockSegmentDetector{
|
&mockNodeDetector{
|
||||||
|
initNodes: nodeEvents,
|
||||||
|
}, &mockSegmentDetector{
|
||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
evtCh: evtCh,
|
evtCh: evtCh,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
@ -338,21 +373,21 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
|
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoading,
|
state: segmentStateLoading,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
@ -373,7 +408,7 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
// node id not match
|
// node id not match
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
@ -386,27 +421,41 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("from loaded", func(t *testing.T) {
|
t.Run("from loaded", func(t *testing.T) {
|
||||||
|
nodeEvents := []nodeEvent{
|
||||||
|
{
|
||||||
|
nodeID: 1,
|
||||||
|
nodeAddr: "addr_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 2,
|
||||||
|
nodeAddr: "addr_2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 3,
|
||||||
|
nodeAddr: "addr_3",
|
||||||
|
},
|
||||||
|
}
|
||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh := make(chan segmentEvent, 10)
|
evtCh := make(chan segmentEvent, 10)
|
||||||
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
||||||
&mockNodeDetector{}, &mockSegmentDetector{
|
&mockNodeDetector{initNodes: nodeEvents}, &mockSegmentDetector{
|
||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
evtCh: evtCh,
|
evtCh: evtCh,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
@ -415,33 +464,40 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
// make reference greater than 0
|
// make reference greater than 0
|
||||||
allocs := sc.segmentAllocations(nil)
|
allocs := sc.segmentAllocations(nil)
|
||||||
|
|
||||||
|
evtCh <- segmentEvent{
|
||||||
|
segmentID: 4,
|
||||||
|
nodeIDs: []int64{4},
|
||||||
|
state: segmentStateLoaded,
|
||||||
|
eventType: segmentAdd,
|
||||||
|
}
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoading,
|
state: segmentStateLoading,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
|
|
||||||
assert.Eventually(t, func() bool {
|
assert.Eventually(t, func() bool {
|
||||||
seg, has := sc.getSegment(1)
|
seg, has := sc.getSegment(1)
|
||||||
return has && seg.nodeID == 1 && seg.state == segmentStateLoading
|
return has && seg.nodeID == 1 && seg.state == segmentStateLoading
|
||||||
@ -456,6 +512,9 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
return has && seg.nodeID == 2 && seg.state == segmentStateLoaded
|
return has && seg.nodeID == 2 && seg.state == segmentStateLoaded
|
||||||
}, time.Second, time.Millisecond)
|
}, time.Second, time.Millisecond)
|
||||||
|
|
||||||
|
_, has := sc.getSegment(4)
|
||||||
|
assert.False(t, has)
|
||||||
|
|
||||||
sc.mut.RLock()
|
sc.mut.RLock()
|
||||||
assert.Equal(t, 0, len(sc.legacySegments))
|
assert.Equal(t, 0, len(sc.legacySegments))
|
||||||
sc.mut.RUnlock()
|
sc.mut.RUnlock()
|
||||||
@ -467,22 +526,33 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("from loaded, node changed", func(t *testing.T) {
|
t.Run("from loaded, node changed", func(t *testing.T) {
|
||||||
|
nodeEvents := []nodeEvent{
|
||||||
|
{
|
||||||
|
nodeID: 1,
|
||||||
|
nodeAddr: "addr_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 2,
|
||||||
|
nodeAddr: "addr_2",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh := make(chan segmentEvent, 10)
|
evtCh := make(chan segmentEvent, 10)
|
||||||
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
||||||
&mockNodeDetector{}, &mockSegmentDetector{
|
&mockNodeDetector{initNodes: nodeEvents}, &mockSegmentDetector{
|
||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
evtCh: evtCh,
|
evtCh: evtCh,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
@ -494,14 +564,14 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
// bring segment online in the other querynode
|
// bring segment online in the other querynode
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
@ -531,47 +601,62 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("from offline", func(t *testing.T) {
|
t.Run("from offline", func(t *testing.T) {
|
||||||
|
nodeEvents := []nodeEvent{
|
||||||
|
{
|
||||||
|
nodeID: 1,
|
||||||
|
nodeAddr: "addr_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 2,
|
||||||
|
nodeAddr: "addr_2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 3,
|
||||||
|
nodeAddr: "addr_3",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh := make(chan segmentEvent, 10)
|
evtCh := make(chan segmentEvent, 10)
|
||||||
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
||||||
&mockNodeDetector{}, &mockSegmentDetector{
|
&mockNodeDetector{initNodes: nodeEvents}, &mockSegmentDetector{
|
||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
evtCh: evtCh,
|
evtCh: evtCh,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
defer sc.Close()
|
defer sc.Close()
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoading,
|
state: segmentStateLoading,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
@ -594,27 +679,42 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("remove segments", func(t *testing.T) {
|
t.Run("remove segments", func(t *testing.T) {
|
||||||
|
nodeEvents := []nodeEvent{
|
||||||
|
{
|
||||||
|
nodeID: 1,
|
||||||
|
nodeAddr: "addr_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 2,
|
||||||
|
nodeAddr: "addr_2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 3,
|
||||||
|
nodeAddr: "addr_3",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoading,
|
state: segmentStateLoading,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh := make(chan segmentEvent, 10)
|
evtCh := make(chan segmentEvent, 10)
|
||||||
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
||||||
&mockNodeDetector{}, &mockSegmentDetector{
|
&mockNodeDetector{initNodes: nodeEvents}, &mockSegmentDetector{
|
||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
evtCh: evtCh,
|
evtCh: evtCh,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
@ -622,17 +722,17 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
|
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
eventType: segmentDel,
|
eventType: segmentDel,
|
||||||
}
|
}
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
eventType: segmentDel,
|
eventType: segmentDel,
|
||||||
}
|
}
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
eventType: segmentDel,
|
eventType: segmentDel,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -652,27 +752,42 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("remove failed", func(t *testing.T) {
|
t.Run("remove failed", func(t *testing.T) {
|
||||||
|
nodeEvents := []nodeEvent{
|
||||||
|
{
|
||||||
|
nodeID: 1,
|
||||||
|
nodeAddr: "addr_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 2,
|
||||||
|
nodeAddr: "addr_2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 3,
|
||||||
|
nodeAddr: "addr_3",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoading,
|
state: segmentStateLoading,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh := make(chan segmentEvent, 10)
|
evtCh := make(chan segmentEvent, 10)
|
||||||
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
||||||
&mockNodeDetector{}, &mockSegmentDetector{
|
&mockNodeDetector{initNodes: nodeEvents}, &mockSegmentDetector{
|
||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
evtCh: evtCh,
|
evtCh: evtCh,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
@ -681,20 +796,20 @@ func TestShardCluster_segmentEvent(t *testing.T) {
|
|||||||
// non-exist segment
|
// non-exist segment
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 4,
|
segmentID: 4,
|
||||||
nodeID: 4,
|
nodeIDs: []int64{3},
|
||||||
eventType: segmentDel,
|
eventType: segmentDel,
|
||||||
}
|
}
|
||||||
// segment node id not match
|
// segment node id not match
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 4,
|
nodeIDs: []int64{4},
|
||||||
eventType: segmentDel,
|
eventType: segmentDel,
|
||||||
}
|
}
|
||||||
|
|
||||||
// use add segment as event process signal
|
// use add segment as event process signal
|
||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
}
|
}
|
||||||
@ -714,11 +829,26 @@ func TestShardCluster_SyncSegments(t *testing.T) {
|
|||||||
replicaID := int64(0)
|
replicaID := int64(0)
|
||||||
|
|
||||||
t.Run("sync new segments", func(t *testing.T) {
|
t.Run("sync new segments", func(t *testing.T) {
|
||||||
|
nodeEvents := []nodeEvent{
|
||||||
|
{
|
||||||
|
nodeID: 1,
|
||||||
|
nodeAddr: "addr_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 2,
|
||||||
|
nodeAddr: "addr_2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 3,
|
||||||
|
nodeAddr: "addr_3",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
segmentEvents := []segmentEvent{}
|
segmentEvents := []segmentEvent{}
|
||||||
|
|
||||||
evtCh := make(chan segmentEvent, 10)
|
evtCh := make(chan segmentEvent, 10)
|
||||||
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
||||||
&mockNodeDetector{}, &mockSegmentDetector{
|
&mockNodeDetector{initNodes: nodeEvents}, &mockSegmentDetector{
|
||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
evtCh: evtCh,
|
evtCh: evtCh,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
@ -754,27 +884,42 @@ func TestShardCluster_SyncSegments(t *testing.T) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
t.Run("sync existing segments", func(t *testing.T) {
|
t.Run("sync existing segments", func(t *testing.T) {
|
||||||
|
nodeEvents := []nodeEvent{
|
||||||
|
{
|
||||||
|
nodeID: 1,
|
||||||
|
nodeAddr: "addr_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 2,
|
||||||
|
nodeAddr: "addr_2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 3,
|
||||||
|
nodeAddr: "addr_3",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
evtCh := make(chan segmentEvent, 10)
|
evtCh := make(chan segmentEvent, 10)
|
||||||
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
||||||
&mockNodeDetector{}, &mockSegmentDetector{
|
&mockNodeDetector{initNodes: nodeEvents}, &mockSegmentDetector{
|
||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
evtCh: evtCh,
|
evtCh: evtCh,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
@ -817,26 +962,41 @@ func TestShardCluster_Search(t *testing.T) {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
t.Run("search unavailable cluster", func(t *testing.T) {
|
t.Run("search unavailable cluster", func(t *testing.T) {
|
||||||
|
nodeEvents := []nodeEvent{
|
||||||
|
{
|
||||||
|
nodeID: 1,
|
||||||
|
nodeAddr: "addr_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 2,
|
||||||
|
nodeAddr: "addr_2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 3,
|
||||||
|
nodeAddr: "addr_3",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
||||||
&mockNodeDetector{}, &mockSegmentDetector{
|
&mockNodeDetector{initNodes: nodeEvents}, &mockSegmentDetector{
|
||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
|
|
||||||
@ -876,17 +1036,17 @@ func TestShardCluster_Search(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -923,17 +1083,17 @@ func TestShardCluster_Search(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -973,22 +1133,15 @@ func TestShardCluster_Search(t *testing.T) {
|
|||||||
nodeAddr: "addr_2",
|
nodeAddr: "addr_2",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
|
||||||
},
|
|
||||||
// segment belongs to node not registered
|
|
||||||
{
|
|
||||||
segmentID: 3,
|
|
||||||
nodeID: 3,
|
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1000,6 +1153,15 @@ func TestShardCluster_Search(t *testing.T) {
|
|||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
|
|
||||||
|
//mock meta error
|
||||||
|
sc.mut.Lock()
|
||||||
|
sc.segments[3] = &shardSegmentInfo{
|
||||||
|
segmentID: 3,
|
||||||
|
nodeID: 3, // node does not exist
|
||||||
|
state: segmentStateLoaded,
|
||||||
|
}
|
||||||
|
sc.mut.Unlock()
|
||||||
|
|
||||||
defer sc.Close()
|
defer sc.Close()
|
||||||
require.EqualValues(t, available, sc.state.Load())
|
require.EqualValues(t, available, sc.state.Load())
|
||||||
|
|
||||||
@ -1017,26 +1179,41 @@ func TestShardCluster_Query(t *testing.T) {
|
|||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
t.Run("query unavailable cluster", func(t *testing.T) {
|
t.Run("query unavailable cluster", func(t *testing.T) {
|
||||||
|
nodeEvents := []nodeEvent{
|
||||||
|
{
|
||||||
|
nodeID: 1,
|
||||||
|
nodeAddr: "addr_1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 2,
|
||||||
|
nodeAddr: "addr_2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
nodeID: 3,
|
||||||
|
nodeAddr: "addr_3",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 3,
|
nodeIDs: []int64{3},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
sc := NewShardCluster(collectionID, replicaID, vchannelName,
|
||||||
&mockNodeDetector{}, &mockSegmentDetector{
|
&mockNodeDetector{initNodes: nodeEvents}, &mockSegmentDetector{
|
||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
|
|
||||||
@ -1074,17 +1251,17 @@ func TestShardCluster_Query(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1121,17 +1298,17 @@ func TestShardCluster_Query(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1174,18 +1351,12 @@ func TestShardCluster_Query(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
|
||||||
},
|
|
||||||
// segment belongs to node not registered
|
|
||||||
{
|
|
||||||
segmentID: 3,
|
|
||||||
nodeID: 3,
|
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1197,6 +1368,15 @@ func TestShardCluster_Query(t *testing.T) {
|
|||||||
initSegments: segmentEvents,
|
initSegments: segmentEvents,
|
||||||
}, buildMockQueryNode)
|
}, buildMockQueryNode)
|
||||||
|
|
||||||
|
//mock meta error
|
||||||
|
sc.mut.Lock()
|
||||||
|
sc.segments[3] = &shardSegmentInfo{
|
||||||
|
segmentID: 3,
|
||||||
|
nodeID: 3, // node does not exist
|
||||||
|
state: segmentStateLoaded,
|
||||||
|
}
|
||||||
|
sc.mut.Unlock()
|
||||||
|
|
||||||
defer sc.Close()
|
defer sc.Close()
|
||||||
require.EqualValues(t, available, sc.state.Load())
|
require.EqualValues(t, available, sc.state.Load())
|
||||||
|
|
||||||
@ -1229,12 +1409,12 @@ func TestShardCluster_ReferenceCount(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1282,12 +1462,12 @@ func TestShardCluster_ReferenceCount(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1338,12 +1518,12 @@ func TestShardCluster_ReferenceCount(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1369,7 +1549,7 @@ func TestShardCluster_ReferenceCount(t *testing.T) {
|
|||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1, 4},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1400,12 +1580,12 @@ func TestShardCluster_HandoffSegments(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1451,12 +1631,12 @@ func TestShardCluster_HandoffSegments(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1501,12 +1681,12 @@ func TestShardCluster_HandoffSegments(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1546,7 +1726,7 @@ func TestShardCluster_HandoffSegments(t *testing.T) {
|
|||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
segmentID: 3,
|
segmentID: 3,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1596,12 +1776,12 @@ func TestShardCluster_HandoffSegments(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1641,7 +1821,7 @@ func TestShardCluster_HandoffSegments(t *testing.T) {
|
|||||||
evtCh <- segmentEvent{
|
evtCh <- segmentEvent{
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1690,12 +1870,12 @@ func TestShardCluster_HandoffSegments(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@ -1736,12 +1916,12 @@ func TestShardCluster_HandoffSegments(t *testing.T) {
|
|||||||
segmentEvents := []segmentEvent{
|
segmentEvents := []segmentEvent{
|
||||||
{
|
{
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
segmentID: 2,
|
segmentID: 2,
|
||||||
nodeID: 2,
|
nodeIDs: []int64{2},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@ -97,7 +97,7 @@ func (sd *etcdShardSegmentDetector) watchSegments(collectionID int64, replicaID
|
|||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
segmentID: info.GetSegmentID(),
|
segmentID: info.GetSegmentID(),
|
||||||
partitionID: info.GetPartitionID(),
|
partitionID: info.GetPartitionID(),
|
||||||
nodeID: info.GetNodeID(),
|
nodeIDs: info.GetNodeIds(),
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -158,7 +158,7 @@ func (sd *etcdShardSegmentDetector) handlePutEvent(e *clientv3.Event, collection
|
|||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
segmentID: info.GetSegmentID(),
|
segmentID: info.GetSegmentID(),
|
||||||
partitionID: info.GetPartitionID(),
|
partitionID: info.GetPartitionID(),
|
||||||
nodeID: info.GetNodeID(),
|
nodeIDs: info.GetNodeIds(),
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -182,7 +182,7 @@ func (sd *etcdShardSegmentDetector) handleDelEvent(e *clientv3.Event, collection
|
|||||||
eventType: segmentDel,
|
eventType: segmentDel,
|
||||||
segmentID: info.GetSegmentID(),
|
segmentID: info.GetSegmentID(),
|
||||||
partitionID: info.GetPartitionID(),
|
partitionID: info.GetPartitionID(),
|
||||||
nodeID: info.GetNodeID(),
|
nodeIDs: info.GetNodeIds(),
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -57,7 +57,7 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
{
|
{
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -105,7 +105,7 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
{
|
{
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -119,7 +119,7 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
"segment_1": {
|
"segment_1": {
|
||||||
CollectionID: 1,
|
CollectionID: 1,
|
||||||
SegmentID: 1,
|
SegmentID: 1,
|
||||||
NodeID: 1,
|
NodeIds: []int64{1},
|
||||||
DmChannel: "dml_1_1_v0",
|
DmChannel: "dml_1_1_v0",
|
||||||
ReplicaIds: []int64{1, 2},
|
ReplicaIds: []int64{1, 2},
|
||||||
},
|
},
|
||||||
@ -131,7 +131,7 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
{
|
{
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -145,14 +145,14 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
"segment_1": {
|
"segment_1": {
|
||||||
CollectionID: 1,
|
CollectionID: 1,
|
||||||
SegmentID: 1,
|
SegmentID: 1,
|
||||||
NodeID: 1,
|
NodeIds: []int64{1},
|
||||||
DmChannel: "dml_1_1_v0",
|
DmChannel: "dml_1_1_v0",
|
||||||
ReplicaIds: []int64{1, 2},
|
ReplicaIds: []int64{1, 2},
|
||||||
},
|
},
|
||||||
"segment_2": {
|
"segment_2": {
|
||||||
CollectionID: 1,
|
CollectionID: 1,
|
||||||
SegmentID: 2,
|
SegmentID: 2,
|
||||||
NodeID: 2,
|
NodeIds: []int64{2},
|
||||||
DmChannel: "dml_2_1_v1",
|
DmChannel: "dml_2_1_v1",
|
||||||
ReplicaIds: []int64{2},
|
ReplicaIds: []int64{2},
|
||||||
},
|
},
|
||||||
@ -164,7 +164,7 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
{
|
{
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -178,7 +178,7 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
"segment_1": {
|
"segment_1": {
|
||||||
CollectionID: 1,
|
CollectionID: 1,
|
||||||
SegmentID: 1,
|
SegmentID: 1,
|
||||||
NodeID: 1,
|
NodeIds: []int64{1},
|
||||||
DmChannel: "dml_1_1_v0",
|
DmChannel: "dml_1_1_v0",
|
||||||
ReplicaIds: []int64{1, 2},
|
ReplicaIds: []int64{1, 2},
|
||||||
},
|
},
|
||||||
@ -190,7 +190,7 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
{
|
{
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -201,7 +201,7 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
{
|
{
|
||||||
eventType: segmentDel,
|
eventType: segmentDel,
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -215,14 +215,14 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
"segment_1": {
|
"segment_1": {
|
||||||
CollectionID: 1,
|
CollectionID: 1,
|
||||||
SegmentID: 1,
|
SegmentID: 1,
|
||||||
NodeID: 1,
|
NodeIds: []int64{1},
|
||||||
DmChannel: "dml_1_1_v0",
|
DmChannel: "dml_1_1_v0",
|
||||||
ReplicaIds: []int64{1, 2},
|
ReplicaIds: []int64{1, 2},
|
||||||
},
|
},
|
||||||
"segment_2": {
|
"segment_2": {
|
||||||
CollectionID: 1,
|
CollectionID: 1,
|
||||||
SegmentID: 2,
|
SegmentID: 2,
|
||||||
NodeID: 2,
|
NodeIds: []int64{2},
|
||||||
DmChannel: "dml_2_1_v1",
|
DmChannel: "dml_2_1_v1",
|
||||||
ReplicaIds: []int64{2},
|
ReplicaIds: []int64{2},
|
||||||
},
|
},
|
||||||
@ -231,7 +231,7 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
{
|
{
|
||||||
eventType: segmentAdd,
|
eventType: segmentAdd,
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateLoaded,
|
state: segmentStateLoaded,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -242,7 +242,7 @@ func TestEtcdShardSegmentDetector_watch(t *testing.T) {
|
|||||||
{
|
{
|
||||||
eventType: segmentDel,
|
eventType: segmentDel,
|
||||||
segmentID: 1,
|
segmentID: 1,
|
||||||
nodeID: 1,
|
nodeIDs: []int64{1},
|
||||||
state: segmentStateOffline,
|
state: segmentStateOffline,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user