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
smellthemoon 2023-07-11 11:20:34 +08:00 committed by GitHub
parent 28200acb67
commit d63323d117
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 288 additions and 122 deletions

View File

@ -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

View File

@ -240,6 +240,7 @@ enum RateType {
DMLBulkLoad = 7;
DQLSearch = 8;
DQLQuery = 9;
DMLUpsert = 10;
}
message Rate {

View File

@ -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,
}

View File

@ -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()

View File

@ -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())

View File

@ -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 = &quotaConfig.DMLMaxInsertRatePerCollection
}
case internalpb.RateType_DMLUpsert:
if globalLevel {
r = &quotaConfig.DMLMaxUpsertRate
} else {
r = &quotaConfig.DMLMaxUpsertRatePerCollection
}
case internalpb.RateType_DMLDelete:
if globalLevel {
r = &quotaConfig.DMLMaxDeleteRate

View File

@ -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())

View File

@ -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"

View File

@ -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)

View File

@ -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:

View File

@ -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))
})
}

View File

@ -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:

View File

@ -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"

View File

@ -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",

View File

@ -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())