mirror of
https://gitee.com/milvus-io/milvus.git
synced 2025-12-07 17:48:29 +08:00
fix: Use lock and map instead of concurrentMap (#31212)
See also: #31209 --------- Signed-off-by: yangxuan <xuan.yang@zilliz.com>
This commit is contained in:
parent
773c64ecbb
commit
a52a52064d
@ -88,8 +88,9 @@ type DataNode struct {
|
|||||||
Role string
|
Role string
|
||||||
stateCode atomic.Value // commonpb.StateCode_Initializing
|
stateCode atomic.Value // commonpb.StateCode_Initializing
|
||||||
flowgraphManager FlowgraphManager
|
flowgraphManager FlowgraphManager
|
||||||
eventManagerMap *typeutil.ConcurrentMap[string, *channelEventManager]
|
|
||||||
channelManager ChannelManager
|
eventManager *EventManager
|
||||||
|
channelManager ChannelManager
|
||||||
|
|
||||||
syncMgr syncmgr.SyncManager
|
syncMgr syncmgr.SyncManager
|
||||||
writeBufferManager writebuffer.BufferManager
|
writeBufferManager writebuffer.BufferManager
|
||||||
@ -142,7 +143,7 @@ func NewDataNode(ctx context.Context, factory dependency.Factory, serverID int64
|
|||||||
segmentCache: newCache(),
|
segmentCache: newCache(),
|
||||||
compactionExecutor: newCompactionExecutor(),
|
compactionExecutor: newCompactionExecutor(),
|
||||||
|
|
||||||
eventManagerMap: typeutil.NewConcurrentMap[string, *channelEventManager](),
|
eventManager: NewEventManager(),
|
||||||
flowgraphManager: newFlowgraphManager(),
|
flowgraphManager: newFlowgraphManager(),
|
||||||
clearSignal: make(chan string, 100),
|
clearSignal: make(chan string, 100),
|
||||||
|
|
||||||
@ -428,10 +429,7 @@ func (node *DataNode) Stop() error {
|
|||||||
// Delay the cancellation of ctx to ensure that the session is automatically recycled after closed the flow graph
|
// Delay the cancellation of ctx to ensure that the session is automatically recycled after closed the flow graph
|
||||||
node.cancel()
|
node.cancel()
|
||||||
|
|
||||||
node.eventManagerMap.Range(func(_ string, m *channelEventManager) bool {
|
node.eventManager.CloseAll()
|
||||||
m.Close()
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
|
|
||||||
if node.writeBufferManager != nil {
|
if node.writeBufferManager != nil {
|
||||||
node.writeBufferManager.Stop()
|
node.writeBufferManager.Stop()
|
||||||
|
|||||||
@ -130,21 +130,15 @@ func (node *DataNode) handleWatchInfo(e *event, key string, data []byte) {
|
|||||||
log.Info("DataNode is handling watchInfo DELETE event", zap.String("key", key))
|
log.Info("DataNode is handling watchInfo DELETE event", zap.String("key", key))
|
||||||
}
|
}
|
||||||
|
|
||||||
actualManager, loaded := node.eventManagerMap.GetOrInsert(e.vChanName, newChannelEventManager(
|
actualManager := node.eventManager.GetOrInsert(e.vChanName, newChannelEventManager(
|
||||||
node.handlePutEvent, node.handleDeleteEvent, retryWatchInterval,
|
node.handlePutEvent, node.handleDeleteEvent, retryWatchInterval,
|
||||||
))
|
))
|
||||||
|
|
||||||
if !loaded {
|
|
||||||
actualManager.Run()
|
|
||||||
}
|
|
||||||
|
|
||||||
actualManager.handleEvent(*e)
|
actualManager.handleEvent(*e)
|
||||||
|
|
||||||
// Whenever a delete event comes, this eventManager will be removed from map
|
// Whenever a delete event comes, this eventManager will be removed from map
|
||||||
if e.eventType == deleteEventType {
|
if e.eventType == deleteEventType {
|
||||||
if m, loaded := node.eventManagerMap.GetAndRemove(e.vChanName); loaded {
|
node.eventManager.Remove(e.vChanName)
|
||||||
m.Close()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -402,3 +396,49 @@ func GetLiteChannelWatchInfo(watchInfo *datapb.ChannelWatchInfo) *datapb.Channel
|
|||||||
Progress: watchInfo.GetProgress(),
|
Progress: watchInfo.GetProgress(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type EventManager struct {
|
||||||
|
channelGuard sync.Mutex
|
||||||
|
channelManagers map[string]*channelEventManager
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewEventManager() *EventManager {
|
||||||
|
return &EventManager{
|
||||||
|
channelManagers: make(map[string]*channelEventManager),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *EventManager) GetOrInsert(channel string, newManager *channelEventManager) *channelEventManager {
|
||||||
|
m.channelGuard.Lock()
|
||||||
|
defer m.channelGuard.Unlock()
|
||||||
|
|
||||||
|
eManager, got := m.channelManagers[channel]
|
||||||
|
if !got {
|
||||||
|
newManager.Run()
|
||||||
|
m.channelManagers[channel] = newManager
|
||||||
|
return newManager
|
||||||
|
}
|
||||||
|
|
||||||
|
return eManager
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *EventManager) Remove(channel string) {
|
||||||
|
m.channelGuard.Lock()
|
||||||
|
eManager, got := m.channelManagers[channel]
|
||||||
|
delete(m.channelManagers, channel)
|
||||||
|
m.channelGuard.Unlock()
|
||||||
|
|
||||||
|
if got {
|
||||||
|
eManager.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *EventManager) CloseAll() {
|
||||||
|
m.channelGuard.Lock()
|
||||||
|
defer m.channelGuard.Unlock()
|
||||||
|
|
||||||
|
for channel, eManager := range m.channelManagers {
|
||||||
|
delete(m.channelManagers, channel)
|
||||||
|
eManager.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -218,9 +218,9 @@ func TestWatchChannel(t *testing.T) {
|
|||||||
chDel <- struct{}{}
|
chDel <- struct{}{}
|
||||||
}, time.Millisecond*100,
|
}, time.Millisecond*100,
|
||||||
)
|
)
|
||||||
node.eventManagerMap.Insert(ch, m)
|
|
||||||
m.Run()
|
node.eventManager.GetOrInsert(ch, m)
|
||||||
defer m.Close()
|
defer node.eventManager.Remove(ch)
|
||||||
|
|
||||||
info = datapb.ChannelWatchInfo{
|
info = datapb.ChannelWatchInfo{
|
||||||
Vchan: &datapb.VchannelInfo{ChannelName: ch},
|
Vchan: &datapb.VchannelInfo{ChannelName: ch},
|
||||||
@ -258,9 +258,8 @@ func TestWatchChannel(t *testing.T) {
|
|||||||
chDel <- struct{}{}
|
chDel <- struct{}{}
|
||||||
}, time.Millisecond*100,
|
}, time.Millisecond*100,
|
||||||
)
|
)
|
||||||
node.eventManagerMap.Insert(ch, m)
|
node.eventManager.GetOrInsert(ch, m)
|
||||||
m.Run()
|
defer node.eventManager.Remove(ch)
|
||||||
defer m.Close()
|
|
||||||
e := &event{
|
e := &event{
|
||||||
eventType: putEventType,
|
eventType: putEventType,
|
||||||
version: 10000,
|
version: 10000,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user