diff --git a/api/aperture/policy/language/v1/policy.proto b/api/aperture/policy/language/v1/policy.proto index b48e695cbb..134e5caf0a 100644 --- a/api/aperture/policy/language/v1/policy.proto +++ b/api/aperture/policy/language/v1/policy.proto @@ -696,40 +696,12 @@ message Scheduler { } }]; // @gotags: default:"1" - // Timeout override decides how long a request in the workload can wait for tokens - // - // This value impacts the fairness because the larger the timeout the higher the chance a request has to get scheduled. - // - // :::caution - // This timeout needs to be strictly less than the timeout set on the - // client for the whole GRPC call: - // * in case of envoy, timeout set on `grpc_service` used in `ext_authz` filter, - // * in case of libraries, timeout configured... TODO. - // - // We're using fail-open logic in integrations, so if the GRPC timeout - // fires first, the flow will end up being unconditionally allowed while - // it're still waiting on the scheduler. - // - // To avoid such cases, the end-to-end GRPC timeout should also contain - // some headroom for constant overhead like serialization, etc. Default - // value for GRPC timeouts is 10ms, giving 5ms of headeroom, so when - // tweaking this timeout, make sure to adjust the GRPC timeout accordingly. - // ::: - google.protobuf.Duration timeout = 3 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - extensions: { - key: "x-go-default" - value: { - string_value: "0.005s" - } - } - }]; // @gotags: default:"0.005s" - // Fairness key is a label key that can be used to provide fairness within a workload // // Any label that could be used in label matcher can be used here. Eg. if // you have a classifier that sets `user` flow label, you might want to set // `fairness_key = "user"`. - string fairness_key = 4; + string fairness_key = 3; } message WorkloadAndLabelMatcher { @@ -787,7 +759,7 @@ message Scheduler { // See also [workload definition in the concepts // section](/concepts/flow-control/actuators/scheduler.md#workload). // ::: - repeated WorkloadAndLabelMatcher workloads = 5; + repeated WorkloadAndLabelMatcher workloads = 3; // Workload to be used if none of workloads specified in `workloads` match. Workload default_workload = 4; @@ -796,7 +768,7 @@ message Scheduler { // historical latency. Each workload's `tokens` will be set to average // latency of flows in that workload during last few seconds (exact duration // of this average can change). - bool auto_tokens = 3 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + bool auto_tokens = 5 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { extensions: { key: "x-go-default" value: { @@ -804,6 +776,53 @@ message Scheduler { } } }]; // @gotags: default:"true" + + // Timeout as a factor of tokens for a flow in a workload + // + // If a flow is not able to get tokens within `timeout_factor` * `tokens` of duration, + // it will be rejected. + // + // This value impacts the prioritization and fairness because the larger the timeout the higher the chance a request has to get scheduled. + double timeout_factor = 6 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + extensions: { + key: "x-go-default" + value: { + number_value: 0.5 + } + } + extensions: { + key: "x-go-validate" + value: { + string_value: "gte=0.0" + } + } + }]; // @gotags: validate:"gte=0.0" default:"0.5" + + // Max Timeout is the value with which the flow timeout calculated by `timeout_factor` is capped + // + // :::caution + // This timeout needs to be strictly less than the timeout set on the + // client for the whole GRPC call: + // * in case of envoy, timeout set on `grpc_service` used in `ext_authz` filter, + // * in case of libraries, timeout configured... TODO. + // + // We're using fail-open logic in integrations, so if the GRPC timeout + // fires first, the flow will end up being unconditionally allowed while + // it're still waiting on the scheduler. + // + // To avoid such cases, the end-to-end GRPC timeout should also contain + // some headroom for constant overhead like serialization, etc. Default + // value for GRPC timeouts is 500ms, giving 50ms of headeroom, so when + // tweaking this timeout, make sure to adjust the GRPC timeout accordingly. + // ::: + google.protobuf.Duration max_timeout = 7 [(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + extensions: { + key: "x-go-default" + value: { + string_value: "0.45s" + } + } + }]; // @gotags: default:"0.45s" } // Takes the load shed factor input signal and publishes it to the schedulers in the data-plane diff --git a/api/gen/openapiv2/aperture.swagger.yaml b/api/gen/openapiv2/aperture.swagger.yaml index 6dbffdbfda..c601d69437 100644 --- a/api/gen/openapiv2/aperture.swagger.yaml +++ b/api/gen/openapiv2/aperture.swagger.yaml @@ -244,28 +244,6 @@ definitions: Priority level ranges from 0 to 255. Higher numbers means higher priority level. x-go-validate: gte=0,lte=255 - timeout: - type: string - description: |- - This value impacts the fairness because the larger the timeout the higher the chance a request has to get scheduled. - - :::caution - This timeout needs to be strictly less than the timeout set on the - client for the whole GRPC call: - * in case of envoy, timeout set on `grpc_service` used in `ext_authz` filter, - * in case of libraries, timeout configured... TODO. - - We're using fail-open logic in integrations, so if the GRPC timeout - fires first, the flow will end up being unconditionally allowed while - it're still waiting on the scheduler. - - To avoid such cases, the end-to-end GRPC timeout should also contain - some headroom for constant overhead like serialization, etc. Default - value for GRPC timeouts is 10ms, giving 5ms of headeroom, so when - tweaking this timeout, make sure to adjust the GRPC timeout accordingly. - ::: - title: Timeout override decides how long a request in the workload can wait for tokens - x-go-default: 0.005s tokens: type: string format: uint64 @@ -1678,12 +1656,43 @@ definitions: default_workload: $ref: '#/definitions/SchedulerWorkload' description: Workload to be used if none of workloads specified in `workloads` match. + max_timeout: + type: string + description: |- + :::caution + This timeout needs to be strictly less than the timeout set on the + client for the whole GRPC call: + * in case of envoy, timeout set on `grpc_service` used in `ext_authz` filter, + * in case of libraries, timeout configured... TODO. + + We're using fail-open logic in integrations, so if the GRPC timeout + fires first, the flow will end up being unconditionally allowed while + it're still waiting on the scheduler. + + To avoid such cases, the end-to-end GRPC timeout should also contain + some headroom for constant overhead like serialization, etc. Default + value for GRPC timeouts is 500ms, giving 50ms of headeroom, so when + tweaking this timeout, make sure to adjust the GRPC timeout accordingly. + ::: + title: Max Timeout is the value with which the flow timeout calculated by `timeout_factor` is capped + x-go-default: 0.45s out_ports: $ref: '#/definitions/v1SchedulerOuts' description: Output ports for the Scheduler component. selector: $ref: '#/definitions/v1Selector' description: Selector decides for which service or flows the scheduler will be applied. + timeout_factor: + type: number + format: double + description: |- + If a flow is not able to get tokens within `timeout_factor` * `tokens` of duration, + it will be rejected. + + This value impacts the prioritization and fairness because the larger the timeout the higher the chance a request has to get scheduled. + title: Timeout as a factor of tokens for a flow in a workload + x-go-default: 0.5 + x-go-validate: gte=0.0 workloads: type: array items: diff --git a/api/gen/proto/go/aperture/policy/language/v1/policy.pb.go b/api/gen/proto/go/aperture/policy/language/v1/policy.pb.go index 2030f57131..7e9d5b357f 100644 --- a/api/gen/proto/go/aperture/policy/language/v1/policy.pb.go +++ b/api/gen/proto/go/aperture/policy/language/v1/policy.pb.go @@ -1277,14 +1277,39 @@ type Scheduler struct { // See also [workload definition in the concepts // section](/concepts/flow-control/actuators/scheduler.md#workload). // ::: - Workloads []*Scheduler_WorkloadAndLabelMatcher `protobuf:"bytes,5,rep,name=workloads,proto3" json:"workloads,omitempty"` + Workloads []*Scheduler_WorkloadAndLabelMatcher `protobuf:"bytes,3,rep,name=workloads,proto3" json:"workloads,omitempty"` // Workload to be used if none of workloads specified in `workloads` match. DefaultWorkload *Scheduler_Workload `protobuf:"bytes,4,opt,name=default_workload,json=defaultWorkload,proto3" json:"default_workload,omitempty"` // Automatically estimate weight of flows in each workload, based on // historical latency. Each workload's `tokens` will be set to average // latency of flows in that workload during last few seconds (exact duration // of this average can change). - AutoTokens bool `protobuf:"varint,3,opt,name=auto_tokens,json=autoTokens,proto3" json:"auto_tokens,omitempty" default:"true"` // @gotags: default:"true" + AutoTokens bool `protobuf:"varint,5,opt,name=auto_tokens,json=autoTokens,proto3" json:"auto_tokens,omitempty" default:"true"` // @gotags: default:"true" + // Timeout as a factor of tokens for a flow in a workload + // + // If a flow is not able to get tokens within `timeout_factor` * `tokens` of duration, + // it will be rejected. + // + // This value impacts the prioritization and fairness because the larger the timeout the higher the chance a request has to get scheduled. + TimeoutFactor float64 `protobuf:"fixed64,6,opt,name=timeout_factor,json=timeoutFactor,proto3" json:"timeout_factor,omitempty" validate:"gte=0.0" default:"0.5"` // @gotags: validate:"gte=0.0" default:"0.5" + // Max Timeout is the value with which the flow timeout calculated by `timeout_factor` is capped + // + // :::caution + // This timeout needs to be strictly less than the timeout set on the + // client for the whole GRPC call: + // * in case of envoy, timeout set on `grpc_service` used in `ext_authz` filter, + // * in case of libraries, timeout configured... TODO. + // + // We're using fail-open logic in integrations, so if the GRPC timeout + // fires first, the flow will end up being unconditionally allowed while + // it're still waiting on the scheduler. + // + // To avoid such cases, the end-to-end GRPC timeout should also contain + // some headroom for constant overhead like serialization, etc. Default + // value for GRPC timeouts is 500ms, giving 50ms of headeroom, so when + // tweaking this timeout, make sure to adjust the GRPC timeout accordingly. + // ::: + MaxTimeout *durationpb.Duration `protobuf:"bytes,7,opt,name=max_timeout,json=maxTimeout,proto3" json:"max_timeout,omitempty" default:"0.45s"` // @gotags: default:"0.45s" } func (x *Scheduler) Reset() { @@ -1354,6 +1379,20 @@ func (x *Scheduler) GetAutoTokens() bool { return false } +func (x *Scheduler) GetTimeoutFactor() float64 { + if x != nil { + return x.TimeoutFactor + } + return 0 +} + +func (x *Scheduler) GetMaxTimeout() *durationpb.Duration { + if x != nil { + return x.MaxTimeout + } + return nil +} + // Takes the load shed factor input signal and publishes it to the schedulers in the data-plane type LoadShedActuator struct { state protoimpl.MessageState @@ -2483,32 +2522,12 @@ type Scheduler_Workload struct { // Tokens determines the cost of admitting a single request the workload, which is typically defined as milliseconds of response latency. // This override is applicable only if `auto_tokens` is set to false. Tokens uint64 `protobuf:"varint,2,opt,name=tokens,proto3" json:"tokens,omitempty" default:"1"` // @gotags: default:"1" - // Timeout override decides how long a request in the workload can wait for tokens - // - // This value impacts the fairness because the larger the timeout the higher the chance a request has to get scheduled. - // - // :::caution - // This timeout needs to be strictly less than the timeout set on the - // client for the whole GRPC call: - // * in case of envoy, timeout set on `grpc_service` used in `ext_authz` filter, - // * in case of libraries, timeout configured... TODO. - // - // We're using fail-open logic in integrations, so if the GRPC timeout - // fires first, the flow will end up being unconditionally allowed while - // it're still waiting on the scheduler. - // - // To avoid such cases, the end-to-end GRPC timeout should also contain - // some headroom for constant overhead like serialization, etc. Default - // value for GRPC timeouts is 10ms, giving 5ms of headeroom, so when - // tweaking this timeout, make sure to adjust the GRPC timeout accordingly. - // ::: - Timeout *durationpb.Duration `protobuf:"bytes,3,opt,name=timeout,proto3" json:"timeout,omitempty" default:"0.005s"` // @gotags: default:"0.005s" // Fairness key is a label key that can be used to provide fairness within a workload // // Any label that could be used in label matcher can be used here. Eg. if // you have a classifier that sets `user` flow label, you might want to set // `fairness_key = "user"`. - FairnessKey string `protobuf:"bytes,4,opt,name=fairness_key,json=fairnessKey,proto3" json:"fairness_key,omitempty"` + FairnessKey string `protobuf:"bytes,3,opt,name=fairness_key,json=fairnessKey,proto3" json:"fairness_key,omitempty"` } func (x *Scheduler_Workload) Reset() { @@ -2557,13 +2576,6 @@ func (x *Scheduler_Workload) GetTokens() uint64 { return 0 } -func (x *Scheduler_Workload) GetTimeout() *durationpb.Duration { - if x != nil { - return x.Timeout - } - return nil -} - func (x *Scheduler_Workload) GetFairnessKey() string { if x != nil { return x.FairnessKey @@ -3640,7 +3652,7 @@ var file_aperture_policy_language_v1_policy_proto_rawDesc = []byte{ 0x31, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x68, 0x65, 0x64, 0x41, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x10, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x68, 0x65, 0x64, 0x41, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x14, 0x0a, 0x12, 0x61, 0x63, 0x74, 0x75, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x85, 0x08, 0x0a, + 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0xf0, 0x08, 0x0a, 0x09, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, @@ -3651,7 +3663,7 @@ var file_aperture_policy_language_v1_policy_proto_rawDesc = []byte{ 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5c, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x61, 0x70, 0x65, + 0x6f, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4c, 0x61, @@ -3663,10 +3675,22 @@ var file_aperture_policy_language_v1_policy_proto_rawDesc = []byte{ 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3d, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x42, 0x1c, 0x92, 0x41, 0x19, 0x82, 0x03, 0x16, 0x0a, 0x0c, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x1c, 0x92, 0x41, 0x19, 0x82, 0x03, 0x16, 0x0a, 0x0c, 0x78, 0x2d, 0x67, 0x6f, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x06, 0x1a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x1a, 0xff, 0x01, 0x0a, 0x08, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x42, 0x0a, + 0x12, 0x63, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x66, 0x61, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x42, 0x3c, 0x92, 0x41, 0x39, 0x82, 0x03, 0x19, + 0x0a, 0x0c, 0x78, 0x2d, 0x67, 0x6f, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x09, + 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x82, 0x03, 0x1a, 0x0a, 0x0d, 0x78, 0x2d, + 0x67, 0x6f, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x09, 0x1a, 0x07, 0x67, + 0x74, 0x65, 0x3d, 0x30, 0x2e, 0x30, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x46, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x59, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1d, 0x92, 0x41, 0x1a, 0x82, 0x03, 0x17, 0x0a, 0x0c, 0x78, + 0x2d, 0x67, 0x6f, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x07, 0x1a, 0x05, 0x30, + 0x2e, 0x34, 0x35, 0x73, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x1a, 0xaa, 0x01, 0x0a, 0x08, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x42, 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x26, 0x92, 0x41, 0x23, 0x82, 0x03, 0x20, 0x0a, 0x0d, 0x78, 0x2d, 0x67, 0x6f, 0x2d, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0f, 0x1a, 0x0d, 0x67, 0x74, 0x65, 0x3d, 0x30, 0x2c, @@ -3674,185 +3698,180 @@ var file_aperture_policy_language_v1_policy_proto_rawDesc = []byte{ 0x79, 0x12, 0x37, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x42, 0x1f, 0x92, 0x41, 0x1c, 0x82, 0x03, 0x19, 0x0a, 0x0c, 0x78, 0x2d, 0x67, 0x6f, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x09, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xf0, 0x3f, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x53, 0x0a, 0x07, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1e, 0x92, 0x41, 0x1b, 0x82, 0x03, 0x18, 0x0a, 0x0c, - 0x78, 0x2d, 0x67, 0x6f, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x08, 0x1a, 0x06, - 0x30, 0x2e, 0x30, 0x30, 0x35, 0x73, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x66, 0x61, 0x69, 0x72, 0x6e, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x61, 0x69, 0x72, 0x6e, 0x65, 0x73, 0x73, 0x4b, - 0x65, 0x79, 0x1a, 0xba, 0x01, 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x41, - 0x6e, 0x64, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x4b, - 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x52, 0x0a, 0x0d, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x72, 0x52, 0x0c, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x1a, - 0xb2, 0x01, 0x0a, 0x04, 0x4f, 0x75, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x14, 0x61, 0x63, 0x63, 0x65, - 0x70, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, + 0xf0, 0x3f, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x66, 0x61, + 0x69, 0x72, 0x6e, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x61, 0x69, 0x72, 0x6e, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x1a, 0xba, 0x01, + 0x0a, 0x17, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x6e, 0x64, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x61, 0x70, + 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x08, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x52, 0x0a, 0x0d, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x52, 0x0c, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x1a, 0xb2, 0x01, 0x0a, 0x04, 0x4f, + 0x75, 0x74, 0x73, 0x12, 0x54, 0x0a, 0x14, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x5f, + 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x6f, 0x72, 0x74, 0x52, 0x13, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x43, 0x6f, + 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x54, 0x0a, 0x14, 0x69, 0x6e, 0x63, + 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, + 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, + 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x13, 0x69, 0x6e, 0x63, 0x6f, + 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x22, + 0xb4, 0x01, 0x0a, 0x10, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x68, 0x65, 0x64, 0x41, 0x63, 0x74, 0x75, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x4c, 0x0a, 0x08, 0x69, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x13, 0x61, 0x63, 0x63, 0x65, 0x70, - 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x54, - 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x68, 0x65, 0x64, 0x41, 0x63, 0x74, + 0x75, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x49, 0x6e, 0x73, 0x52, 0x07, 0x69, 0x6e, 0x50, 0x6f, 0x72, + 0x74, 0x73, 0x1a, 0x52, 0x0a, 0x03, 0x49, 0x6e, 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x0e, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x68, 0x65, 0x64, + 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x9e, 0x02, 0x0a, 0x06, 0x50, 0x72, 0x6f, 0x6d, 0x51, + 0x4c, 0x12, 0x45, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x51, 0x4c, 0x2e, 0x4f, 0x75, 0x74, 0x73, 0x52, 0x08, + 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x67, 0x0a, 0x13, 0x65, + 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x1b, 0x92, 0x41, 0x18, 0x82, 0x03, 0x15, 0x0a, 0x0c, 0x78, 0x2d, 0x67, + 0x6f, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x05, 0x1a, 0x03, 0x31, 0x30, 0x73, + 0x52, 0x12, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x1a, 0x41, 0x0a, 0x04, 0x4f, 0x75, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x06, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, - 0x13, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x63, 0x79, 0x22, 0xb4, 0x01, 0x0a, 0x10, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x68, 0x65, - 0x64, 0x41, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x4c, 0x0a, 0x08, 0x69, 0x6e, 0x5f, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, + 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, + 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, + 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x4f, + 0x75, 0x74, 0x73, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x1a, 0x41, 0x0a, 0x04, 0x4f, 0x75, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, - 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x53, 0x68, - 0x65, 0x64, 0x41, 0x63, 0x74, 0x75, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x49, 0x6e, 0x73, 0x52, 0x07, - 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x52, 0x0a, 0x03, 0x49, 0x6e, 0x73, 0x12, 0x4b, - 0x0a, 0x10, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x66, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, - 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x0e, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x68, 0x65, 0x64, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x9e, 0x02, 0x0a, 0x06, - 0x50, 0x72, 0x6f, 0x6d, 0x51, 0x4c, 0x12, 0x45, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x70, 0x65, 0x72, - 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x51, 0x4c, 0x2e, 0x4f, - 0x75, 0x74, 0x73, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x12, 0x67, 0x0a, 0x13, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1b, 0x92, 0x41, 0x18, 0x82, 0x03, 0x15, - 0x0a, 0x0c, 0x78, 0x2d, 0x67, 0x6f, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x05, - 0x1a, 0x03, 0x31, 0x30, 0x73, 0x52, 0x12, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x1a, 0x41, 0x0a, 0x04, 0x4f, 0x75, 0x74, - 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x06, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xc7, 0x02, 0x0a, 0x04, 0x53, 0x71, 0x72, 0x74, 0x12, + 0x40, 0x0a, 0x08, 0x69, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x50, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x01, 0x0a, - 0x08, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x09, 0x6f, 0x75, 0x74, - 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, - 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, - 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x73, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x72, - 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x41, 0x0a, 0x04, 0x4f, 0x75, 0x74, 0x73, - 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x6f, 0x72, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xc7, 0x02, 0x0a, 0x04, - 0x53, 0x71, 0x72, 0x74, 0x12, 0x40, 0x0a, 0x08, 0x69, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, + 0x53, 0x71, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x52, 0x07, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, + 0x73, 0x12, 0x43, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x71, 0x72, 0x74, 0x2e, 0x4f, 0x75, 0x74, 0x73, 0x52, 0x08, 0x6f, 0x75, + 0x74, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x05, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x01, 0x42, 0x1f, 0x92, 0x41, 0x1c, 0x82, 0x03, 0x19, 0x0a, 0x0c, 0x78, + 0x2d, 0x67, 0x6f, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x09, 0x11, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x52, 0x05, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x1a, 0x3e, 0x0a, + 0x03, 0x49, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x41, 0x0a, + 0x04, 0x4f, 0x75, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, + 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x9e, 0x03, 0x0a, 0x0c, 0x45, 0x78, 0x74, 0x72, 0x61, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x6f, + 0x72, 0x12, 0x48, 0x0a, 0x08, 0x69, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x49, + 0x6e, 0x73, 0x52, 0x07, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x4b, 0x0a, 0x09, 0x6f, + 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, + 0x72, 0x61, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x4f, 0x75, 0x74, 0x73, 0x52, 0x08, + 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x74, 0x0a, 0x1a, 0x6d, 0x61, 0x78, 0x5f, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1b, 0x92, 0x41, 0x18, 0x82, 0x03, 0x15, 0x0a, + 0x0c, 0x78, 0x2d, 0x67, 0x6f, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x05, 0x1a, + 0x03, 0x31, 0x30, 0x73, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x74, 0x72, 0x61, 0x70, 0x6f, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x1a, 0x3e, + 0x0a, 0x03, 0x49, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x41, + 0x0a, 0x04, 0x4f, 0x75, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x71, 0x72, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x52, 0x07, 0x69, - 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x43, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, - 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x65, 0x72, - 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x71, 0x72, 0x74, 0x2e, 0x4f, 0x75, 0x74, - 0x73, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x05, 0x73, - 0x63, 0x61, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x42, 0x1f, 0x92, 0x41, 0x1c, 0x82, - 0x03, 0x19, 0x0a, 0x0c, 0x78, 0x2d, 0x67, 0x6f, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x12, 0x09, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x52, 0x05, 0x73, 0x63, 0x61, - 0x6c, 0x65, 0x1a, 0x3e, 0x0a, 0x03, 0x49, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x05, 0x69, 0x6e, 0x70, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x8f, 0x02, 0x0a, 0x03, 0x4d, 0x61, 0x78, 0x12, 0x3f, 0x0a, 0x08, 0x69, 0x6e, 0x5f, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, + 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x78, 0x2e, 0x49, 0x6e, + 0x73, 0x52, 0x07, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x42, 0x0a, 0x09, 0x6f, 0x75, + 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x61, 0x78, 0x2e, + 0x4f, 0x75, 0x74, 0x73, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x40, + 0x0a, 0x03, 0x49, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, + 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, + 0x1a, 0x41, 0x0a, 0x04, 0x4f, 0x75, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 0x41, 0x0a, 0x04, 0x4f, 0x75, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x75, + 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x8f, 0x02, 0x0a, 0x03, 0x4d, 0x69, 0x6e, 0x12, 0x3f, 0x0a, 0x08, 0x69, + 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, + 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x69, 0x6e, 0x2e, + 0x49, 0x6e, 0x73, 0x52, 0x07, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x42, 0x0a, 0x09, + 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x69, + 0x6e, 0x2e, 0x4f, 0x75, 0x74, 0x73, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x73, + 0x1a, 0x40, 0x0a, 0x03, 0x49, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, + 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, + 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x73, 0x1a, 0x41, 0x0a, 0x04, 0x4f, 0x75, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x9e, 0x03, 0x0a, 0x0c, 0x45, 0x78, 0x74, 0x72, 0x61, 0x70, - 0x6f, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x48, 0x0a, 0x08, 0x69, 0x6e, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, - 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x70, 0x6f, 0x6c, 0x61, - 0x74, 0x6f, 0x72, 0x2e, 0x49, 0x6e, 0x73, 0x52, 0x07, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x73, - 0x12, 0x4b, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x6f, 0x72, 0x2e, 0x4f, - 0x75, 0x74, 0x73, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x74, 0x0a, - 0x1a, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1b, 0x92, 0x41, - 0x18, 0x82, 0x03, 0x15, 0x0a, 0x0c, 0x78, 0x2d, 0x67, 0x6f, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x12, 0x05, 0x1a, 0x03, 0x31, 0x30, 0x73, 0x52, 0x18, 0x6d, 0x61, 0x78, 0x45, 0x78, - 0x74, 0x72, 0x61, 0x70, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x1a, 0x3e, 0x0a, 0x03, 0x49, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x05, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, - 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x1a, 0x41, 0x0a, 0x04, 0x4f, 0x75, 0x74, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, - 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, - 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x06, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x8f, 0x02, 0x0a, 0x03, 0x4d, 0x61, 0x78, 0x12, 0x3f, - 0x0a, 0x08, 0x69, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x61, 0x78, 0x2e, 0x49, 0x6e, 0x73, 0x52, 0x07, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, - 0x42, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x61, 0x78, 0x2e, 0x4f, 0x75, 0x74, 0x73, 0x52, 0x08, 0x6f, 0x75, 0x74, 0x50, 0x6f, - 0x72, 0x74, 0x73, 0x1a, 0x40, 0x0a, 0x03, 0x49, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x06, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x65, - 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, - 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x73, 0x1a, 0x41, 0x0a, 0x04, 0x4f, 0x75, 0x74, 0x73, 0x12, 0x39, 0x0a, - 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x32, 0x7e, 0x0a, 0x0d, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x0b, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, - 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, - 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x8f, 0x02, 0x0a, 0x03, 0x4d, 0x69, 0x6e, - 0x12, 0x3f, 0x0a, 0x08, 0x69, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x69, 0x6e, 0x2e, 0x49, 0x6e, 0x73, 0x52, 0x07, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, - 0x73, 0x12, 0x42, 0x0a, 0x09, 0x6f, 0x75, 0x74, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, - 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x4d, 0x69, 0x6e, 0x2e, 0x4f, 0x75, 0x74, 0x73, 0x52, 0x08, 0x6f, 0x75, 0x74, - 0x50, 0x6f, 0x72, 0x74, 0x73, 0x1a, 0x40, 0x0a, 0x03, 0x49, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x06, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, - 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, - 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, - 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x1a, 0x41, 0x0a, 0x04, 0x4f, 0x75, 0x74, 0x73, 0x12, - 0x39, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, - 0x72, 0x74, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x32, 0x7e, 0x0a, 0x0d, 0x50, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x0b, 0x41, - 0x6c, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, - 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76, - 0x31, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x42, 0x94, 0x02, 0x0a, 0x1f, 0x63, - 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, - 0x63, 0x79, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0b, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x55, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x75, 0x78, 0x6e, 0x69, - 0x6e, 0x6a, 0x61, 0x2f, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x69, - 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x61, 0x70, - 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2f, 0x6c, 0x61, - 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, - 0x67, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x50, 0x4c, 0xaa, 0x02, 0x1b, 0x41, 0x70, 0x65, - 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4c, 0x61, 0x6e, - 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x1b, 0x41, 0x70, 0x65, 0x72, 0x74, - 0x75, 0x72, 0x65, 0x5c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x4c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x27, 0x41, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, - 0x65, 0x5c, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, - 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0xea, 0x02, 0x1e, 0x41, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x3a, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x3a, 0x3a, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x3a, 0x56, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6c, 0x6c, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x14, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0e, 0x12, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x69, 0x65, 0x73, 0x42, 0x94, 0x02, 0x0a, 0x1f, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, + 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x6c, 0x61, + 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x0b, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x55, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x66, 0x6c, 0x75, 0x78, 0x6e, 0x69, 0x6e, 0x6a, 0x61, 0x2f, 0x61, + 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x61, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, + 0x65, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, + 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x76, 0x31, 0xa2, + 0x02, 0x03, 0x41, 0x50, 0x4c, 0xaa, 0x02, 0x1b, 0x41, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, + 0x2e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, + 0x2e, 0x56, 0x31, 0xca, 0x02, 0x1b, 0x41, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x5c, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x5c, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5c, 0x56, + 0x31, 0xe2, 0x02, 0x27, 0x41, 0x70, 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x5c, 0x50, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x5c, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5c, 0x56, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1e, 0x41, 0x70, + 0x65, 0x72, 0x74, 0x75, 0x72, 0x65, 0x3a, 0x3a, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x3a, 0x3a, + 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3968,42 +3987,42 @@ var file_aperture_policy_language_v1_policy_proto_depIdxs = []int32{ 50, // 40: aperture.policy.language.v1.Scheduler.selector:type_name -> aperture.common.selector.v1.Selector 35, // 41: aperture.policy.language.v1.Scheduler.workloads:type_name -> aperture.policy.language.v1.Scheduler.WorkloadAndLabelMatcher 34, // 42: aperture.policy.language.v1.Scheduler.default_workload:type_name -> aperture.policy.language.v1.Scheduler.Workload - 37, // 43: aperture.policy.language.v1.LoadShedActuator.in_ports:type_name -> aperture.policy.language.v1.LoadShedActuator.Ins - 38, // 44: aperture.policy.language.v1.PromQL.out_ports:type_name -> aperture.policy.language.v1.PromQL.Outs - 48, // 45: aperture.policy.language.v1.PromQL.evaluation_interval:type_name -> google.protobuf.Duration - 39, // 46: aperture.policy.language.v1.Constant.out_ports:type_name -> aperture.policy.language.v1.Constant.Outs - 40, // 47: aperture.policy.language.v1.Sqrt.in_ports:type_name -> aperture.policy.language.v1.Sqrt.Ins - 41, // 48: aperture.policy.language.v1.Sqrt.out_ports:type_name -> aperture.policy.language.v1.Sqrt.Outs - 42, // 49: aperture.policy.language.v1.Extrapolator.in_ports:type_name -> aperture.policy.language.v1.Extrapolator.Ins - 43, // 50: aperture.policy.language.v1.Extrapolator.out_ports:type_name -> aperture.policy.language.v1.Extrapolator.Outs - 48, // 51: aperture.policy.language.v1.Extrapolator.max_extrapolation_interval:type_name -> google.protobuf.Duration - 44, // 52: aperture.policy.language.v1.Max.in_ports:type_name -> aperture.policy.language.v1.Max.Ins - 45, // 53: aperture.policy.language.v1.Max.out_ports:type_name -> aperture.policy.language.v1.Max.Outs - 46, // 54: aperture.policy.language.v1.Min.in_ports:type_name -> aperture.policy.language.v1.Min.Ins - 47, // 55: aperture.policy.language.v1.Min.out_ports:type_name -> aperture.policy.language.v1.Min.Outs - 2, // 56: aperture.policy.language.v1.AllPolicies.AllPoliciesEntry.value:type_name -> aperture.policy.language.v1.Policy - 51, // 57: aperture.policy.language.v1.Resources.FluxMetersEntry.value:type_name -> aperture.policy.language.v1.FluxMeter - 6, // 58: aperture.policy.language.v1.GradientController.Ins.signal:type_name -> aperture.policy.language.v1.Port - 6, // 59: aperture.policy.language.v1.GradientController.Ins.setpoint:type_name -> aperture.policy.language.v1.Port - 6, // 60: aperture.policy.language.v1.GradientController.Ins.optimize:type_name -> aperture.policy.language.v1.Port - 6, // 61: aperture.policy.language.v1.GradientController.Ins.max:type_name -> aperture.policy.language.v1.Port - 6, // 62: aperture.policy.language.v1.GradientController.Ins.min:type_name -> aperture.policy.language.v1.Port - 6, // 63: aperture.policy.language.v1.GradientController.Ins.control_variable:type_name -> aperture.policy.language.v1.Port - 6, // 64: aperture.policy.language.v1.GradientController.Outs.output:type_name -> aperture.policy.language.v1.Port - 6, // 65: aperture.policy.language.v1.EMA.Ins.input:type_name -> aperture.policy.language.v1.Port - 6, // 66: aperture.policy.language.v1.EMA.Ins.max_envelope:type_name -> aperture.policy.language.v1.Port - 6, // 67: aperture.policy.language.v1.EMA.Ins.min_envelope:type_name -> aperture.policy.language.v1.Port - 6, // 68: aperture.policy.language.v1.EMA.Outs.output:type_name -> aperture.policy.language.v1.Port - 6, // 69: aperture.policy.language.v1.ArithmeticCombinator.Ins.lhs:type_name -> aperture.policy.language.v1.Port - 6, // 70: aperture.policy.language.v1.ArithmeticCombinator.Ins.rhs:type_name -> aperture.policy.language.v1.Port - 6, // 71: aperture.policy.language.v1.ArithmeticCombinator.Outs.output:type_name -> aperture.policy.language.v1.Port - 6, // 72: aperture.policy.language.v1.Decider.Ins.lhs:type_name -> aperture.policy.language.v1.Port - 6, // 73: aperture.policy.language.v1.Decider.Ins.rhs:type_name -> aperture.policy.language.v1.Port - 6, // 74: aperture.policy.language.v1.Decider.Ins.on_true:type_name -> aperture.policy.language.v1.Port - 6, // 75: aperture.policy.language.v1.Decider.Ins.on_false:type_name -> aperture.policy.language.v1.Port - 6, // 76: aperture.policy.language.v1.Decider.Outs.output:type_name -> aperture.policy.language.v1.Port - 6, // 77: aperture.policy.language.v1.RateLimiter.Ins.limit:type_name -> aperture.policy.language.v1.Port - 48, // 78: aperture.policy.language.v1.Scheduler.Workload.timeout:type_name -> google.protobuf.Duration + 48, // 43: aperture.policy.language.v1.Scheduler.max_timeout:type_name -> google.protobuf.Duration + 37, // 44: aperture.policy.language.v1.LoadShedActuator.in_ports:type_name -> aperture.policy.language.v1.LoadShedActuator.Ins + 38, // 45: aperture.policy.language.v1.PromQL.out_ports:type_name -> aperture.policy.language.v1.PromQL.Outs + 48, // 46: aperture.policy.language.v1.PromQL.evaluation_interval:type_name -> google.protobuf.Duration + 39, // 47: aperture.policy.language.v1.Constant.out_ports:type_name -> aperture.policy.language.v1.Constant.Outs + 40, // 48: aperture.policy.language.v1.Sqrt.in_ports:type_name -> aperture.policy.language.v1.Sqrt.Ins + 41, // 49: aperture.policy.language.v1.Sqrt.out_ports:type_name -> aperture.policy.language.v1.Sqrt.Outs + 42, // 50: aperture.policy.language.v1.Extrapolator.in_ports:type_name -> aperture.policy.language.v1.Extrapolator.Ins + 43, // 51: aperture.policy.language.v1.Extrapolator.out_ports:type_name -> aperture.policy.language.v1.Extrapolator.Outs + 48, // 52: aperture.policy.language.v1.Extrapolator.max_extrapolation_interval:type_name -> google.protobuf.Duration + 44, // 53: aperture.policy.language.v1.Max.in_ports:type_name -> aperture.policy.language.v1.Max.Ins + 45, // 54: aperture.policy.language.v1.Max.out_ports:type_name -> aperture.policy.language.v1.Max.Outs + 46, // 55: aperture.policy.language.v1.Min.in_ports:type_name -> aperture.policy.language.v1.Min.Ins + 47, // 56: aperture.policy.language.v1.Min.out_ports:type_name -> aperture.policy.language.v1.Min.Outs + 2, // 57: aperture.policy.language.v1.AllPolicies.AllPoliciesEntry.value:type_name -> aperture.policy.language.v1.Policy + 51, // 58: aperture.policy.language.v1.Resources.FluxMetersEntry.value:type_name -> aperture.policy.language.v1.FluxMeter + 6, // 59: aperture.policy.language.v1.GradientController.Ins.signal:type_name -> aperture.policy.language.v1.Port + 6, // 60: aperture.policy.language.v1.GradientController.Ins.setpoint:type_name -> aperture.policy.language.v1.Port + 6, // 61: aperture.policy.language.v1.GradientController.Ins.optimize:type_name -> aperture.policy.language.v1.Port + 6, // 62: aperture.policy.language.v1.GradientController.Ins.max:type_name -> aperture.policy.language.v1.Port + 6, // 63: aperture.policy.language.v1.GradientController.Ins.min:type_name -> aperture.policy.language.v1.Port + 6, // 64: aperture.policy.language.v1.GradientController.Ins.control_variable:type_name -> aperture.policy.language.v1.Port + 6, // 65: aperture.policy.language.v1.GradientController.Outs.output:type_name -> aperture.policy.language.v1.Port + 6, // 66: aperture.policy.language.v1.EMA.Ins.input:type_name -> aperture.policy.language.v1.Port + 6, // 67: aperture.policy.language.v1.EMA.Ins.max_envelope:type_name -> aperture.policy.language.v1.Port + 6, // 68: aperture.policy.language.v1.EMA.Ins.min_envelope:type_name -> aperture.policy.language.v1.Port + 6, // 69: aperture.policy.language.v1.EMA.Outs.output:type_name -> aperture.policy.language.v1.Port + 6, // 70: aperture.policy.language.v1.ArithmeticCombinator.Ins.lhs:type_name -> aperture.policy.language.v1.Port + 6, // 71: aperture.policy.language.v1.ArithmeticCombinator.Ins.rhs:type_name -> aperture.policy.language.v1.Port + 6, // 72: aperture.policy.language.v1.ArithmeticCombinator.Outs.output:type_name -> aperture.policy.language.v1.Port + 6, // 73: aperture.policy.language.v1.Decider.Ins.lhs:type_name -> aperture.policy.language.v1.Port + 6, // 74: aperture.policy.language.v1.Decider.Ins.rhs:type_name -> aperture.policy.language.v1.Port + 6, // 75: aperture.policy.language.v1.Decider.Ins.on_true:type_name -> aperture.policy.language.v1.Port + 6, // 76: aperture.policy.language.v1.Decider.Ins.on_false:type_name -> aperture.policy.language.v1.Port + 6, // 77: aperture.policy.language.v1.Decider.Outs.output:type_name -> aperture.policy.language.v1.Port + 6, // 78: aperture.policy.language.v1.RateLimiter.Ins.limit:type_name -> aperture.policy.language.v1.Port 34, // 79: aperture.policy.language.v1.Scheduler.WorkloadAndLabelMatcher.workload:type_name -> aperture.policy.language.v1.Scheduler.Workload 52, // 80: aperture.policy.language.v1.Scheduler.WorkloadAndLabelMatcher.label_matcher:type_name -> aperture.common.labelmatcher.v1.LabelMatcher 6, // 81: aperture.policy.language.v1.Scheduler.Outs.accepted_concurrency:type_name -> aperture.policy.language.v1.Port diff --git a/docs/gen/policies/gen.yaml b/docs/gen/policies/gen.yaml index 983e57bb94..10ae7563fe 100644 --- a/docs/gen/policies/gen.yaml +++ b/docs/gen/policies/gen.yaml @@ -108,30 +108,6 @@ definitions: format: int64 x-go-validate: gte=0,lte=255 x-order: 1 - timeout: - description: |- - This value impacts the fairness because the larger the timeout the higher the chance a request has to get scheduled. - - :::caution - This timeout needs to be strictly less than the timeout set on the - client for the whole GRPC call: - * in case of envoy, timeout set on `grpc_service` used in `ext_authz` filter, - * in case of libraries, timeout configured... TODO. - - We're using fail-open logic in integrations, so if the GRPC timeout - fires first, the flow will end up being unconditionally allowed while - it're still waiting on the scheduler. - - To avoid such cases, the end-to-end GRPC timeout should also contain - some headroom for constant overhead like serialization, etc. Default - value for GRPC timeouts is 10ms, giving 5ms of headeroom, so when - tweaking this timeout, make sure to adjust the GRPC timeout accordingly. - ::: - type: string - title: Timeout override decides how long a request in the workload can wait - for tokens - x-go-default: 0.005s - x-order: 2 tokens: description: |- Tokens determines the cost of admitting a single request the workload, which is typically defined as milliseconds of response latency. @@ -139,7 +115,7 @@ definitions: type: string format: uint64 x-go-default: 1 - x-order: 3 + x-order: 2 SchedulerWorkloadAndLabelMatcher: type: object properties: @@ -1380,15 +1356,49 @@ definitions: match. x-order: 1 $ref: '#/definitions/SchedulerWorkload' + max_timeout: + description: |- + :::caution + This timeout needs to be strictly less than the timeout set on the + client for the whole GRPC call: + * in case of envoy, timeout set on `grpc_service` used in `ext_authz` filter, + * in case of libraries, timeout configured... TODO. + + We're using fail-open logic in integrations, so if the GRPC timeout + fires first, the flow will end up being unconditionally allowed while + it're still waiting on the scheduler. + + To avoid such cases, the end-to-end GRPC timeout should also contain + some headroom for constant overhead like serialization, etc. Default + value for GRPC timeouts is 500ms, giving 50ms of headeroom, so when + tweaking this timeout, make sure to adjust the GRPC timeout accordingly. + ::: + type: string + title: Max Timeout is the value with which the flow timeout calculated by + `timeout_factor` is capped + x-go-default: 0.45s + x-order: 2 out_ports: description: Output ports for the Scheduler component. - x-order: 2 + x-order: 3 $ref: '#/definitions/v1SchedulerOuts' selector: description: Selector decides for which service or flows the scheduler will be applied. - x-order: 3 + x-order: 4 $ref: '#/definitions/v1Selector' + timeout_factor: + description: |- + If a flow is not able to get tokens within `timeout_factor` * `tokens` of duration, + it will be rejected. + + This value impacts the prioritization and fairness because the larger the timeout the higher the chance a request has to get scheduled. + type: number + format: double + title: Timeout as a factor of tokens for a flow in a workload + x-go-default: 0.5 + x-go-validate: gte=0.0 + x-order: 5 workloads: description: |- List of workloads to be used in scheduler. @@ -1414,7 +1424,7 @@ definitions: type: array items: $ref: '#/definitions/SchedulerWorkloadAndLabelMatcher' - x-order: 4 + x-order: 6 v1SchedulerOuts: description: Output for the Scheduler component. type: object diff --git a/docs/gen/policies/policy.md b/docs/gen/policies/policy.md index 93a0db5dd8..efbcca1739 100644 --- a/docs/gen/policies/policy.md +++ b/docs/gen/policies/policy.md @@ -212,33 +212,6 @@ you have a classifier that sets `user` flow label, you might want to set Priority level ranges from 0 to 255. Higher numbers means higher priority level. - - -
-
timeout
-
- -(string, default: `0.005s`) Timeout override decides how long a request in the workload can wait for tokens - -This value impacts the fairness because the larger the timeout the higher the chance a request has to get scheduled. - -:::caution -This timeout needs to be strictly less than the timeout set on the -client for the whole GRPC call: - -- in case of envoy, timeout set on `grpc_service` used in `ext_authz` filter, -- in case of libraries, timeout configured... TODO. - -We're using fail-open logic in integrations, so if the GRPC timeout -fires first, the flow will end up being unconditionally allowed while -it're still waiting on the scheduler. - -To avoid such cases, the end-to-end GRPC timeout should also contain -some headroom for constant overhead like serialization, etc. Default -value for GRPC timeouts is 10ms, giving 5ms of headeroom, so when -tweaking this timeout, make sure to adjust the GRPC timeout accordingly. -::: -
@@ -2044,6 +2017,31 @@ of this average can change). ([SchedulerWorkload](#scheduler-workload)) Workload to be used if none of workloads specified in `workloads` match. + +
+
+
max_timeout
+
+ +(string, default: `0.45s`) Max Timeout is the value with which the flow timeout calculated by `timeout_factor` is capped + +:::caution +This timeout needs to be strictly less than the timeout set on the +client for the whole GRPC call: + +- in case of envoy, timeout set on `grpc_service` used in `ext_authz` filter, +- in case of libraries, timeout configured... TODO. + +We're using fail-open logic in integrations, so if the GRPC timeout +fires first, the flow will end up being unconditionally allowed while +it're still waiting on the scheduler. + +To avoid such cases, the end-to-end GRPC timeout should also contain +some headroom for constant overhead like serialization, etc. Default +value for GRPC timeouts is 500ms, giving 50ms of headeroom, so when +tweaking this timeout, make sure to adjust the GRPC timeout accordingly. +::: +
@@ -2060,6 +2058,19 @@ of this average can change). ([V1Selector](#v1-selector)) Selector decides for which service or flows the scheduler will be applied. + +
+
+
timeout_factor
+
+ +(float64, `gte=0.0`, default: `0.5`) Timeout as a factor of tokens for a flow in a workload + +If a flow is not able to get tokens within `timeout_factor` \* `tokens` of duration, +it will be rejected. + +This value impacts the prioritization and fairness because the larger the timeout the higher the chance a request has to get scheduled. +
diff --git a/libsonnet/1.0/_gen/v1/scheduler.libsonnet b/libsonnet/1.0/_gen/v1/scheduler.libsonnet index f4101b20a3..14887d04bc 100644 --- a/libsonnet/1.0/_gen/v1/scheduler.libsonnet +++ b/libsonnet/1.0/_gen/v1/scheduler.libsonnet @@ -19,6 +19,12 @@ local schedulerouts = import './schedulerouts.libsonnet'; withDefaultWorkloadMixin(default_workload):: { default_workload+: default_workload, }, + withMaxTimeout(max_timeout):: { + max_timeout: max_timeout, + }, + withMaxTimeoutMixin(max_timeout):: { + max_timeout+: max_timeout, + }, withOutPorts(out_ports):: { out_ports: out_ports, }, @@ -31,6 +37,12 @@ local schedulerouts = import './schedulerouts.libsonnet'; withSelectorMixin(selector):: { selector+: selector, }, + withTimeoutFactor(timeout_factor):: { + timeout_factor: timeout_factor, + }, + withTimeoutFactorMixin(timeout_factor):: { + timeout_factor+: timeout_factor, + }, withWorkloads(workloads):: { workloads: if std.isArray(workloads) diff --git a/libsonnet/1.0/_gen/v1/schedulerworkload.libsonnet b/libsonnet/1.0/_gen/v1/schedulerworkload.libsonnet index b54473be11..bda7bc52c3 100644 --- a/libsonnet/1.0/_gen/v1/schedulerworkload.libsonnet +++ b/libsonnet/1.0/_gen/v1/schedulerworkload.libsonnet @@ -13,12 +13,6 @@ withPriorityMixin(priority):: { priority+: priority, }, - withTimeout(timeout):: { - timeout: timeout, - }, - withTimeoutMixin(timeout):: { - timeout+: timeout, - }, withTokens(tokens):: { tokens: tokens, }, diff --git a/manifests/k8s/tanka/environments/tilt/apps/demoapp/mixins.libsonnet b/manifests/k8s/tanka/environments/tilt/apps/demoapp/mixins.libsonnet index 1bf3743c58..5609ff68b5 100644 --- a/manifests/k8s/tanka/environments/tilt/apps/demoapp/mixins.libsonnet +++ b/manifests/k8s/tanka/environments/tilt/apps/demoapp/mixins.libsonnet @@ -40,15 +40,14 @@ local policy = latencyGradientPolicy({ concurrencyLimiter+: { defaultWorkload: { priority: 20, - timeout: '0.025s', }, workloads: [ WorkloadWithLabelMatcher.new( - workload=Workload.withPriority(50) + Workload.withTimeout('0.025s'), + workload=Workload.withPriority(50), label_matcher=LabelMatcher.withMatchLabels({ 'request_header_user-type': 'guest' }) ), WorkloadWithLabelMatcher.new( - workload=Workload.withPriority(200) + Workload.withTimeout('0.025s'), + workload=Workload.withPriority(200), label_matcher=LabelMatcher.withMatchLabels({ 'request_header_user-type': 'subscriber' }) ), ], diff --git a/pkg/policies/controlplane/validator_test.go b/pkg/policies/controlplane/validator_test.go index 8c60f4a0d8..edc9fd306f 100644 --- a/pkg/policies/controlplane/validator_test.go +++ b/pkg/policies/controlplane/validator_test.go @@ -173,17 +173,14 @@ data: auto_tokens: true default_workload: priority: 20 - timeout: "0.005s" workloads: - workload: priority: 50 - timeout: "0.005s" label_matcher: match_labels: user-type: "guest" - workload: priority: 200 - timeout: "0.005s" label_matcher: match_labels: request_header_user-type: "subscriber" diff --git a/pkg/policies/dataplane/actuators/concurrency/concurrency-limiter.go b/pkg/policies/dataplane/actuators/concurrency/concurrency-limiter.go index 66fceea434..18b9664dc2 100644 --- a/pkg/policies/dataplane/actuators/concurrency/concurrency-limiter.go +++ b/pkg/policies/dataplane/actuators/concurrency/concurrency-limiter.go @@ -365,9 +365,7 @@ func (conLimiter *concurrencyLimiter) setup(lifecycle fx.Lifecycle) error { } // setup scheduler - // TODO: get timeout from policy config - timeout, _ := time.ParseDuration("5ms") - conLimiter.scheduler = scheduler.NewWFQScheduler(timeout, loadShedActuator.tokenBucketLoadShed, clock, wfqMetrics) + conLimiter.scheduler = scheduler.NewWFQScheduler(conLimiter.schedulerProto.MaxTimeout.AsDuration(), loadShedActuator.tokenBucketLoadShed, clock, wfqMetrics) incomingConcurrencyCounter, err := incomingConcurrencyCounterVec.GetMetricWith(metricLabels) if err != nil { @@ -469,10 +467,17 @@ func (conLimiter *concurrencyLimiter) RunLimiter(labels selectors.Labels) *flowc tokens = matchedWorkloadProto.Tokens } + // timeout is tokens(which is in milliseconds) * conLimiter.schedulerProto.TimeoutFactor(float64) + timeout := time.Duration(float64(tokens)*conLimiter.schedulerProto.TimeoutFactor) * time.Millisecond + + if timeout > conLimiter.schedulerProto.MaxTimeout.AsDuration() { + timeout = conLimiter.schedulerProto.MaxTimeout.AsDuration() + } + reqContext := scheduler.RequestContext{ FairnessLabel: fairnessLabel, Priority: uint8(matchedWorkloadProto.Priority), - Timeout: matchedWorkloadProto.Timeout.AsDuration(), + Timeout: timeout, Tokens: tokens, } diff --git a/tools/load_generator/scenarios/load_test.js b/tools/load_generator/scenarios/load_test.js index e01d2060f6..5bdaa71ae7 100644 --- a/tools/load_generator/scenarios/load_test.js +++ b/tools/load_generator/scenarios/load_test.js @@ -2,12 +2,12 @@ import http from "k6/http"; import { check } from "k6"; export let vuStages = [ - { duration: "1s", target: 5 }, // simulate ramp-up of traffic from 0 to 5 users over 30 seconds - { duration: "2m", target: 5 }, // stay at 5 users for 30s minutes - { duration: "1m", target: 15 }, // ramp-up to 10 users over 1 minutes - { duration: "2m", target: 15 }, // stay at 10 users for 2 minutes (peak hour) - { duration: "1s", target: 5 }, // ramp-down to 5 users in 10 seconds - { duration: "5m", target: 5 }, // stay at to 5 users in 30 seconds + { duration: "1s", target: 5 }, + { duration: "2m", target: 5 }, + { duration: "1m", target: 30 }, + { duration: "2m", target: 30 }, + { duration: "1s", target: 5 }, + { duration: "5m", target: 5 }, ]; export let options = {