mirror of https://github.com/milvus-io/milvus.git
Add rate limit and deny write in upsert (#25351)
Signed-off-by: lixinguo <xinguo.li@zilliz.com> Co-authored-by: lixinguo <xinguo.li@zilliz.com>pull/25480/head
parent
28200acb67
commit
d63323d117
|
@ -225,7 +225,7 @@ queryNode:
|
|||
stats:
|
||||
publishInterval: 1000 # Interval for querynode to report node information (milliseconds)
|
||||
segcore:
|
||||
cgoPoolSizeRatio: 2.0 # cgo pool size ratio to max read concurrency
|
||||
cgoPoolSizeRatio: 2.0 # cgo pool size ratio to max read concurrency
|
||||
knowhereThreadPoolNumRatio: 4
|
||||
# Use more threads to make better use of SSD throughput in disk index.
|
||||
# This parameter is only useful when enable-disk = true.
|
||||
|
@ -506,6 +506,10 @@ quotaAndLimits:
|
|||
collection:
|
||||
max: -1 # MB/s, default no limit
|
||||
max: -1 # MB/s, default no limit
|
||||
upsertRate:
|
||||
collection:
|
||||
max: -1 # MB/s, default no limit
|
||||
max: -1 # MB/s, default no limit
|
||||
deleteRate:
|
||||
collection:
|
||||
max: -1 # MB/s, default no limit
|
||||
|
|
|
@ -240,6 +240,7 @@ enum RateType {
|
|||
DMLBulkLoad = 7;
|
||||
DQLSearch = 8;
|
||||
DQLQuery = 9;
|
||||
DMLUpsert = 10;
|
||||
}
|
||||
|
||||
message Rate {
|
||||
|
|
|
@ -35,19 +35,21 @@ const (
|
|||
RateType_DMLBulkLoad RateType = 7
|
||||
RateType_DQLSearch RateType = 8
|
||||
RateType_DQLQuery RateType = 9
|
||||
RateType_DMLUpsert RateType = 10
|
||||
)
|
||||
|
||||
var RateType_name = map[int32]string{
|
||||
0: "DDLCollection",
|
||||
1: "DDLPartition",
|
||||
2: "DDLIndex",
|
||||
3: "DDLFlush",
|
||||
4: "DDLCompaction",
|
||||
5: "DMLInsert",
|
||||
6: "DMLDelete",
|
||||
7: "DMLBulkLoad",
|
||||
8: "DQLSearch",
|
||||
9: "DQLQuery",
|
||||
0: "DDLCollection",
|
||||
1: "DDLPartition",
|
||||
2: "DDLIndex",
|
||||
3: "DDLFlush",
|
||||
4: "DDLCompaction",
|
||||
5: "DMLInsert",
|
||||
6: "DMLDelete",
|
||||
7: "DMLBulkLoad",
|
||||
8: "DQLSearch",
|
||||
9: "DQLQuery",
|
||||
10: "DMLUpsert",
|
||||
}
|
||||
|
||||
var RateType_value = map[string]int32{
|
||||
|
@ -61,6 +63,7 @@ var RateType_value = map[string]int32{
|
|||
"DMLBulkLoad": 7,
|
||||
"DQLSearch": 8,
|
||||
"DQLQuery": 9,
|
||||
"DMLUpsert": 10,
|
||||
}
|
||||
|
||||
func (x RateType) String() string {
|
||||
|
@ -2004,126 +2007,126 @@ func init() {
|
|||
func init() { proto.RegisterFile("internal.proto", fileDescriptor_41f4a519b878ee3b) }
|
||||
|
||||
var fileDescriptor_41f4a519b878ee3b = []byte{
|
||||
// 1921 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0x4b, 0x6f, 0x1c, 0xc7,
|
||||
0x11, 0xce, 0xec, 0x7b, 0x6b, 0x97, 0xe4, 0xb2, 0x4d, 0x29, 0xa3, 0x87, 0x2d, 0x7a, 0x12, 0x24,
|
||||
0x8c, 0x03, 0x4b, 0x0e, 0x0d, 0x5b, 0x39, 0x04, 0x09, 0x24, 0x8e, 0x4c, 0x2c, 0xbc, 0x52, 0xa8,
|
||||
0x59, 0xc1, 0x40, 0x72, 0x19, 0xf4, 0xee, 0x14, 0x97, 0x1d, 0xcd, 0x8b, 0xdd, 0x3d, 0x7c, 0xe8,
|
||||
0x9c, 0x5b, 0x80, 0xdc, 0x92, 0x43, 0x80, 0xe4, 0x07, 0x04, 0xc8, 0xd9, 0xc7, 0xfc, 0x83, 0x9c,
|
||||
0xf2, 0x6b, 0x7c, 0x0a, 0xfa, 0x31, 0xfb, 0xe2, 0x8a, 0x20, 0xa9, 0x3c, 0x9c, 0xdb, 0x54, 0xd5,
|
||||
0xd7, 0xd5, 0xdd, 0x55, 0xd5, 0x5f, 0x57, 0x0f, 0xac, 0xb3, 0x54, 0x22, 0x4f, 0x69, 0xfc, 0x30,
|
||||
0xe7, 0x99, 0xcc, 0xc8, 0xad, 0x84, 0xc5, 0x27, 0x85, 0x30, 0xd2, 0xc3, 0xd2, 0x78, 0xb7, 0x3b,
|
||||
0xce, 0x92, 0x24, 0x4b, 0x8d, 0xfa, 0x6e, 0x57, 0x8c, 0x8f, 0x30, 0xa1, 0x46, 0xf2, 0xee, 0xc1,
|
||||
0x9d, 0x7d, 0x94, 0xaf, 0x58, 0x82, 0xaf, 0xd8, 0xf8, 0xf5, 0xde, 0x11, 0x4d, 0x53, 0x8c, 0x03,
|
||||
0x3c, 0x2e, 0x50, 0x48, 0xef, 0x7d, 0xb8, 0xb7, 0x8f, 0x72, 0x28, 0xa9, 0x64, 0x42, 0xb2, 0xb1,
|
||||
0x58, 0x32, 0xdf, 0x82, 0xf7, 0xf6, 0x51, 0xfa, 0xd1, 0x92, 0xfa, 0x2b, 0x68, 0xbd, 0xc8, 0x22,
|
||||
0xec, 0xa7, 0x87, 0x19, 0xf9, 0x1c, 0x9a, 0x34, 0x8a, 0x38, 0x0a, 0xe1, 0x3a, 0xdb, 0xce, 0x4e,
|
||||
0x67, 0xf7, 0xfe, 0xc3, 0x85, 0x35, 0xda, 0x95, 0x3d, 0x31, 0x98, 0xa0, 0x04, 0x13, 0x02, 0x35,
|
||||
0x9e, 0xc5, 0xe8, 0x56, 0xb6, 0x9d, 0x9d, 0x76, 0xa0, 0xbf, 0xbd, 0xdf, 0x00, 0xf4, 0x53, 0x26,
|
||||
0x0f, 0x28, 0xa7, 0x89, 0x20, 0xb7, 0xa1, 0x91, 0xaa, 0x59, 0x7c, 0xed, 0xb8, 0x1a, 0x58, 0x89,
|
||||
0xf8, 0xd0, 0x15, 0x92, 0x72, 0x19, 0xe6, 0x1a, 0xe7, 0x56, 0xb6, 0xab, 0x3b, 0x9d, 0xdd, 0x0f,
|
||||
0x57, 0x4e, 0xfb, 0x25, 0x9e, 0x7f, 0x45, 0xe3, 0x02, 0x0f, 0x28, 0xe3, 0x41, 0x47, 0x0f, 0x33,
|
||||
0xde, 0xbd, 0x5f, 0x01, 0x0c, 0x25, 0x67, 0xe9, 0x64, 0xc0, 0x84, 0x54, 0x73, 0x9d, 0x28, 0x9c,
|
||||
0xda, 0x44, 0x75, 0xa7, 0x1d, 0x58, 0x89, 0x7c, 0x0a, 0x0d, 0x21, 0xa9, 0x2c, 0x84, 0x5e, 0x67,
|
||||
0x67, 0xf7, 0xde, 0xca, 0x59, 0x86, 0x1a, 0x12, 0x58, 0xa8, 0xf7, 0xb7, 0x0a, 0x6c, 0x2d, 0x44,
|
||||
0xd5, 0xc6, 0x8d, 0x7c, 0x02, 0xb5, 0x11, 0x15, 0x78, 0x69, 0xa0, 0x9e, 0x8b, 0xc9, 0x53, 0x2a,
|
||||
// 1927 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x58, 0x4b, 0x73, 0x1c, 0x49,
|
||||
0x11, 0xa6, 0xe7, 0x3d, 0x39, 0x23, 0x69, 0x54, 0x96, 0x4d, 0xfb, 0xb1, 0x6b, 0x6d, 0x43, 0x80,
|
||||
0x58, 0x62, 0xed, 0x45, 0x1b, 0xbb, 0xe6, 0x40, 0x40, 0xd8, 0x6a, 0xaf, 0x62, 0x62, 0xc7, 0x46,
|
||||
0xee, 0x31, 0x1b, 0x01, 0x97, 0x8e, 0x9a, 0xe9, 0xd4, 0xa8, 0x70, 0xbf, 0x54, 0x55, 0x6d, 0x49,
|
||||
0x3e, 0x73, 0x23, 0x82, 0x1b, 0x1c, 0x88, 0x80, 0x7f, 0xc0, 0x79, 0x83, 0x13, 0xff, 0x80, 0x13,
|
||||
0xbf, 0x66, 0x4f, 0x44, 0x3d, 0x7a, 0x5e, 0x1a, 0x2b, 0x24, 0x99, 0xc7, 0xee, 0xad, 0x33, 0xf3,
|
||||
0xab, 0xac, 0xaa, 0xcc, 0xac, 0xaf, 0xb2, 0x1a, 0xd6, 0x59, 0x2a, 0x91, 0xa7, 0x34, 0x7e, 0x90,
|
||||
0xf3, 0x4c, 0x66, 0xe4, 0x66, 0xc2, 0xe2, 0xd7, 0x85, 0x30, 0xd2, 0x83, 0xd2, 0x78, 0xa7, 0x3b,
|
||||
0xce, 0x92, 0x24, 0x4b, 0x8d, 0xfa, 0x4e, 0x57, 0x8c, 0x8f, 0x30, 0xa1, 0x46, 0xf2, 0xee, 0xc2,
|
||||
0xed, 0x7d, 0x94, 0x2f, 0x59, 0x82, 0x2f, 0xd9, 0xf8, 0xd5, 0xde, 0x11, 0x4d, 0x53, 0x8c, 0x03,
|
||||
0x3c, 0x2e, 0x50, 0x48, 0xef, 0x3d, 0xb8, 0xbb, 0x8f, 0x72, 0x28, 0xa9, 0x64, 0x42, 0xb2, 0xb1,
|
||||
0x58, 0x32, 0xdf, 0x84, 0x1b, 0xfb, 0x28, 0xfd, 0x68, 0x49, 0xfd, 0x25, 0xb4, 0x9e, 0x67, 0x11,
|
||||
0xf6, 0xd3, 0xc3, 0x8c, 0x7c, 0x06, 0x4d, 0x1a, 0x45, 0x1c, 0x85, 0x70, 0x9d, 0x6d, 0x67, 0xa7,
|
||||
0xb3, 0x7b, 0xef, 0xc1, 0xc2, 0x1a, 0xed, 0xca, 0x1e, 0x1b, 0x4c, 0x50, 0x82, 0x09, 0x81, 0x1a,
|
||||
0xcf, 0x62, 0x74, 0x2b, 0xdb, 0xce, 0x4e, 0x3b, 0xd0, 0xdf, 0xde, 0x6f, 0x01, 0xfa, 0x29, 0x93,
|
||||
0x07, 0x94, 0xd3, 0x44, 0x90, 0x5b, 0xd0, 0x48, 0xd5, 0x2c, 0xbe, 0x76, 0x5c, 0x0d, 0xac, 0x44,
|
||||
0x7c, 0xe8, 0x0a, 0x49, 0xb9, 0x0c, 0x73, 0x8d, 0x73, 0x2b, 0xdb, 0xd5, 0x9d, 0xce, 0xee, 0x07,
|
||||
0x2b, 0xa7, 0xfd, 0x02, 0xcf, 0xbe, 0xa4, 0x71, 0x81, 0x07, 0x94, 0xf1, 0xa0, 0xa3, 0x87, 0x19,
|
||||
0xef, 0xde, 0xaf, 0x01, 0x86, 0x92, 0xb3, 0x74, 0x32, 0x60, 0x42, 0xaa, 0xb9, 0x5e, 0x2b, 0x9c,
|
||||
0xda, 0x44, 0x75, 0xa7, 0x1d, 0x58, 0x89, 0x7c, 0x02, 0x0d, 0x21, 0xa9, 0x2c, 0x84, 0x5e, 0x67,
|
||||
0x67, 0xf7, 0xee, 0xca, 0x59, 0x86, 0x1a, 0x12, 0x58, 0xa8, 0xf7, 0xb7, 0x0a, 0x6c, 0x2d, 0x44,
|
||||
0xd5, 0xc6, 0x8d, 0x7c, 0x0c, 0xb5, 0x11, 0x15, 0x78, 0x61, 0xa0, 0x9e, 0x89, 0xc9, 0x13, 0x2a,
|
||||
0x30, 0xd0, 0x48, 0x15, 0xa5, 0x68, 0xd4, 0xf7, 0xf5, 0xec, 0xd5, 0x40, 0x7f, 0x13, 0x0f, 0xba,
|
||||
0xe3, 0x2c, 0x8e, 0x71, 0x2c, 0x59, 0x96, 0xf6, 0x7d, 0xb7, 0xaa, 0x6d, 0x0b, 0x3a, 0x85, 0xc9,
|
||||
0x29, 0x97, 0xcc, 0x88, 0xc2, 0xad, 0x6d, 0x57, 0x15, 0x66, 0x5e, 0x47, 0x7e, 0x04, 0x3d, 0xc9,
|
||||
0xe9, 0x09, 0xc6, 0xa1, 0x64, 0x09, 0x0a, 0x49, 0x93, 0xdc, 0xad, 0x6f, 0x3b, 0x3b, 0xb5, 0x60,
|
||||
0xc3, 0xe8, 0x5f, 0x95, 0x6a, 0xf2, 0x08, 0xde, 0x9b, 0x14, 0x94, 0xd3, 0x54, 0x22, 0xce, 0xa1,
|
||||
0xe9, 0x6b, 0x8c, 0x43, 0xc9, 0x12, 0x14, 0x92, 0x26, 0xb9, 0x5b, 0xdf, 0x76, 0x76, 0x6a, 0xc1,
|
||||
0x86, 0xd1, 0xbf, 0x2c, 0xd5, 0xe4, 0x21, 0xdc, 0x98, 0x14, 0x94, 0xd3, 0x54, 0x22, 0xce, 0xa1,
|
||||
0x1b, 0x1a, 0x4d, 0xa6, 0xa6, 0xd9, 0x80, 0x1f, 0xc3, 0xa6, 0x82, 0x65, 0x85, 0x9c, 0x83, 0x37,
|
||||
0x35, 0xbc, 0x67, 0x0d, 0x53, 0xb0, 0xf7, 0xb5, 0x03, 0xb7, 0x96, 0xe2, 0x25, 0xf2, 0x2c, 0x15,
|
||||
0x78, 0x83, 0x80, 0xdd, 0x24, 0x61, 0xe4, 0x31, 0xd4, 0xd5, 0x97, 0x70, 0xab, 0x57, 0x2d, 0x25,
|
||||
0x83, 0xf7, 0xfe, 0xe2, 0x00, 0xd9, 0xe3, 0x48, 0x25, 0x3e, 0x89, 0x19, 0x7d, 0x87, 0x3c, 0x7f,
|
||||
0x17, 0x9a, 0xd1, 0x28, 0x4c, 0x69, 0x52, 0x1e, 0x88, 0x46, 0x34, 0x7a, 0x41, 0x13, 0x24, 0x3f,
|
||||
0x35, 0xbc, 0x67, 0x0d, 0x53, 0xb0, 0xf7, 0x95, 0x03, 0x37, 0x97, 0xe2, 0x25, 0xf2, 0x2c, 0x15,
|
||||
0x78, 0x8d, 0x80, 0x5d, 0x27, 0x61, 0xe4, 0x11, 0xd4, 0xd5, 0x97, 0x70, 0xab, 0x97, 0x2d, 0x25,
|
||||
0x83, 0xf7, 0xfe, 0xea, 0x00, 0xd9, 0xe3, 0x48, 0x25, 0x3e, 0x8e, 0x19, 0x7d, 0x87, 0x3c, 0x7f,
|
||||
0x17, 0x9a, 0xd1, 0x28, 0x4c, 0x69, 0x52, 0x1e, 0x88, 0x46, 0x34, 0x7a, 0x4e, 0x13, 0x24, 0x3f,
|
||||
0x84, 0x8d, 0x59, 0x62, 0x0d, 0xa0, 0xaa, 0x01, 0xeb, 0x33, 0xb5, 0x06, 0x6e, 0x41, 0x9d, 0xaa,
|
||||
0x35, 0xb8, 0x35, 0x6d, 0x36, 0x82, 0x27, 0xa0, 0xe7, 0xf3, 0x2c, 0xff, 0x4f, 0xad, 0x6e, 0x3a,
|
||||
0x69, 0x75, 0x7e, 0xd2, 0x3f, 0x3b, 0xb0, 0xf9, 0x24, 0x96, 0xc8, 0xbf, 0xa5, 0x41, 0xf9, 0x7b,
|
||||
0xa5, 0xcc, 0x5a, 0x3f, 0x8d, 0xf0, 0xec, 0x7f, 0xb9, 0xc0, 0xf7, 0x01, 0x0e, 0x19, 0xc6, 0x91,
|
||||
0xc1, 0x98, 0x55, 0xb6, 0xb5, 0x46, 0x9b, 0xcb, 0xe3, 0x5f, 0xbf, 0xe4, 0xf8, 0x37, 0x56, 0x1c,
|
||||
0x7f, 0x17, 0x9a, 0xda, 0x49, 0xdf, 0xd7, 0x87, 0xae, 0x1a, 0x94, 0xa2, 0x22, 0x4f, 0x3c, 0x93,
|
||||
0x9c, 0x96, 0xe4, 0xd9, 0xba, 0x32, 0x79, 0xea, 0x61, 0x96, 0x3c, 0xff, 0x58, 0x87, 0xb5, 0x21,
|
||||
0x52, 0x3e, 0x3e, 0xba, 0x79, 0xf0, 0xb6, 0xa0, 0xce, 0xf1, 0x78, 0xca, 0x6d, 0x46, 0x98, 0xee,
|
||||
0xb8, 0x7a, 0xc9, 0x8e, 0x6b, 0x57, 0x20, 0xbc, 0xfa, 0x0a, 0xc2, 0xeb, 0x41, 0x35, 0x12, 0xb1,
|
||||
0x35, 0xb8, 0x35, 0x6d, 0x36, 0x82, 0x27, 0xa0, 0xe7, 0xf3, 0x2c, 0xff, 0x6f, 0xad, 0x6e, 0x3a,
|
||||
0x69, 0x75, 0x7e, 0xd2, 0xbf, 0x38, 0xb0, 0xf9, 0x38, 0x96, 0xc8, 0xbf, 0xa1, 0x41, 0xf9, 0x47,
|
||||
0xa5, 0xcc, 0x5a, 0x3f, 0x8d, 0xf0, 0xf4, 0xff, 0xb9, 0xc0, 0xf7, 0x00, 0x0e, 0x19, 0xc6, 0x91,
|
||||
0xc1, 0x98, 0x55, 0xb6, 0xb5, 0x46, 0x9b, 0xcb, 0xe3, 0x5f, 0xbf, 0xe0, 0xf8, 0x37, 0x56, 0x1c,
|
||||
0x7f, 0x17, 0x9a, 0xda, 0x49, 0xdf, 0xd7, 0x87, 0xae, 0x1a, 0x94, 0xa2, 0x22, 0x4f, 0x3c, 0x95,
|
||||
0x9c, 0x96, 0xe4, 0xd9, 0xba, 0x34, 0x79, 0xea, 0x61, 0x96, 0x3c, 0xff, 0x54, 0x87, 0xb5, 0x21,
|
||||
0x52, 0x3e, 0x3e, 0xba, 0x7e, 0xf0, 0xb6, 0xa0, 0xce, 0xf1, 0x78, 0xca, 0x6d, 0x46, 0x98, 0xee,
|
||||
0xb8, 0x7a, 0xc1, 0x8e, 0x6b, 0x97, 0x20, 0xbc, 0xfa, 0x0a, 0xc2, 0xeb, 0x41, 0x35, 0x12, 0xb1,
|
||||
0x0e, 0x58, 0x3b, 0x50, 0x9f, 0x8a, 0xa6, 0xf2, 0x98, 0x8e, 0xf1, 0x28, 0x8b, 0x23, 0xe4, 0xe1,
|
||||
0x84, 0x67, 0x85, 0xa1, 0xa9, 0x6e, 0xd0, 0x9b, 0x33, 0xec, 0x2b, 0x3d, 0x79, 0x0c, 0xad, 0x48,
|
||||
0xc4, 0xa1, 0x3c, 0xcf, 0xd1, 0x6d, 0x6d, 0x3b, 0x3b, 0xeb, 0x6f, 0xd9, 0xa6, 0x2f, 0xe2, 0x57,
|
||||
0xe7, 0x39, 0x06, 0xcd, 0xc8, 0x7c, 0x90, 0x4f, 0x60, 0x4b, 0x20, 0x67, 0x34, 0x66, 0x6f, 0x30,
|
||||
0x0a, 0xf1, 0x2c, 0xe7, 0x61, 0x1e, 0xd3, 0xd4, 0x6d, 0xeb, 0x89, 0xc8, 0xcc, 0xf6, 0xec, 0x2c,
|
||||
0x84, 0x67, 0x85, 0xa1, 0xa9, 0x6e, 0xd0, 0x9b, 0x33, 0xec, 0x2b, 0x3d, 0x79, 0x04, 0xad, 0x48,
|
||||
0xc4, 0xa1, 0x3c, 0xcb, 0xd1, 0x6d, 0x6d, 0x3b, 0x3b, 0xeb, 0x6f, 0xd9, 0xa6, 0x2f, 0xe2, 0x97,
|
||||
0x67, 0x39, 0x06, 0xcd, 0xc8, 0x7c, 0x90, 0x8f, 0x61, 0x4b, 0x20, 0x67, 0x34, 0x66, 0x6f, 0x30,
|
||||
0x0a, 0xf1, 0x34, 0xe7, 0x61, 0x1e, 0xd3, 0xd4, 0x6d, 0xeb, 0x89, 0xc8, 0xcc, 0xf6, 0xf4, 0x34,
|
||||
0xe7, 0x07, 0x31, 0x4d, 0xc9, 0x0e, 0xf4, 0xb2, 0x42, 0xe6, 0x85, 0x0c, 0x75, 0xde, 0x44, 0xc8,
|
||||
0x22, 0x17, 0xf4, 0x8e, 0xd6, 0x8d, 0xfe, 0x0b, 0xad, 0xee, 0x47, 0x2b, 0x49, 0xbc, 0x73, 0x2d,
|
||||
0x12, 0xef, 0x5e, 0x8f, 0xc4, 0xd7, 0x56, 0x93, 0x38, 0x59, 0x87, 0x4a, 0x7a, 0xec, 0xae, 0xeb,
|
||||
0xd4, 0x54, 0xd2, 0x63, 0x95, 0x48, 0x99, 0xe5, 0xaf, 0xdd, 0x0d, 0x93, 0x48, 0xf5, 0x4d, 0x3e,
|
||||
0x00, 0x48, 0x50, 0x72, 0x36, 0x56, 0x61, 0x71, 0x7b, 0x3a, 0x0f, 0x73, 0x1a, 0xf2, 0x7d, 0x58,
|
||||
0x63, 0x93, 0x34, 0xe3, 0xb8, 0xcf, 0xb3, 0x53, 0x96, 0x4e, 0xdc, 0xcd, 0x6d, 0x67, 0xa7, 0x15,
|
||||
0x2c, 0x2a, 0xc9, 0x5d, 0x68, 0x15, 0x42, 0xf5, 0x3d, 0x09, 0xba, 0x44, 0xfb, 0x98, 0xca, 0xde,
|
||||
0x3f, 0x6a, 0xb3, 0xc2, 0x14, 0x45, 0x2c, 0xc5, 0x7f, 0xeb, 0x0a, 0x99, 0x56, 0x73, 0x75, 0xbe,
|
||||
0x9a, 0x1f, 0x40, 0xc7, 0x6c, 0xcf, 0x54, 0x4d, 0xed, 0xc2, 0x8e, 0x1f, 0x40, 0x27, 0x2d, 0x92,
|
||||
0xf0, 0xb8, 0x40, 0xce, 0x50, 0xd8, 0x73, 0x0e, 0x69, 0x91, 0xbc, 0x34, 0x1a, 0xf2, 0x1e, 0xd4,
|
||||
0x65, 0x96, 0x87, 0xaf, 0xed, 0x31, 0x57, 0x71, 0xfc, 0x92, 0xfc, 0x0c, 0xee, 0x0a, 0xa4, 0x31,
|
||||
0x46, 0xa1, 0xc0, 0x49, 0x82, 0xa9, 0xec, 0xfb, 0x22, 0x14, 0x7a, 0xdb, 0x18, 0xb9, 0x4d, 0x5d,
|
||||
0x28, 0xae, 0x41, 0x0c, 0xa7, 0x80, 0xa1, 0xb5, 0xab, 0x3a, 0x18, 0x9b, 0x7e, 0x6e, 0x61, 0x58,
|
||||
0x4b, 0x37, 0x3e, 0x64, 0x66, 0x9a, 0x0e, 0xf8, 0x29, 0xb8, 0x93, 0x38, 0x1b, 0xd1, 0x38, 0xbc,
|
||||
0x30, 0xab, 0xdb, 0xd6, 0x93, 0xdd, 0x36, 0xf6, 0xe1, 0xd2, 0x94, 0x6a, 0x7b, 0x22, 0x66, 0x63,
|
||||
0x8c, 0xc2, 0x51, 0x9c, 0x8d, 0x5c, 0xd0, 0x05, 0x0f, 0x46, 0xf5, 0x34, 0xce, 0x46, 0xaa, 0xd0,
|
||||
0x2d, 0x40, 0x85, 0x61, 0x9c, 0x15, 0xa9, 0xd4, 0xe5, 0x5b, 0x0d, 0xd6, 0x8d, 0xfe, 0x45, 0x91,
|
||||
0xec, 0x29, 0x2d, 0xf9, 0x1e, 0xac, 0x59, 0x64, 0x76, 0x78, 0x28, 0x50, 0xea, 0xba, 0xad, 0x06,
|
||||
0x5d, 0xa3, 0xfc, 0xa5, 0xd6, 0x91, 0x03, 0xc5, 0xbb, 0x42, 0x3e, 0x99, 0x4c, 0x38, 0x4e, 0xa8,
|
||||
0x3a, 0xf7, 0xba, 0x5e, 0x3b, 0xbb, 0x3f, 0x78, 0xb8, 0xb2, 0x71, 0x7e, 0xb8, 0xb7, 0x88, 0x0e,
|
||||
0x96, 0x87, 0x7b, 0xc7, 0xb0, 0xb1, 0x84, 0x51, 0x54, 0xc3, 0x6d, 0x83, 0xa2, 0xca, 0xdf, 0x76,
|
||||
0xa7, 0x0b, 0x3a, 0xb2, 0x0d, 0x1d, 0x81, 0xfc, 0x84, 0x8d, 0x0d, 0xc4, 0x50, 0xdc, 0xbc, 0x4a,
|
||||
0x51, 0xb4, 0xcc, 0x24, 0x8d, 0x5f, 0xbc, 0xb4, 0x25, 0x53, 0x8a, 0xde, 0x3f, 0x6b, 0xb0, 0x11,
|
||||
0xa8, 0x12, 0xc1, 0x13, 0xfc, 0x7f, 0xa2, 0xd7, 0xb7, 0xd1, 0x5c, 0xe3, 0x5a, 0x34, 0xd7, 0xbc,
|
||||
0x32, 0xcd, 0xb5, 0xae, 0x45, 0x73, 0xed, 0xeb, 0xd1, 0x1c, 0xbc, 0x85, 0xe6, 0xb6, 0xa0, 0x1e,
|
||||
0xb3, 0x84, 0x95, 0x55, 0x6a, 0x84, 0x8b, 0xc4, 0xd5, 0x5d, 0x45, 0x5c, 0x77, 0xa0, 0xc5, 0x84,
|
||||
0x2d, 0xf2, 0x35, 0x0d, 0x68, 0x32, 0x61, 0xaa, 0xfb, 0x19, 0x3c, 0x60, 0x12, 0xb9, 0x2e, 0xb0,
|
||||
0x10, 0xcf, 0x24, 0xa6, 0x42, 0x7d, 0x71, 0x8c, 0x8a, 0x31, 0x86, 0x9c, 0x4a, 0xb4, 0xd4, 0x7a,
|
||||
0x7f, 0x0a, 0x7b, 0x56, 0xa2, 0x02, 0x0d, 0x0a, 0xa8, 0xc4, 0x05, 0x6a, 0xdc, 0x58, 0xa2, 0xc6,
|
||||
0x6f, 0xaa, 0xf3, 0x65, 0xf5, 0x2d, 0x20, 0xc7, 0x8f, 0xa0, 0xca, 0x22, 0xd3, 0x9a, 0x75, 0x76,
|
||||
0x22, 0x17, 0xf4, 0x8e, 0xd6, 0x8d, 0xfe, 0x73, 0xad, 0xee, 0x47, 0x2b, 0x49, 0xbc, 0x73, 0x25,
|
||||
0x12, 0xef, 0x5e, 0x8d, 0xc4, 0xd7, 0x56, 0x93, 0x38, 0x59, 0x87, 0x4a, 0x7a, 0xec, 0xae, 0xeb,
|
||||
0xd4, 0x54, 0xd2, 0x63, 0x95, 0x48, 0x99, 0xe5, 0xaf, 0xdc, 0x0d, 0x93, 0x48, 0xf5, 0x4d, 0xde,
|
||||
0x07, 0x48, 0x50, 0x72, 0x36, 0x56, 0x61, 0x71, 0x7b, 0x3a, 0x0f, 0x73, 0x1a, 0xf2, 0x7d, 0x58,
|
||||
0x63, 0x93, 0x34, 0xe3, 0xb8, 0xcf, 0xb3, 0x13, 0x96, 0x4e, 0xdc, 0xcd, 0x6d, 0x67, 0xa7, 0x15,
|
||||
0x2c, 0x2a, 0xc9, 0x1d, 0x68, 0x15, 0x42, 0xf5, 0x3d, 0x09, 0xba, 0x44, 0xfb, 0x98, 0xca, 0xde,
|
||||
0x3f, 0x6b, 0xb3, 0xc2, 0x14, 0x45, 0x2c, 0xc5, 0xff, 0xea, 0x0a, 0x99, 0x56, 0x73, 0x75, 0xbe,
|
||||
0x9a, 0xef, 0x43, 0xc7, 0x6c, 0xcf, 0x54, 0x4d, 0xed, 0xdc, 0x8e, 0xef, 0x43, 0x27, 0x2d, 0x92,
|
||||
0xf0, 0xb8, 0x40, 0xce, 0x50, 0xd8, 0x73, 0x0e, 0x69, 0x91, 0xbc, 0x30, 0x1a, 0x72, 0x03, 0xea,
|
||||
0x32, 0xcb, 0xc3, 0x57, 0xf6, 0x98, 0xab, 0x38, 0x7e, 0x41, 0x7e, 0x06, 0x77, 0x04, 0xd2, 0x18,
|
||||
0xa3, 0x50, 0xe0, 0x24, 0xc1, 0x54, 0xf6, 0x7d, 0x11, 0x0a, 0xbd, 0x6d, 0x8c, 0xdc, 0xa6, 0x2e,
|
||||
0x14, 0xd7, 0x20, 0x86, 0x53, 0xc0, 0xd0, 0xda, 0x55, 0x1d, 0x8c, 0x4d, 0x3f, 0xb7, 0x30, 0xac,
|
||||
0xa5, 0x1b, 0x1f, 0x32, 0x33, 0x4d, 0x07, 0xfc, 0x14, 0xdc, 0x49, 0x9c, 0x8d, 0x68, 0x1c, 0x9e,
|
||||
0x9b, 0xd5, 0x6d, 0xeb, 0xc9, 0x6e, 0x19, 0xfb, 0x70, 0x69, 0x4a, 0xb5, 0x3d, 0x11, 0xb3, 0x31,
|
||||
0x46, 0xe1, 0x28, 0xce, 0x46, 0x2e, 0xe8, 0x82, 0x07, 0xa3, 0x7a, 0x12, 0x67, 0x23, 0x55, 0xe8,
|
||||
0x16, 0xa0, 0xc2, 0x30, 0xce, 0x8a, 0x54, 0xea, 0xf2, 0xad, 0x06, 0xeb, 0x46, 0xff, 0xbc, 0x48,
|
||||
0xf6, 0x94, 0x96, 0x7c, 0x0f, 0xd6, 0x2c, 0x32, 0x3b, 0x3c, 0x14, 0x28, 0x75, 0xdd, 0x56, 0x83,
|
||||
0xae, 0x51, 0xfe, 0x52, 0xeb, 0xc8, 0x81, 0xe2, 0x5d, 0x21, 0x1f, 0x4f, 0x26, 0x1c, 0x27, 0x54,
|
||||
0x9d, 0x7b, 0x5d, 0xaf, 0x9d, 0xdd, 0x1f, 0x3c, 0x58, 0xd9, 0x38, 0x3f, 0xd8, 0x5b, 0x44, 0x07,
|
||||
0xcb, 0xc3, 0xbd, 0x63, 0xd8, 0x58, 0xc2, 0x28, 0xaa, 0xe1, 0xb6, 0x41, 0x51, 0xe5, 0x6f, 0xbb,
|
||||
0xd3, 0x05, 0x1d, 0xd9, 0x86, 0x8e, 0x40, 0xfe, 0x9a, 0x8d, 0x0d, 0xc4, 0x50, 0xdc, 0xbc, 0x4a,
|
||||
0x51, 0xb4, 0xcc, 0x24, 0x8d, 0x9f, 0xbf, 0xb0, 0x25, 0x53, 0x8a, 0xde, 0xbf, 0x6a, 0xb0, 0x11,
|
||||
0xa8, 0x12, 0xc1, 0xd7, 0xf8, 0x6d, 0xa2, 0xd7, 0xb7, 0xd1, 0x5c, 0xe3, 0x4a, 0x34, 0xd7, 0xbc,
|
||||
0x34, 0xcd, 0xb5, 0xae, 0x44, 0x73, 0xed, 0xab, 0xd1, 0x1c, 0xbc, 0x85, 0xe6, 0xb6, 0xa0, 0x1e,
|
||||
0xb3, 0x84, 0x95, 0x55, 0x6a, 0x84, 0xf3, 0xc4, 0xd5, 0x5d, 0x45, 0x5c, 0xb7, 0xa1, 0xc5, 0x84,
|
||||
0x2d, 0xf2, 0x35, 0x0d, 0x68, 0x32, 0x61, 0xaa, 0xfb, 0x29, 0xdc, 0x67, 0x12, 0xb9, 0x2e, 0xb0,
|
||||
0x10, 0x4f, 0x25, 0xa6, 0x42, 0x7d, 0x71, 0x8c, 0x8a, 0x31, 0x86, 0x9c, 0x4a, 0xb4, 0xd4, 0x7a,
|
||||
0x6f, 0x0a, 0x7b, 0x5a, 0xa2, 0x02, 0x0d, 0x0a, 0xa8, 0xc4, 0x05, 0x6a, 0xdc, 0x58, 0xa2, 0xc6,
|
||||
0xaf, 0xab, 0xf3, 0x65, 0xf5, 0x0d, 0x20, 0xc7, 0x0f, 0xa1, 0xca, 0x22, 0xd3, 0x9a, 0x75, 0x76,
|
||||
0xdd, 0x45, 0x3f, 0xf6, 0x05, 0xdb, 0xf7, 0x45, 0xa0, 0x40, 0xe4, 0x17, 0xd0, 0xb1, 0x25, 0x12,
|
||||
0x51, 0x49, 0x75, 0xf9, 0x75, 0x76, 0x3f, 0x58, 0x39, 0x46, 0xd7, 0x8c, 0x4f, 0x25, 0x0d, 0x4c,
|
||||
0x6b, 0x25, 0xd4, 0x37, 0xf9, 0x39, 0xdc, 0xbb, 0x48, 0x99, 0xdc, 0x86, 0x23, 0x72, 0x1b, 0xba,
|
||||
0xea, 0xee, 0x2c, 0x73, 0x66, 0x19, 0xaf, 0x88, 0xfc, 0x04, 0xb6, 0xe6, 0x48, 0x73, 0x36, 0xb0,
|
||||
0xa9, 0x59, 0x73, 0x8e, 0x50, 0x67, 0x43, 0x2e, 0xa3, 0xcd, 0xd6, 0xa5, 0xb4, 0xf9, 0xef, 0xa7,
|
||||
0xb1, 0x6f, 0x1c, 0x68, 0x0f, 0x32, 0x1a, 0xe9, 0x86, 0xf7, 0x06, 0x69, 0xbf, 0x0f, 0xed, 0xe9,
|
||||
0x51, 0x49, 0x75, 0xf9, 0x75, 0x76, 0xdf, 0x5f, 0x39, 0x46, 0xd7, 0x8c, 0x4f, 0x25, 0x0d, 0x4c,
|
||||
0x6b, 0x25, 0xd4, 0x37, 0xf9, 0x39, 0xdc, 0x3d, 0x4f, 0x99, 0xdc, 0x86, 0x23, 0x72, 0x1b, 0xba,
|
||||
0xea, 0x6e, 0x2f, 0x73, 0x66, 0x19, 0xaf, 0x88, 0xfc, 0x04, 0xb6, 0xe6, 0x48, 0x73, 0x36, 0xb0,
|
||||
0xa9, 0x59, 0x73, 0x8e, 0x50, 0x67, 0x43, 0x2e, 0xa2, 0xcd, 0xd6, 0x85, 0xb4, 0xf9, 0x9f, 0xa7,
|
||||
0xb1, 0xaf, 0x1d, 0x68, 0x0f, 0x32, 0x1a, 0xe9, 0x86, 0xf7, 0x1a, 0x69, 0xbf, 0x07, 0xed, 0xe9,
|
||||
0xea, 0x2d, 0xa3, 0xcc, 0x14, 0xca, 0x3a, 0xed, 0x59, 0x6d, 0xa3, 0x3b, 0xd7, 0xc4, 0xce, 0x35,
|
||||
0xa3, 0xb5, 0xc5, 0x66, 0xf4, 0x01, 0x74, 0x98, 0x5a, 0x50, 0x98, 0x53, 0x79, 0x64, 0x48, 0xa5,
|
||||
0x1d, 0x80, 0x56, 0x1d, 0x28, 0x8d, 0xea, 0x56, 0x4b, 0x80, 0xee, 0x56, 0x1b, 0x57, 0xee, 0x56,
|
||||
0xad, 0x13, 0xdd, 0xad, 0xfe, 0xd6, 0x01, 0xd0, 0x1b, 0x57, 0x65, 0x79, 0xd1, 0xa9, 0x73, 0x13,
|
||||
0xa3, 0xb5, 0xc5, 0x66, 0xf4, 0x3e, 0x74, 0x98, 0x5a, 0x50, 0x98, 0x53, 0x79, 0x64, 0x48, 0xa5,
|
||||
0x1d, 0x80, 0x56, 0x1d, 0x28, 0x8d, 0xea, 0x56, 0x4b, 0x80, 0xee, 0x56, 0x1b, 0x97, 0xee, 0x56,
|
||||
0xad, 0x13, 0xdd, 0xad, 0xfe, 0xce, 0x01, 0xd0, 0x1b, 0x57, 0x65, 0x79, 0xde, 0xa9, 0x73, 0x1d,
|
||||
0xa7, 0x8a, 0xed, 0xd4, 0x95, 0xc5, 0x31, 0xa6, 0x72, 0x96, 0x5b, 0x61, 0x83, 0x43, 0xd2, 0x22,
|
||||
0x09, 0x8c, 0xc9, 0xe6, 0x55, 0x78, 0xbf, 0x77, 0x00, 0x74, 0x71, 0x9a, 0x65, 0x2c, 0xd3, 0xae,
|
||||
0x73, 0x79, 0x1f, 0x5f, 0x59, 0x0c, 0xdd, 0xd3, 0x32, 0x74, 0x97, 0x3c, 0x5c, 0xa7, 0xe5, 0x31,
|
||||
0xdb, 0xbc, 0x8d, 0xae, 0xfe, 0xf6, 0xfe, 0xe0, 0x40, 0xd7, 0xae, 0xce, 0x2c, 0x69, 0x21, 0xcb,
|
||||
0xce, 0x72, 0x96, 0x75, 0x33, 0x93, 0x64, 0xfc, 0x3c, 0x14, 0xec, 0x4d, 0x79, 0xa7, 0x81, 0x51,
|
||||
0x0d, 0xd9, 0x1b, 0x54, 0xfc, 0xa6, 0x43, 0x92, 0x9d, 0x8a, 0xf2, 0x4e, 0x53, 0x61, 0xc8, 0x4e,
|
||||
0x85, 0xe2, 0x58, 0x8e, 0x63, 0x4c, 0x65, 0x7c, 0x1e, 0x26, 0x59, 0xc4, 0x0e, 0x19, 0x46, 0xba,
|
||||
0x1a, 0x5a, 0x41, 0xaf, 0x34, 0x3c, 0xb7, 0x7a, 0xef, 0x6b, 0xf5, 0xaa, 0x36, 0x07, 0xaa, 0xfc,
|
||||
0x6d, 0xf5, 0x5c, 0x4c, 0x6e, 0x50, 0xb5, 0x2a, 0xc4, 0xc6, 0x8f, 0x2a, 0x44, 0xf3, 0xa7, 0xa8,
|
||||
0x09, 0x8c, 0xc9, 0xe6, 0x55, 0x78, 0x7f, 0x70, 0x00, 0x74, 0x71, 0x9a, 0x65, 0x2c, 0xd3, 0xae,
|
||||
0x73, 0x71, 0x1f, 0x5f, 0x59, 0x0c, 0xdd, 0x93, 0x32, 0x74, 0x17, 0x3c, 0x5c, 0xa7, 0xe5, 0x31,
|
||||
0xdb, 0xbc, 0x8d, 0xae, 0xfe, 0xf6, 0xfe, 0xe8, 0x40, 0xd7, 0xae, 0xce, 0x2c, 0x69, 0x21, 0xcb,
|
||||
0xce, 0x72, 0x96, 0x75, 0x33, 0x93, 0x64, 0xfc, 0x2c, 0x14, 0xec, 0x4d, 0x79, 0xa7, 0x81, 0x51,
|
||||
0x0d, 0xd9, 0x1b, 0x54, 0xfc, 0xa6, 0x43, 0x92, 0x9d, 0x88, 0xf2, 0x4e, 0x53, 0x61, 0xc8, 0x4e,
|
||||
0x84, 0xe2, 0x58, 0x8e, 0x63, 0x4c, 0x65, 0x7c, 0x16, 0x26, 0x59, 0xc4, 0x0e, 0x19, 0x46, 0xba,
|
||||
0x1a, 0x5a, 0x41, 0xaf, 0x34, 0x3c, 0xb3, 0x7a, 0xef, 0x2b, 0xf5, 0xaa, 0x36, 0x07, 0xaa, 0xfc,
|
||||
0x6d, 0xf5, 0x4c, 0x4c, 0xae, 0x51, 0xb5, 0x2a, 0xc4, 0xc6, 0x8f, 0x2a, 0x44, 0xf3, 0xa7, 0xa8,
|
||||
0x1d, 0x2c, 0xe8, 0x54, 0x4f, 0x3a, 0x65, 0x7d, 0x13, 0xc7, 0x5a, 0x30, 0xa7, 0x51, 0x2b, 0x8f,
|
||||
0xf0, 0x90, 0x16, 0xf1, 0xfc, 0xed, 0x50, 0x33, 0xb7, 0x83, 0x35, 0x2c, 0xfc, 0xc9, 0x58, 0xdf,
|
||||
0xe3, 0x18, 0x61, 0x2a, 0x19, 0x8d, 0xf5, 0xff, 0xb1, 0x79, 0x4a, 0x76, 0x16, 0x29, 0x99, 0x7c,
|
||||
0x0c, 0x04, 0xd3, 0x31, 0x3f, 0xcf, 0x55, 0x05, 0xe5, 0x54, 0x88, 0xd3, 0x8c, 0x47, 0xf6, 0x29,
|
||||
0xb9, 0x39, 0xb5, 0x1c, 0x58, 0x03, 0xb9, 0x0d, 0x0d, 0x89, 0x29, 0x4d, 0xa5, 0x3d, 0x63, 0x56,
|
||||
0x04, 0x04, 0xd3, 0x31, 0x3f, 0xcb, 0x55, 0x05, 0xe5, 0x54, 0x88, 0x93, 0x8c, 0x47, 0xf6, 0x29,
|
||||
0xb9, 0x39, 0xb5, 0x1c, 0x58, 0x03, 0xb9, 0x05, 0x0d, 0x89, 0x29, 0x4d, 0xa5, 0x3d, 0x63, 0x56,
|
||||
0xb2, 0xf7, 0x8a, 0x28, 0x72, 0xe4, 0x36, 0xa6, 0x4d, 0x26, 0x86, 0x4a, 0x54, 0x0f, 0x51, 0x71,
|
||||
0x44, 0x77, 0x3f, 0xfb, 0x7c, 0xe6, 0xbe, 0x6e, 0x1e, 0xa2, 0x46, 0x5d, 0xfa, 0xf6, 0x9e, 0xc1,
|
||||
0xe6, 0x80, 0x09, 0x79, 0x90, 0xc5, 0x6c, 0x7c, 0x7e, 0xe3, 0xae, 0xc3, 0xfb, 0x9d, 0x03, 0x64,
|
||||
0xde, 0x8f, 0xfd, 0x8f, 0x33, 0xbb, 0x35, 0x9c, 0xab, 0xdf, 0x1a, 0x1f, 0x42, 0x37, 0xd7, 0x6e,
|
||||
0x44, 0x77, 0x3f, 0xfd, 0x6c, 0xe6, 0xbe, 0x6e, 0x1e, 0xa2, 0x46, 0x5d, 0xfa, 0xf6, 0x9e, 0xc2,
|
||||
0xe6, 0x80, 0x09, 0x79, 0x90, 0xc5, 0x6c, 0x7c, 0x76, 0xed, 0xae, 0xc3, 0xfb, 0xbd, 0x03, 0x64,
|
||||
0xde, 0x8f, 0xfd, 0x8f, 0x33, 0xbb, 0x35, 0x9c, 0xcb, 0xdf, 0x1a, 0x1f, 0x40, 0x37, 0xd7, 0x6e,
|
||||
0x42, 0x96, 0x1e, 0x66, 0x65, 0xf6, 0x3a, 0x46, 0xa7, 0x62, 0x2b, 0xd4, 0xf3, 0x59, 0x05, 0x33,
|
||||
0xe4, 0x59, 0x8c, 0x26, 0x79, 0xed, 0xa0, 0xad, 0x34, 0x81, 0x52, 0x78, 0x13, 0xb8, 0x33, 0x3c,
|
||||
0xca, 0x4e, 0xf7, 0xb2, 0xf4, 0x90, 0x4d, 0x0a, 0x73, 0x6d, 0xbe, 0xc3, 0xff, 0x08, 0x17, 0x9a,
|
||||
0x39, 0x95, 0xea, 0x4c, 0xd9, 0x1c, 0x95, 0xa2, 0xf7, 0x27, 0x07, 0xee, 0xae, 0x9a, 0xe9, 0x5d,
|
||||
0xb6, 0xbf, 0x0f, 0x6b, 0x63, 0xe3, 0xce, 0x78, 0xbb, 0xfa, 0x7f, 0xce, 0xc5, 0x71, 0xde, 0x33,
|
||||
0xa8, 0xe9, 0xe6, 0xe0, 0x11, 0x54, 0xb8, 0xd4, 0x2b, 0x58, 0xdf, 0x7d, 0xf0, 0x16, 0xa6, 0x50,
|
||||
0x40, 0xfd, 0x78, 0xad, 0x70, 0x49, 0xba, 0xe0, 0x70, 0xbd, 0x53, 0x27, 0x70, 0xf8, 0x47, 0x7f,
|
||||
0x75, 0xa0, 0x55, 0x9a, 0xc9, 0x26, 0xac, 0xf9, 0xfe, 0x60, 0x6f, 0xca, 0x55, 0xbd, 0xef, 0x90,
|
||||
0xe4, 0x59, 0x8c, 0x26, 0x79, 0xed, 0xa0, 0xad, 0x34, 0x81, 0x52, 0x78, 0x13, 0xb8, 0x3d, 0x3c,
|
||||
0xca, 0x4e, 0xf6, 0xb2, 0xf4, 0x90, 0x4d, 0x0a, 0x73, 0x6d, 0xbe, 0xc3, 0xff, 0x08, 0x17, 0x9a,
|
||||
0x39, 0x95, 0xea, 0x4c, 0xd9, 0x1c, 0x95, 0xa2, 0xf7, 0x67, 0x07, 0xee, 0xac, 0x9a, 0xe9, 0x5d,
|
||||
0xb6, 0xbf, 0x0f, 0x6b, 0x63, 0xe3, 0xce, 0x78, 0xbb, 0xfc, 0x7f, 0xce, 0xc5, 0x71, 0xde, 0x53,
|
||||
0xa8, 0xe9, 0xe6, 0xe0, 0x21, 0x54, 0xb8, 0xd4, 0x2b, 0x58, 0xdf, 0xbd, 0xff, 0x16, 0xa6, 0x50,
|
||||
0x40, 0xfd, 0x78, 0xad, 0x70, 0x49, 0xba, 0xe0, 0x70, 0xbd, 0x53, 0x27, 0x70, 0xf8, 0x87, 0x7f,
|
||||
0x77, 0xa0, 0x55, 0x9a, 0xc9, 0x26, 0xac, 0xf9, 0xfe, 0x60, 0x6f, 0xca, 0x55, 0xbd, 0xef, 0x90,
|
||||
0x1e, 0x74, 0x7d, 0x7f, 0x70, 0x50, 0x76, 0x84, 0x3d, 0x87, 0x74, 0xa1, 0xe5, 0xfb, 0x03, 0x4d,
|
||||
0x3e, 0xbd, 0x8a, 0x95, 0xbe, 0x88, 0x0b, 0x71, 0xd4, 0xab, 0x4e, 0x1d, 0x24, 0x39, 0x35, 0x0e,
|
||||
0x6a, 0x64, 0x0d, 0xda, 0xfe, 0xf3, 0x41, 0x3f, 0x15, 0xc8, 0x65, 0xaf, 0x6e, 0x45, 0x1f, 0x63,
|
||||
0x94, 0xd8, 0x6b, 0x90, 0x0d, 0xe8, 0xf8, 0xcf, 0x07, 0x4f, 0x8b, 0xf8, 0xb5, 0xba, 0xc7, 0x7a,
|
||||
0x4d, 0x6d, 0x7f, 0x39, 0x30, 0x8f, 0x94, 0x5e, 0x4b, 0xbb, 0x7f, 0x39, 0x50, 0xcf, 0xa6, 0xf3,
|
||||
0x5e, 0xfb, 0xe9, 0xe3, 0x5f, 0x7f, 0x36, 0x61, 0xf2, 0xa8, 0x18, 0xa9, 0x00, 0x3d, 0x32, 0x7b,
|
||||
0xfd, 0x98, 0x65, 0xf6, 0xeb, 0x51, 0xb9, 0xdf, 0x47, 0x7a, 0xfb, 0x53, 0x31, 0x1f, 0x8d, 0x1a,
|
||||
0x5a, 0xf3, 0xe9, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xb8, 0x21, 0x90, 0xae, 0x79, 0x17, 0x00,
|
||||
0x00,
|
||||
0x3e, 0xbd, 0x8a, 0x95, 0x3e, 0x8f, 0x0b, 0x71, 0xd4, 0xab, 0x4e, 0x1d, 0x24, 0x39, 0x35, 0x0e,
|
||||
0x6a, 0x64, 0x0d, 0xda, 0xfe, 0xb3, 0x41, 0x3f, 0x15, 0xc8, 0x65, 0xaf, 0x6e, 0x45, 0x1f, 0x63,
|
||||
0x94, 0xd8, 0x6b, 0x90, 0x0d, 0xe8, 0xf8, 0xcf, 0x06, 0x4f, 0x8a, 0xf8, 0x95, 0xba, 0xc7, 0x7a,
|
||||
0x4d, 0x6d, 0x7f, 0x31, 0x30, 0x8f, 0x94, 0x5e, 0x4b, 0xbb, 0x7f, 0x31, 0x50, 0xcf, 0xa6, 0xb3,
|
||||
0x5e, 0xdb, 0x0e, 0xfe, 0x55, 0xae, 0x7d, 0xc1, 0x93, 0x47, 0xbf, 0xf9, 0x74, 0xc2, 0xe4, 0x51,
|
||||
0x31, 0x52, 0xf1, 0x7a, 0x68, 0xb6, 0xfe, 0x11, 0xcb, 0xec, 0xd7, 0xc3, 0x72, 0xfb, 0x0f, 0x75,
|
||||
0x34, 0xa6, 0x62, 0x3e, 0x1a, 0x35, 0xb4, 0xe6, 0x93, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0xc1,
|
||||
0x18, 0x48, 0x84, 0x88, 0x17, 0x00, 0x00,
|
||||
}
|
||||
|
|
|
@ -2596,8 +2596,7 @@ func (node *Proxy) Upsert(ctx context.Context, request *milvuspb.UpsertRequest)
|
|||
insertReceiveSize := proto.Size(it.upsertMsg.InsertMsg)
|
||||
deleteReceiveSize := proto.Size(it.upsertMsg.DeleteMsg)
|
||||
|
||||
rateCol.Add(internalpb.RateType_DMLDelete.String(), float64(deleteReceiveSize))
|
||||
rateCol.Add(internalpb.RateType_DMLInsert.String(), float64(insertReceiveSize))
|
||||
rateCol.Add(internalpb.RateType_DMLUpsert.String(), float64(insertReceiveSize+deleteReceiveSize))
|
||||
|
||||
metrics.ProxyFunctionCall.WithLabelValues(strconv.FormatInt(paramtable.GetNodeID(), 10), method,
|
||||
metrics.SuccessLabel).Inc()
|
||||
|
|
|
@ -49,6 +49,7 @@ func getQuotaMetrics() (*metricsinfo.ProxyQuotaMetrics, error) {
|
|||
})
|
||||
}
|
||||
getRateMetric(internalpb.RateType_DMLInsert.String())
|
||||
getRateMetric(internalpb.RateType_DMLUpsert.String())
|
||||
getRateMetric(internalpb.RateType_DMLDelete.String())
|
||||
getRateMetric(internalpb.RateType_DQLSearch.String())
|
||||
getRateMetric(internalpb.RateType_DQLQuery.String())
|
||||
|
|
|
@ -228,7 +228,7 @@ func (rl *rateLimiter) setRates(collectionRate *proxypb.CollectionRate) error {
|
|||
|
||||
func (rl *rateLimiter) getErrorCode(rt internalpb.RateType) commonpb.ErrorCode {
|
||||
switch rt {
|
||||
case internalpb.RateType_DMLInsert, internalpb.RateType_DMLDelete, internalpb.RateType_DMLBulkLoad:
|
||||
case internalpb.RateType_DMLInsert, internalpb.RateType_DMLUpsert, internalpb.RateType_DMLDelete, internalpb.RateType_DMLBulkLoad:
|
||||
if errCode, ok := rl.quotaStates.Get(milvuspb.QuotaState_DenyToWrite); ok {
|
||||
return errCode
|
||||
}
|
||||
|
@ -250,6 +250,8 @@ func setRateGaugeByRateType(rateType internalpb.RateType, nodeID int64, collecti
|
|||
switch rateType {
|
||||
case internalpb.RateType_DMLInsert:
|
||||
metrics.ProxyLimiterRate.WithLabelValues(nodeIDStr, collectionIDStr, metrics.InsertLabel).Set(rate)
|
||||
case internalpb.RateType_DMLUpsert:
|
||||
metrics.ProxyLimiterRate.WithLabelValues(nodeIDStr, collectionIDStr, metrics.UpsertLabel).Set(rate)
|
||||
case internalpb.RateType_DMLDelete:
|
||||
metrics.ProxyLimiterRate.WithLabelValues(nodeIDStr, collectionIDStr, metrics.DeleteLabel).Set(rate)
|
||||
case internalpb.RateType_DQLSearch:
|
||||
|
@ -282,6 +284,12 @@ func (rl *rateLimiter) registerLimiters(globalLevel bool) {
|
|||
} else {
|
||||
r = "aConfig.DMLMaxInsertRatePerCollection
|
||||
}
|
||||
case internalpb.RateType_DMLUpsert:
|
||||
if globalLevel {
|
||||
r = "aConfig.DMLMaxUpsertRate
|
||||
} else {
|
||||
r = "aConfig.DMLMaxUpsertRatePerCollection
|
||||
}
|
||||
case internalpb.RateType_DMLDelete:
|
||||
if globalLevel {
|
||||
r = "aConfig.DMLMaxDeleteRate
|
||||
|
|
|
@ -176,6 +176,7 @@ func (node *Proxy) initRateCollector() error {
|
|||
return err
|
||||
}
|
||||
rateCol.Register(internalpb.RateType_DMLInsert.String())
|
||||
rateCol.Register(internalpb.RateType_DMLUpsert.String())
|
||||
rateCol.Register(internalpb.RateType_DMLDelete.String())
|
||||
// TODO: add bulkLoad rate
|
||||
rateCol.Register(internalpb.RateType_DQLSearch.String())
|
||||
|
|
|
@ -55,6 +55,9 @@ func getRequestInfo(req interface{}) (int64, internalpb.RateType, int, error) {
|
|||
case *milvuspb.InsertRequest:
|
||||
collectionID, _ := globalMetaCache.GetCollectionID(context.TODO(), r.GetDbName(), r.GetCollectionName())
|
||||
return collectionID, internalpb.RateType_DMLInsert, proto.Size(r), nil
|
||||
case *milvuspb.UpsertRequest:
|
||||
collectionID, _ := globalMetaCache.GetCollectionID(context.TODO(), r.GetDbName(), r.GetCollectionName())
|
||||
return collectionID, internalpb.RateType_DMLUpsert, proto.Size(r), nil
|
||||
case *milvuspb.DeleteRequest:
|
||||
collectionID, _ := globalMetaCache.GetCollectionID(context.TODO(), r.GetDbName(), r.GetCollectionName())
|
||||
return collectionID, internalpb.RateType_DMLDelete, proto.Size(r), nil
|
||||
|
@ -140,7 +143,7 @@ func wrapQuotaError(rt internalpb.RateType, errCode commonpb.ErrorCode, fullMeth
|
|||
// deny to write/read
|
||||
var op string
|
||||
switch rt {
|
||||
case internalpb.RateType_DMLInsert, internalpb.RateType_DMLDelete, internalpb.RateType_DMLBulkLoad:
|
||||
case internalpb.RateType_DMLInsert, internalpb.RateType_DMLUpsert, internalpb.RateType_DMLDelete, internalpb.RateType_DMLBulkLoad:
|
||||
op = "write"
|
||||
case internalpb.RateType_DQLSearch, internalpb.RateType_DQLQuery:
|
||||
op = "read"
|
||||
|
|
|
@ -62,6 +62,12 @@ func TestRateLimitInterceptor(t *testing.T) {
|
|||
assert.Equal(t, internalpb.RateType_DMLInsert, rt)
|
||||
assert.Equal(t, collection, int64(0))
|
||||
|
||||
collection, rt, size, err = getRequestInfo(&milvuspb.UpsertRequest{})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, proto.Size(&milvuspb.InsertRequest{}), size)
|
||||
assert.Equal(t, internalpb.RateType_DMLUpsert, rt)
|
||||
assert.Equal(t, collection, int64(0))
|
||||
|
||||
collection, rt, size, err = getRequestInfo(&milvuspb.DeleteRequest{})
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, proto.Size(&milvuspb.DeleteRequest{}), size)
|
||||
|
|
|
@ -284,6 +284,7 @@ func (q *QuotaCenter) forceDenyWriting(errorCode commonpb.ErrorCode, collections
|
|||
q.quotaStates[collection] = make(map[milvuspb.QuotaState]commonpb.ErrorCode)
|
||||
}
|
||||
q.currentRates[collection][internalpb.RateType_DMLInsert] = 0
|
||||
q.currentRates[collection][internalpb.RateType_DMLUpsert] = 0
|
||||
q.currentRates[collection][internalpb.RateType_DMLDelete] = 0
|
||||
q.currentRates[collection][internalpb.RateType_DMLBulkLoad] = 0
|
||||
q.quotaStates[collection][milvuspb.QuotaState_DenyToWrite] = errorCode
|
||||
|
@ -468,12 +469,16 @@ func (q *QuotaCenter) calculateWriteRates() error {
|
|||
if q.currentRates[collection][internalpb.RateType_DMLInsert] != Inf {
|
||||
q.currentRates[collection][internalpb.RateType_DMLInsert] *= Limit(factor)
|
||||
}
|
||||
if q.currentRates[collection][internalpb.RateType_DMLUpsert] != Inf {
|
||||
q.currentRates[collection][internalpb.RateType_DMLUpsert] *= Limit(factor)
|
||||
}
|
||||
if q.currentRates[collection][internalpb.RateType_DMLDelete] != Inf {
|
||||
q.currentRates[collection][internalpb.RateType_DMLDelete] *= Limit(factor)
|
||||
}
|
||||
|
||||
collectionProps := q.getCollectionLimitConfig(collection)
|
||||
q.guaranteeMinRate(getCollectionRateLimitConfig(collectionProps, common.CollectionInsertRateMinKey), internalpb.RateType_DMLInsert, collection)
|
||||
q.guaranteeMinRate(getCollectionRateLimitConfig(collectionProps, common.CollectionUpsertRateMinKey), internalpb.RateType_DMLUpsert, collection)
|
||||
q.guaranteeMinRate(getCollectionRateLimitConfig(collectionProps, common.CollectionDeleteRateMinKey), internalpb.RateType_DMLDelete, collection)
|
||||
log.RatedDebug(10, "QuotaCenter cool write rates off done",
|
||||
zap.Int64("collectionID", collection),
|
||||
|
@ -694,6 +699,7 @@ func (q *QuotaCenter) resetAllCurrentRates() {
|
|||
q.currentRates = map[int64]map[internalpb.RateType]ratelimitutil.Limit{}
|
||||
for _, collection := range q.writableCollections {
|
||||
q.resetCurrentRate(internalpb.RateType_DMLInsert, collection)
|
||||
q.resetCurrentRate(internalpb.RateType_DMLUpsert, collection)
|
||||
q.resetCurrentRate(internalpb.RateType_DMLDelete, collection)
|
||||
q.resetCurrentRate(internalpb.RateType_DMLBulkLoad, collection)
|
||||
}
|
||||
|
@ -718,6 +724,8 @@ func (q *QuotaCenter) resetCurrentRate(rt internalpb.RateType, collection int64)
|
|||
switch rt {
|
||||
case internalpb.RateType_DMLInsert:
|
||||
q.currentRates[collection][rt] = Limit(getCollectionRateLimitConfig(collectionProps, common.CollectionInsertRateMaxKey))
|
||||
case internalpb.RateType_DMLUpsert:
|
||||
q.currentRates[collection][rt] = Limit(getCollectionRateLimitConfig(collectionProps, common.CollectionUpsertRateMaxKey))
|
||||
case internalpb.RateType_DMLDelete:
|
||||
q.currentRates[collection][rt] = Limit(getCollectionRateLimitConfig(collectionProps, common.CollectionDeleteRateMaxKey))
|
||||
case internalpb.RateType_DMLBulkLoad:
|
||||
|
|
|
@ -131,10 +131,12 @@ func TestQuotaCenter(t *testing.T) {
|
|||
quotaCenter.forceDenyWriting(commonpb.ErrorCode_ForceDeny, 1, 2, 3, 4)
|
||||
for _, collection := range quotaCenter.writableCollections {
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[collection][internalpb.RateType_DMLInsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[collection][internalpb.RateType_DMLUpsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[collection][internalpb.RateType_DMLDelete])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[collection][internalpb.RateType_DMLBulkLoad])
|
||||
}
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[4][internalpb.RateType_DMLInsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[4][internalpb.RateType_DMLUpsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[4][internalpb.RateType_DMLDelete])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[4][internalpb.RateType_DMLBulkLoad])
|
||||
})
|
||||
|
@ -229,6 +231,8 @@ func TestQuotaCenter(t *testing.T) {
|
|||
paramtable.Get().Save(Params.QuotaConfig.MaxTimeTickDelay.Key, "10.0")
|
||||
paramtable.Get().Save(Params.QuotaConfig.DMLMaxInsertRatePerCollection.Key, "100.0")
|
||||
paramtable.Get().Save(Params.QuotaConfig.DMLMinInsertRatePerCollection.Key, "0.0")
|
||||
paramtable.Get().Save(Params.QuotaConfig.DMLMaxUpsertRatePerCollection.Key, "100.0")
|
||||
paramtable.Get().Save(Params.QuotaConfig.DMLMinUpsertRatePerCollection.Key, "0.0")
|
||||
paramtable.Get().Save(Params.QuotaConfig.DMLMaxDeleteRatePerCollection.Key, "100.0")
|
||||
paramtable.Get().Save(Params.QuotaConfig.DMLMinDeleteRatePerCollection.Key, "0.0")
|
||||
|
||||
|
@ -350,6 +354,7 @@ func TestQuotaCenter(t *testing.T) {
|
|||
assert.NoError(t, err)
|
||||
for _, collection := range quotaCenter.writableCollections {
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[collection][internalpb.RateType_DMLInsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[collection][internalpb.RateType_DMLUpsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[collection][internalpb.RateType_DMLDelete])
|
||||
}
|
||||
paramtable.Get().Save(Params.QuotaConfig.ForceDenyWriting.Key, forceBak)
|
||||
|
@ -499,6 +504,7 @@ func TestQuotaCenter(t *testing.T) {
|
|||
quotaCenter.checkDiskQuota()
|
||||
for _, collection := range quotaCenter.writableCollections {
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[collection][internalpb.RateType_DMLInsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[collection][internalpb.RateType_DMLUpsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[collection][internalpb.RateType_DMLDelete])
|
||||
}
|
||||
paramtable.Get().Save(Params.QuotaConfig.DiskQuota.Key, quotaBackup.GetValue())
|
||||
|
@ -512,10 +518,13 @@ func TestQuotaCenter(t *testing.T) {
|
|||
quotaCenter.resetAllCurrentRates()
|
||||
quotaCenter.checkDiskQuota()
|
||||
assert.NotEqual(t, Limit(0), quotaCenter.currentRates[1][internalpb.RateType_DMLInsert])
|
||||
assert.NotEqual(t, Limit(0), quotaCenter.currentRates[1][internalpb.RateType_DMLUpsert])
|
||||
assert.NotEqual(t, Limit(0), quotaCenter.currentRates[1][internalpb.RateType_DMLDelete])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[2][internalpb.RateType_DMLInsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[2][internalpb.RateType_DMLUpsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[2][internalpb.RateType_DMLDelete])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[3][internalpb.RateType_DMLInsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[3][internalpb.RateType_DMLUpsert])
|
||||
assert.Equal(t, Limit(0), quotaCenter.currentRates[3][internalpb.RateType_DMLDelete])
|
||||
paramtable.Get().Save(Params.QuotaConfig.DiskQuotaPerCollection.Key, colQuotaBackup.GetValue())
|
||||
})
|
||||
|
@ -614,6 +623,7 @@ func TestQuotaCenter(t *testing.T) {
|
|||
quotaCenter.resetAllCurrentRates()
|
||||
|
||||
assert.Equal(t, float64(quotaCenter.currentRates[1][internalpb.RateType_DMLInsert]), Params.QuotaConfig.DMLMaxInsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(quotaCenter.currentRates[1][internalpb.RateType_DMLUpsert]), Params.QuotaConfig.DMLMaxUpsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(quotaCenter.currentRates[1][internalpb.RateType_DMLDelete]), Params.QuotaConfig.DMLMaxDeleteRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(quotaCenter.currentRates[1][internalpb.RateType_DMLBulkLoad]), Params.QuotaConfig.DMLMaxBulkLoadRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(quotaCenter.currentRates[1][internalpb.RateType_DQLSearch]), Params.QuotaConfig.DQLMaxSearchRatePerCollection.GetAsFloat())
|
||||
|
@ -646,6 +656,10 @@ func TestQuotaCenter(t *testing.T) {
|
|||
Key: common.CollectionSearchRateMaxKey,
|
||||
Value: "5",
|
||||
},
|
||||
{
|
||||
Key: common.CollectionUpsertRateMaxKey,
|
||||
Value: "6",
|
||||
},
|
||||
},
|
||||
}, nil)
|
||||
quotaCenter.resetAllCurrentRates()
|
||||
|
@ -654,6 +668,6 @@ func TestQuotaCenter(t *testing.T) {
|
|||
assert.Equal(t, float64(quotaCenter.currentRates[1][internalpb.RateType_DMLBulkLoad]), float64(3*1024*1024))
|
||||
assert.Equal(t, float64(quotaCenter.currentRates[1][internalpb.RateType_DQLQuery]), float64(4))
|
||||
assert.Equal(t, float64(quotaCenter.currentRates[1][internalpb.RateType_DQLSearch]), float64(5))
|
||||
|
||||
assert.Equal(t, float64(quotaCenter.currentRates[1][internalpb.RateType_DMLUpsert]), float64(6*1024*1024))
|
||||
})
|
||||
}
|
||||
|
|
|
@ -143,6 +143,10 @@ func getCollectionRateLimitConfigDefaultValue(configKey string) float64 {
|
|||
return Params.QuotaConfig.DMLMaxInsertRatePerCollection.GetAsFloat()
|
||||
case common.CollectionInsertRateMinKey:
|
||||
return Params.QuotaConfig.DMLMinInsertRatePerCollection.GetAsFloat()
|
||||
case common.CollectionUpsertRateMaxKey:
|
||||
return Params.QuotaConfig.DMLMaxUpsertRatePerCollection.GetAsFloat()
|
||||
case common.CollectionUpsertRateMinKey:
|
||||
return Params.QuotaConfig.DMLMinUpsertRatePerCollection.GetAsFloat()
|
||||
case common.CollectionDeleteRateMaxKey:
|
||||
return Params.QuotaConfig.DMLMaxDeleteRatePerCollection.GetAsFloat()
|
||||
case common.CollectionDeleteRateMinKey:
|
||||
|
@ -177,6 +181,10 @@ func getCollectionRateLimitConfig(properties map[string]string, configKey string
|
|||
return megaBytes2Bytes(rate)
|
||||
case common.CollectionInsertRateMinKey:
|
||||
return megaBytes2Bytes(rate)
|
||||
case common.CollectionUpsertRateMaxKey:
|
||||
return megaBytes2Bytes(rate)
|
||||
case common.CollectionUpsertRateMinKey:
|
||||
return megaBytes2Bytes(rate)
|
||||
case common.CollectionDeleteRateMaxKey:
|
||||
return megaBytes2Bytes(rate)
|
||||
case common.CollectionDeleteRateMinKey:
|
||||
|
|
|
@ -105,6 +105,8 @@ const (
|
|||
// rate limit
|
||||
CollectionInsertRateMaxKey = "collection.insertRate.max.mb"
|
||||
CollectionInsertRateMinKey = "collection.insertRate.min.mb"
|
||||
CollectionUpsertRateMaxKey = "collection.upsertRate.max.mb"
|
||||
CollectionUpsertRateMinKey = "collection.upsertRate.min.mb"
|
||||
CollectionDeleteRateMaxKey = "collection.deleteRate.max.mb"
|
||||
CollectionDeleteRateMinKey = "collection.deleteRate.min.mb"
|
||||
CollectionBulkLoadRateMaxKey = "collection.bulkLoadRate.max.mb"
|
||||
|
|
|
@ -64,12 +64,16 @@ type quotaConfig struct {
|
|||
DMLLimitEnabled ParamItem `refreshable:"true"`
|
||||
DMLMaxInsertRate ParamItem `refreshable:"true"`
|
||||
DMLMinInsertRate ParamItem `refreshable:"true"`
|
||||
DMLMaxUpsertRate ParamItem `refreshable:"true"`
|
||||
DMLMinUpsertRate ParamItem `refreshable:"true"`
|
||||
DMLMaxDeleteRate ParamItem `refreshable:"true"`
|
||||
DMLMinDeleteRate ParamItem `refreshable:"true"`
|
||||
DMLMaxBulkLoadRate ParamItem `refreshable:"true"`
|
||||
DMLMinBulkLoadRate ParamItem `refreshable:"true"`
|
||||
DMLMaxInsertRatePerCollection ParamItem `refreshable:"true"`
|
||||
DMLMinInsertRatePerCollection ParamItem `refreshable:"true"`
|
||||
DMLMaxUpsertRatePerCollection ParamItem `refreshable:"true"`
|
||||
DMLMinUpsertRatePerCollection ParamItem `refreshable:"true"`
|
||||
DMLMaxDeleteRatePerCollection ParamItem `refreshable:"true"`
|
||||
DMLMinDeleteRatePerCollection ParamItem `refreshable:"true"`
|
||||
DMLMaxBulkLoadRatePerCollection ParamItem `refreshable:"true"`
|
||||
|
@ -377,6 +381,94 @@ The maximum rate will not be greater than ` + "max" + `.`,
|
|||
}
|
||||
p.DMLMinInsertRatePerCollection.Init(base.mgr)
|
||||
|
||||
p.DMLMaxUpsertRate = ParamItem{
|
||||
Key: "quotaAndLimits.dml.upsertRate.max",
|
||||
Version: "2.3.0",
|
||||
DefaultValue: max,
|
||||
Formatter: func(v string) string {
|
||||
if !p.DMLLimitEnabled.GetAsBool() {
|
||||
return max
|
||||
}
|
||||
rate := getAsFloat(v)
|
||||
if math.Abs(rate-defaultMax) > 0.001 { // maxRate != defaultMax
|
||||
rate = megaBytes2Bytes(rate)
|
||||
}
|
||||
// [0, inf)
|
||||
if rate < 0 {
|
||||
return max
|
||||
}
|
||||
return fmt.Sprintf("%f", rate)
|
||||
},
|
||||
Doc: "MB/s, default no limit",
|
||||
Export: true,
|
||||
}
|
||||
p.DMLMaxUpsertRate.Init(base.mgr)
|
||||
|
||||
p.DMLMinUpsertRate = ParamItem{
|
||||
Key: "quotaAndLimits.dml.UpsertRate.min",
|
||||
Version: "2.3.0",
|
||||
DefaultValue: min,
|
||||
Formatter: func(v string) string {
|
||||
if !p.DMLLimitEnabled.GetAsBool() {
|
||||
return min
|
||||
}
|
||||
rate := megaBytes2Bytes(getAsFloat(v))
|
||||
// [0, inf)
|
||||
if rate < 0 {
|
||||
return min
|
||||
}
|
||||
if !p.checkMinMaxLegal(rate, p.DMLMaxUpsertRate.GetAsFloat()) {
|
||||
return min
|
||||
}
|
||||
return fmt.Sprintf("%f", rate)
|
||||
},
|
||||
}
|
||||
p.DMLMinUpsertRate.Init(base.mgr)
|
||||
|
||||
p.DMLMaxUpsertRatePerCollection = ParamItem{
|
||||
Key: "quotaAndLimits.dml.upsertRate.collection.max",
|
||||
Version: "2.3.0",
|
||||
DefaultValue: max,
|
||||
Formatter: func(v string) string {
|
||||
if !p.DMLLimitEnabled.GetAsBool() {
|
||||
return max
|
||||
}
|
||||
rate := getAsFloat(v)
|
||||
if math.Abs(rate-defaultMax) > 0.001 { // maxRate != defaultMax
|
||||
rate = megaBytes2Bytes(rate)
|
||||
}
|
||||
// [0, inf)
|
||||
if rate < 0 {
|
||||
return p.DMLMaxUpsertRate.GetValue()
|
||||
}
|
||||
return fmt.Sprintf("%f", rate)
|
||||
},
|
||||
Doc: "MB/s, default no limit",
|
||||
Export: true,
|
||||
}
|
||||
p.DMLMaxUpsertRatePerCollection.Init(base.mgr)
|
||||
|
||||
p.DMLMinUpsertRatePerCollection = ParamItem{
|
||||
Key: "quotaAndLimits.dml.upsertRate.collection.min",
|
||||
Version: "2.3.0",
|
||||
DefaultValue: min,
|
||||
Formatter: func(v string) string {
|
||||
if !p.DMLLimitEnabled.GetAsBool() {
|
||||
return min
|
||||
}
|
||||
rate := megaBytes2Bytes(getAsFloat(v))
|
||||
// [0, inf)
|
||||
if rate < 0 {
|
||||
return min
|
||||
}
|
||||
if !p.checkMinMaxLegal(rate, p.DMLMaxUpsertRatePerCollection.GetAsFloat()) {
|
||||
return min
|
||||
}
|
||||
return fmt.Sprintf("%f", rate)
|
||||
},
|
||||
}
|
||||
p.DMLMinUpsertRatePerCollection.Init(base.mgr)
|
||||
|
||||
p.DMLMaxDeleteRate = ParamItem{
|
||||
Key: "quotaAndLimits.dml.deleteRate.max",
|
||||
Version: "2.2.0",
|
||||
|
|
|
@ -52,6 +52,8 @@ func TestQuotaParam(t *testing.T) {
|
|||
params.Save(params.QuotaConfig.DMLLimitEnabled.Key, "true")
|
||||
params.Save(params.QuotaConfig.DMLMaxInsertRate.Key, "10")
|
||||
params.Save(params.QuotaConfig.DMLMinInsertRate.Key, "1")
|
||||
params.Save(params.QuotaConfig.DMLMaxUpsertRate.Key, "10")
|
||||
params.Save(params.QuotaConfig.DMLMinUpsertRate.Key, "1")
|
||||
params.Save(params.QuotaConfig.DMLMaxDeleteRate.Key, "10")
|
||||
params.Save(params.QuotaConfig.DMLMinDeleteRate.Key, "1")
|
||||
params.Save(params.QuotaConfig.DMLMaxBulkLoadRate.Key, "10")
|
||||
|
@ -59,6 +61,8 @@ func TestQuotaParam(t *testing.T) {
|
|||
assert.Equal(t, true, params.QuotaConfig.DMLLimitEnabled.GetAsBool())
|
||||
assert.Equal(t, float64(10)*1024*1024, params.QuotaConfig.DMLMaxInsertRate.GetAsFloat())
|
||||
assert.Equal(t, float64(1)*1024*1024, params.QuotaConfig.DMLMinInsertRate.GetAsFloat())
|
||||
assert.Equal(t, float64(10)*1024*1024, params.QuotaConfig.DMLMaxUpsertRate.GetAsFloat())
|
||||
assert.Equal(t, float64(1)*1024*1024, params.QuotaConfig.DMLMinUpsertRate.GetAsFloat())
|
||||
assert.Equal(t, float64(10)*1024*1024, params.QuotaConfig.DMLMaxDeleteRate.GetAsFloat())
|
||||
assert.Equal(t, float64(1)*1024*1024, params.QuotaConfig.DMLMinDeleteRate.GetAsFloat())
|
||||
assert.Equal(t, float64(10)*1024*1024, params.QuotaConfig.DMLMaxBulkLoadRate.GetAsFloat())
|
||||
|
@ -70,6 +74,8 @@ func TestQuotaParam(t *testing.T) {
|
|||
params.Save(params.QuotaConfig.DMLLimitEnabled.Key, "true")
|
||||
params.Save(params.QuotaConfig.DMLMaxInsertRatePerCollection.Key, "10")
|
||||
params.Save(params.QuotaConfig.DMLMinInsertRatePerCollection.Key, "1")
|
||||
params.Save(params.QuotaConfig.DMLMaxUpsertRatePerCollection.Key, "10")
|
||||
params.Save(params.QuotaConfig.DMLMinUpsertRatePerCollection.Key, "1")
|
||||
params.Save(params.QuotaConfig.DMLMaxDeleteRatePerCollection.Key, "10")
|
||||
params.Save(params.QuotaConfig.DMLMinDeleteRatePerCollection.Key, "1")
|
||||
params.Save(params.QuotaConfig.DMLMaxBulkLoadRatePerCollection.Key, "10")
|
||||
|
@ -77,6 +83,8 @@ func TestQuotaParam(t *testing.T) {
|
|||
assert.Equal(t, true, params.QuotaConfig.DMLLimitEnabled.GetAsBool())
|
||||
assert.Equal(t, float64(10)*1024*1024, params.QuotaConfig.DMLMaxInsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(1)*1024*1024, params.QuotaConfig.DMLMinInsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(10)*1024*1024, params.QuotaConfig.DMLMaxUpsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(1)*1024*1024, params.QuotaConfig.DMLMinUpsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(10)*1024*1024, params.QuotaConfig.DMLMaxDeleteRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(1)*1024*1024, params.QuotaConfig.DMLMinDeleteRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(10)*1024*1024, params.QuotaConfig.DMLMaxBulkLoadRatePerCollection.GetAsFloat())
|
||||
|
@ -85,12 +93,16 @@ func TestQuotaParam(t *testing.T) {
|
|||
// test only set global rate limit
|
||||
params.Save(params.QuotaConfig.DMLMaxInsertRatePerCollection.Key, "-1")
|
||||
params.Save(params.QuotaConfig.DMLMinInsertRatePerCollection.Key, "-1")
|
||||
params.Save(params.QuotaConfig.DMLMaxUpsertRatePerCollection.Key, "-1")
|
||||
params.Save(params.QuotaConfig.DMLMinUpsertRatePerCollection.Key, "-1")
|
||||
params.Save(params.QuotaConfig.DMLMaxDeleteRatePerCollection.Key, "-1")
|
||||
params.Save(params.QuotaConfig.DMLMinDeleteRatePerCollection.Key, "-1")
|
||||
params.Save(params.QuotaConfig.DMLMaxBulkLoadRatePerCollection.Key, "-1")
|
||||
params.Save(params.QuotaConfig.DMLMinBulkLoadRatePerCollection.Key, "-1")
|
||||
assert.Equal(t, params.QuotaConfig.DMLMaxInsertRate.GetAsFloat(), params.QuotaConfig.DMLMaxInsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(0), params.QuotaConfig.DMLMinInsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, params.QuotaConfig.DMLMaxUpsertRate.GetAsFloat(), params.QuotaConfig.DMLMaxInsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(0), params.QuotaConfig.DMLMinUpsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, params.QuotaConfig.DMLMaxDeleteRate.GetAsFloat(), params.QuotaConfig.DMLMaxDeleteRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(0), params.QuotaConfig.DMLMinDeleteRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, params.QuotaConfig.DMLMaxBulkLoadRate.GetAsFloat(), params.QuotaConfig.DMLMaxBulkLoadRatePerCollection.GetAsFloat())
|
||||
|
@ -99,12 +111,16 @@ func TestQuotaParam(t *testing.T) {
|
|||
// test invalid config value
|
||||
params.Save(params.QuotaConfig.DMLMaxInsertRatePerCollection.Key, "1")
|
||||
params.Save(params.QuotaConfig.DMLMinInsertRatePerCollection.Key, "5")
|
||||
params.Save(params.QuotaConfig.DMLMaxUpsertRatePerCollection.Key, "1")
|
||||
params.Save(params.QuotaConfig.DMLMinUpsertRatePerCollection.Key, "5")
|
||||
params.Save(params.QuotaConfig.DMLMaxDeleteRatePerCollection.Key, "1")
|
||||
params.Save(params.QuotaConfig.DMLMinDeleteRatePerCollection.Key, "5")
|
||||
params.Save(params.QuotaConfig.DMLMaxBulkLoadRatePerCollection.Key, "1")
|
||||
params.Save(params.QuotaConfig.DMLMinBulkLoadRatePerCollection.Key, "5")
|
||||
assert.Equal(t, float64(1*1024*1024), params.QuotaConfig.DMLMaxInsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(0), params.QuotaConfig.DMLMinInsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(1*1024*1024), params.QuotaConfig.DMLMaxUpsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(0), params.QuotaConfig.DMLMinUpsertRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(1*1024*1024), params.QuotaConfig.DMLMaxDeleteRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(0), params.QuotaConfig.DMLMinDeleteRatePerCollection.GetAsFloat())
|
||||
assert.Equal(t, float64(1*1024*1024), params.QuotaConfig.DMLMaxBulkLoadRatePerCollection.GetAsFloat())
|
||||
|
|
Loading…
Reference in New Issue