2021-01-15 09:09:41 +00:00
|
|
|
package dataservice
|
|
|
|
|
2021-01-22 03:07:07 +00:00
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strconv"
|
|
|
|
"sync"
|
|
|
|
)
|
2021-01-15 09:09:41 +00:00
|
|
|
|
|
|
|
type (
|
2021-01-22 03:07:07 +00:00
|
|
|
channelGroup []string
|
|
|
|
insertChannelManager struct {
|
|
|
|
mu sync.RWMutex
|
|
|
|
count int
|
|
|
|
channelGroups map[UniqueID][]channelGroup // collection id to channel ranges
|
2021-01-15 09:09:41 +00:00
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2021-01-22 03:07:07 +00:00
|
|
|
func (cr channelGroup) Contains(channelName string) bool {
|
2021-01-15 09:09:41 +00:00
|
|
|
for _, name := range cr {
|
|
|
|
if name == channelName {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
2021-01-22 03:07:07 +00:00
|
|
|
func newInsertChannelManager() *insertChannelManager {
|
|
|
|
return &insertChannelManager{
|
|
|
|
count: 0,
|
|
|
|
channelGroups: make(map[UniqueID][]channelGroup),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-02-02 03:14:17 +00:00
|
|
|
func (cm *insertChannelManager) GetChannels(collectionID UniqueID, groupNum int) ([]channelGroup, error) {
|
2021-01-22 03:07:07 +00:00
|
|
|
cm.mu.Lock()
|
|
|
|
defer cm.mu.Unlock()
|
|
|
|
if _, ok := cm.channelGroups[collectionID]; ok {
|
2021-02-02 03:14:17 +00:00
|
|
|
return cm.channelGroups[collectionID], nil
|
2021-01-22 03:07:07 +00:00
|
|
|
}
|
|
|
|
channels := Params.InsertChannelNumPerCollection
|
|
|
|
m, n := channels/int64(groupNum), channels%int64(groupNum)
|
|
|
|
cg := make([]channelGroup, 0)
|
|
|
|
var i, j int64 = 0, 0
|
|
|
|
for i < channels {
|
|
|
|
var group []string
|
|
|
|
if j < n {
|
|
|
|
group = make([]string, m+1)
|
|
|
|
} else {
|
|
|
|
group = make([]string, m)
|
2021-01-15 09:09:41 +00:00
|
|
|
}
|
2021-01-22 03:07:07 +00:00
|
|
|
for k := 0; k < len(group); k++ {
|
2021-01-29 09:08:31 +00:00
|
|
|
group[k] = Params.InsertChannelPrefixName + strconv.Itoa(cm.count)
|
2021-01-22 03:07:07 +00:00
|
|
|
cm.count++
|
2021-01-15 09:09:41 +00:00
|
|
|
}
|
2021-01-22 03:07:07 +00:00
|
|
|
i += int64(len(group))
|
|
|
|
j++
|
|
|
|
cg = append(cg, group)
|
2021-01-15 09:09:41 +00:00
|
|
|
}
|
2021-01-29 09:08:31 +00:00
|
|
|
cm.channelGroups[collectionID] = cg
|
2021-01-22 03:07:07 +00:00
|
|
|
return cg, nil
|
2021-01-15 09:09:41 +00:00
|
|
|
}
|
|
|
|
|
2021-01-22 03:07:07 +00:00
|
|
|
func (cm *insertChannelManager) GetChannelGroup(collectionID UniqueID, channelName string) (channelGroup, error) {
|
|
|
|
cm.mu.RLock()
|
|
|
|
defer cm.mu.RUnlock()
|
|
|
|
_, ok := cm.channelGroups[collectionID]
|
|
|
|
if !ok {
|
|
|
|
return nil, fmt.Errorf("can not find collection %d", collectionID)
|
|
|
|
}
|
|
|
|
for _, cr := range cm.channelGroups[collectionID] {
|
2021-01-15 09:09:41 +00:00
|
|
|
if cr.Contains(channelName) {
|
|
|
|
return cr, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil, fmt.Errorf("channel name %s not found", channelName)
|
|
|
|
}
|