2021-01-15 14:38:36 +08:00
|
|
|
package proxynode
|
2020-11-16 21:10:43 +08:00
|
|
|
|
|
|
|
import (
|
2020-11-21 19:12:59 +08:00
|
|
|
"log"
|
2020-11-24 16:12:39 +08:00
|
|
|
"net"
|
2020-11-21 19:12:59 +08:00
|
|
|
"os"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
|
2020-11-16 21:10:43 +08:00
|
|
|
"github.com/zilliztech/milvus-distributed/internal/util/paramtable"
|
|
|
|
)
|
|
|
|
|
|
|
|
type ParamTable struct {
|
|
|
|
paramtable.BaseTable
|
2021-01-28 20:51:44 +08:00
|
|
|
|
|
|
|
NetworkPort int
|
|
|
|
NetworkAddress string
|
|
|
|
ProxyServiceAddress string
|
|
|
|
MasterAddress string
|
|
|
|
PulsarAddress string
|
|
|
|
IndexServerAddress string
|
|
|
|
QueryNodeNum int
|
|
|
|
QueryNodeIDList []UniqueID
|
|
|
|
ProxyID UniqueID
|
|
|
|
TimeTickInterval time.Duration
|
|
|
|
InsertChannelNames []string
|
|
|
|
DeleteChannelNames []string
|
|
|
|
K2SChannelNames []string
|
|
|
|
SearchChannelNames []string
|
|
|
|
SearchResultChannelNames []string
|
|
|
|
ProxySubName string
|
|
|
|
ProxyTimeTickChannelNames []string
|
|
|
|
DataDefinitionChannelNames []string
|
|
|
|
MsgStreamInsertBufSize int64
|
|
|
|
MsgStreamSearchBufSize int64
|
|
|
|
MsgStreamSearchResultBufSize int64
|
|
|
|
MsgStreamSearchResultPulsarBufSize int64
|
|
|
|
MsgStreamTimeTickBufSize int64
|
|
|
|
MaxNameLength int64
|
|
|
|
MaxFieldNum int64
|
|
|
|
MaxDimension int64
|
|
|
|
DefaultPartitionTag string
|
2020-11-16 21:10:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
var Params ParamTable
|
|
|
|
|
2020-11-21 19:12:59 +08:00
|
|
|
func (pt *ParamTable) Init() {
|
|
|
|
pt.BaseTable.Init()
|
2020-12-08 14:41:04 +08:00
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.initNetworkPort()
|
|
|
|
pt.initNetworkAddress()
|
|
|
|
pt.initProxyServiceAddress()
|
|
|
|
pt.initMasterAddress()
|
|
|
|
pt.initPulsarAddress()
|
|
|
|
pt.initIndexServerAddress()
|
|
|
|
pt.initQueryNodeIDList()
|
|
|
|
pt.initQueryNodeNum()
|
|
|
|
pt.initProxyID()
|
|
|
|
pt.initTimeTickInterval()
|
|
|
|
pt.initInsertChannelNames()
|
|
|
|
pt.initDeleteChannelNames()
|
|
|
|
pt.initK2SChannelNames()
|
|
|
|
pt.initSearchChannelNames()
|
|
|
|
pt.initSearchResultChannelNames()
|
|
|
|
pt.initProxySubName()
|
|
|
|
pt.initProxyTimeTickChannelNames()
|
|
|
|
pt.initDataDefinitionChannelNames()
|
|
|
|
pt.initMsgStreamInsertBufSize()
|
|
|
|
pt.initMsgStreamSearchBufSize()
|
|
|
|
pt.initMsgStreamSearchResultBufSize()
|
|
|
|
pt.initMsgStreamSearchResultPulsarBufSize()
|
|
|
|
pt.initMsgStreamTimeTickBufSize()
|
|
|
|
pt.initMaxNameLength()
|
|
|
|
pt.initMaxFieldNum()
|
|
|
|
pt.initMaxDimension()
|
|
|
|
pt.initDefaultPartitionTag()
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initNetworkPort() {
|
|
|
|
pt.NetworkPort = pt.ParseInt("proxyNode.port")
|
2020-12-08 14:41:04 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initNetworkAddress() {
|
2021-01-15 14:38:36 +08:00
|
|
|
addr, err := pt.Load("proxyNode.address")
|
2020-11-24 16:12:39 +08:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2020-12-08 14:41:04 +08:00
|
|
|
|
|
|
|
hostName, _ := net.LookupHost(addr)
|
|
|
|
if len(hostName) <= 0 {
|
|
|
|
if ip := net.ParseIP(addr); ip == nil {
|
2021-01-15 14:38:36 +08:00
|
|
|
panic("invalid ip proxyNode.address")
|
2020-12-08 14:41:04 +08:00
|
|
|
}
|
2020-11-24 16:12:39 +08:00
|
|
|
}
|
2020-12-08 14:41:04 +08:00
|
|
|
|
2021-01-15 14:38:36 +08:00
|
|
|
port, err := pt.Load("proxyNode.port")
|
2020-11-24 16:12:39 +08:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
_, err = strconv.Atoi(port)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
|
|
|
|
pt.NetworkAddress = addr + ":" + port
|
2020-11-24 16:12:39 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initProxyServiceAddress() {
|
2021-01-22 12:57:23 +08:00
|
|
|
addressFromEnv := os.Getenv("PROXY_SERVICE_ADDRESS")
|
|
|
|
if len(addressFromEnv) > 0 {
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.ProxyServiceAddress = addressFromEnv
|
2021-01-22 12:57:23 +08:00
|
|
|
}
|
|
|
|
|
2021-01-22 09:36:18 +08:00
|
|
|
addr, err := pt.Load("proxyService.address")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
hostName, _ := net.LookupHost(addr)
|
|
|
|
if len(hostName) <= 0 {
|
|
|
|
if ip := net.ParseIP(addr); ip == nil {
|
|
|
|
panic("invalid ip proxyService.address")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
port, err := pt.Load("proxyService.port")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
_, err = strconv.Atoi(port)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.ProxyServiceAddress = addr + ":" + port
|
2021-01-22 09:36:18 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initMasterAddress() {
|
2020-11-21 19:12:59 +08:00
|
|
|
ret, err := pt.Load("_MasterAddress")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.MasterAddress = ret
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initPulsarAddress() {
|
2020-11-21 19:12:59 +08:00
|
|
|
ret, err := pt.Load("_PulsarAddress")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.PulsarAddress = ret
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initIndexServerAddress() {
|
|
|
|
addr, err := pt.Load("indexServer.address")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
hostName, _ := net.LookupHost(addr)
|
|
|
|
if len(hostName) <= 0 {
|
|
|
|
if ip := net.ParseIP(addr); ip == nil {
|
|
|
|
panic("invalid ip indexServer.address")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
port, err := pt.Load("indexServer.port")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
_, err = strconv.Atoi(port)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
pt.IndexServerAddress = addr + ":" + port
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initQueryNodeNum() {
|
|
|
|
pt.QueryNodeNum = len(pt.QueryNodeIDList)
|
2020-11-26 16:01:31 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initQueryNodeIDList() []UniqueID {
|
2020-11-26 16:01:31 +08:00
|
|
|
queryNodeIDStr, err := pt.Load("nodeID.queryNodeIDList")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
var ret []UniqueID
|
|
|
|
queryNodeIDs := strings.Split(queryNodeIDStr, ",")
|
|
|
|
for _, i := range queryNodeIDs {
|
|
|
|
v, err := strconv.Atoi(i)
|
|
|
|
if err != nil {
|
2021-01-15 14:38:36 +08:00
|
|
|
log.Panicf("load proxynode id list error, %s", err.Error())
|
2020-11-26 16:01:31 +08:00
|
|
|
}
|
|
|
|
ret = append(ret, UniqueID(v))
|
|
|
|
}
|
|
|
|
return ret
|
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initProxyID() {
|
2020-11-21 19:12:59 +08:00
|
|
|
proxyID, err := pt.Load("_proxyID")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
ID, err := strconv.Atoi(proxyID)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.ProxyID = UniqueID(ID)
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initTimeTickInterval() {
|
2021-01-15 14:38:36 +08:00
|
|
|
internalStr, err := pt.Load("proxyNode.timeTickInterval")
|
2020-11-21 19:12:59 +08:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
interval, err := strconv.Atoi(internalStr)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.TimeTickInterval = time.Duration(interval) * time.Millisecond
|
2020-11-16 21:10:43 +08:00
|
|
|
}
|
2020-11-21 15:06:46 +08:00
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initInsertChannelNames() {
|
2020-11-21 19:12:59 +08:00
|
|
|
prefix, err := pt.Load("msgChannel.chanNamePrefix.insert")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
prefix += "-"
|
|
|
|
iRangeStr, err := pt.Load("msgChannel.channelRange.insert")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2020-12-08 14:41:04 +08:00
|
|
|
channelIDs := paramtable.ConvertRangeToIntSlice(iRangeStr, ",")
|
2020-11-21 19:12:59 +08:00
|
|
|
var ret []string
|
|
|
|
for _, ID := range channelIDs {
|
|
|
|
ret = append(ret, prefix+strconv.Itoa(ID))
|
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.InsertChannelNames = ret
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initDeleteChannelNames() {
|
2020-11-21 19:12:59 +08:00
|
|
|
prefix, err := pt.Load("msgChannel.chanNamePrefix.delete")
|
2020-11-21 15:06:46 +08:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2020-11-21 19:12:59 +08:00
|
|
|
prefix += "-"
|
|
|
|
dRangeStr, err := pt.Load("msgChannel.channelRange.delete")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2020-12-08 14:41:04 +08:00
|
|
|
channelIDs := paramtable.ConvertRangeToIntSlice(dRangeStr, ",")
|
2020-11-21 19:12:59 +08:00
|
|
|
var ret []string
|
|
|
|
for _, ID := range channelIDs {
|
|
|
|
ret = append(ret, prefix+strconv.Itoa(ID))
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.DeleteChannelNames = ret
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initK2SChannelNames() {
|
2020-11-21 19:12:59 +08:00
|
|
|
prefix, err := pt.Load("msgChannel.chanNamePrefix.k2s")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
prefix += "-"
|
|
|
|
k2sRangeStr, err := pt.Load("msgChannel.channelRange.k2s")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2020-12-08 14:41:04 +08:00
|
|
|
channelIDs := paramtable.ConvertRangeToIntSlice(k2sRangeStr, ",")
|
2020-11-21 19:12:59 +08:00
|
|
|
var ret []string
|
|
|
|
for _, ID := range channelIDs {
|
|
|
|
ret = append(ret, prefix+strconv.Itoa(ID))
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.K2SChannelNames = ret
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initSearchChannelNames() {
|
2020-11-21 19:12:59 +08:00
|
|
|
prefix, err := pt.Load("msgChannel.chanNamePrefix.search")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2020-12-08 14:41:04 +08:00
|
|
|
prefix += "-"
|
|
|
|
sRangeStr, err := pt.Load("msgChannel.channelRange.search")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
channelIDs := paramtable.ConvertRangeToIntSlice(sRangeStr, ",")
|
|
|
|
var ret []string
|
|
|
|
for _, ID := range channelIDs {
|
|
|
|
ret = append(ret, prefix+strconv.Itoa(ID))
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.SearchChannelNames = ret
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initSearchResultChannelNames() {
|
2020-11-21 19:12:59 +08:00
|
|
|
prefix, err := pt.Load("msgChannel.chanNamePrefix.searchResult")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
prefix += "-"
|
|
|
|
sRangeStr, err := pt.Load("msgChannel.channelRange.searchResult")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2020-12-08 14:41:04 +08:00
|
|
|
channelIDs := paramtable.ConvertRangeToIntSlice(sRangeStr, ",")
|
2020-11-21 19:12:59 +08:00
|
|
|
var ret []string
|
|
|
|
for _, ID := range channelIDs {
|
|
|
|
ret = append(ret, prefix+strconv.Itoa(ID))
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.SearchResultChannelNames = ret
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initProxySubName() {
|
2020-11-21 19:12:59 +08:00
|
|
|
prefix, err := pt.Load("msgChannel.subNamePrefix.proxySubNamePrefix")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
proxyIDStr, err := pt.Load("_proxyID")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.ProxySubName = prefix + "-" + proxyIDStr
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initProxyTimeTickChannelNames() {
|
2020-11-21 19:12:59 +08:00
|
|
|
prefix, err := pt.Load("msgChannel.chanNamePrefix.proxyTimeTick")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
prefix += "-0"
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.ProxyTimeTickChannelNames = []string{prefix}
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initDataDefinitionChannelNames() {
|
2020-11-21 19:12:59 +08:00
|
|
|
prefix, err := pt.Load("msgChannel.chanNamePrefix.dataDefinition")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
prefix += "-0"
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.DataDefinitionChannelNames = []string{prefix}
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initMsgStreamInsertBufSize() {
|
|
|
|
pt.MsgStreamInsertBufSize = pt.ParseInt64("proxyNode.msgStream.insert.bufSize")
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initMsgStreamSearchBufSize() {
|
|
|
|
pt.MsgStreamSearchBufSize = pt.ParseInt64("proxyNode.msgStream.search.bufSize")
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initMsgStreamSearchResultBufSize() {
|
|
|
|
pt.MsgStreamSearchResultBufSize = pt.ParseInt64("proxyNode.msgStream.searchResult.recvBufSize")
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initMsgStreamSearchResultPulsarBufSize() {
|
|
|
|
pt.MsgStreamSearchResultPulsarBufSize = pt.ParseInt64("proxyNode.msgStream.searchResult.pulsarBufSize")
|
2020-11-21 19:12:59 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initMsgStreamTimeTickBufSize() {
|
|
|
|
pt.MsgStreamTimeTickBufSize = pt.ParseInt64("proxyNode.msgStream.timeTick.bufSize")
|
2020-11-26 16:01:31 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initMaxNameLength() {
|
2021-01-15 14:38:36 +08:00
|
|
|
str, err := pt.Load("proxyNode.maxNameLength")
|
2020-11-26 16:01:31 +08:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
maxNameLength, err := strconv.ParseInt(str, 10, 64)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.MaxNameLength = maxNameLength
|
2020-11-26 16:01:31 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initMaxFieldNum() {
|
2021-01-15 14:38:36 +08:00
|
|
|
str, err := pt.Load("proxyNode.maxFieldNum")
|
2020-11-26 16:01:31 +08:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
maxFieldNum, err := strconv.ParseInt(str, 10, 64)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.MaxFieldNum = maxFieldNum
|
2020-11-26 16:01:31 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initMaxDimension() {
|
2021-01-15 14:38:36 +08:00
|
|
|
str, err := pt.Load("proxyNode.maxDimension")
|
2020-11-26 16:01:31 +08:00
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
maxDimension, err := strconv.ParseInt(str, 10, 64)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.MaxDimension = maxDimension
|
2020-11-26 16:01:31 +08:00
|
|
|
}
|
|
|
|
|
2021-01-28 20:51:44 +08:00
|
|
|
func (pt *ParamTable) initDefaultPartitionTag() {
|
2020-11-26 16:01:31 +08:00
|
|
|
tag, err := pt.Load("common.defaultPartitionTag")
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-01-28 20:51:44 +08:00
|
|
|
pt.DefaultPartitionTag = tag
|
2020-11-26 16:01:31 +08:00
|
|
|
}
|