From fd91d73edf98c65f8f360b52358f28472f1fb151 Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Ruiz Date: Thu, 7 May 2026 11:25:45 +0200 Subject: [PATCH 1/6] fix: set build_transport in gen.rs The tonic-prost-build configure call was missing an explicit build_transport(true). While this is the default value, being explicit keeps the builder chain consistent with build_client and build_server, and prevents surprises if the default changes. Signed-off-by: Alejandro Martinez Ruiz --- examples/gen.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/gen.rs b/examples/gen.rs index 7d6cfac14..486481ec0 100644 --- a/examples/gen.rs +++ b/examples/gen.rs @@ -20,6 +20,7 @@ fn main() -> Result<(), Box> { if let Err(e) = tonic_prost_build::configure() .build_client(true) .build_server(true) + .build_transport(true) .out_dir(out_dir) .compile_protos(&proto_files, &[proto_dir]) { From 7b810ec56524a43003cec3d9af42775749b28b09 Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Ruiz Date: Thu, 7 May 2026 11:32:38 +0200 Subject: [PATCH 2/6] feat(outbound): restructure FailureAccrual for multiple accrual policies Replace the single-field oneof wrapper with direct optional fields, allowing consecutive-failure and success-rate policies to coexist. The consecutive_failures field retains field number 1, so the wire encoding is identical to the old oneof layout and existing proxies continue to work without changes. Add a SuccessRate nested message at field 2 with threshold, decay, and min_requests parameters. When absent, success-rate accrual is disabled. Signed-off-by: Alejandro Martinez Ruiz --- proto/outbound.proto | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/proto/outbound.proto b/proto/outbound.proto index a0c1bd20a..52f4d4023 100644 --- a/proto/outbound.proto +++ b/proto/outbound.proto @@ -442,15 +442,37 @@ message Queue { google.protobuf.Duration failfast_timeout = 2; } +// Configures failure accrual policies for circuit breaking. +// Setting a numeric policy field to zero disables that policy. message FailureAccrual { message ConsecutiveFailures { + // Maximum consecutive failures before the circuit trips. + // Set to 0 to disable (an unset field has the same effect). uint32 max_failures = 1; + // Must be set. Controls the ejection duration before probe requests + // are allowed after any policy (not just CF) trips the circuit. ExponentialBackoff backoff = 2; } - oneof kind { - ConsecutiveFailures consecutive_failures = 1; + message SuccessRate { + // Success rate threshold in [0.0, 1.0]. The circuit trips when the + // EWMA success rate drops below this value. Set to 0.0 to disable. + // Defined as `double` (not `float`) because this value is compared + // against the proxy's f64 EWMA on every request. + double threshold = 1; + // EWMA decay window for success rate tracking. + google.protobuf.Duration decay = 2; + // Minimum requests before the success rate policy can trip (cold-start guard). + uint32 min_requests = 3; } + + // Must be set. Set `max_failures` to 0 to disable the consecutive + // failure policy while retaining the shared backoff. + ConsecutiveFailures consecutive_failures = 1; + + // Success rate policy. If set, the circuit trips when the EWMA success + // rate drops below the threshold. + SuccessRate success_rate = 2; } message ExponentialBackoff { From 3bc08f034f754ab08c9cd9d46a2afe42cb5dc52b Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Ruiz Date: Thu, 7 May 2026 11:39:58 +0200 Subject: [PATCH 3/6] feat(outbound): add LoadBiasConfig and load_bias fields Introduce a LoadBiasConfig message for 429-aware load balancing. When set on Http1, Http2, or Grpc protocol variants, the proxy injects artificial latency penalties on rate-limited endpoints so the P2C balancer prefers healthier alternatives. Signed-off-by: Alejandro Martinez Ruiz --- proto/outbound.proto | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/proto/outbound.proto b/proto/outbound.proto index 52f4d4023..64a00d883 100644 --- a/proto/outbound.proto +++ b/proto/outbound.proto @@ -86,6 +86,9 @@ message ProxyProtocol { // If empty, circuit breaking is not performed. FailureAccrual failure_accrual = 2; + + // If set, configures load biasing for 429-aware load balancing. + LoadBiasConfig load_bias = 3; } message Http2 { @@ -93,6 +96,9 @@ message ProxyProtocol { // If empty, circuit breaking is not performed. FailureAccrual failure_accrual = 2; + + // If set, configures load biasing for 429-aware load balancing. + LoadBiasConfig load_bias = 3; } message Grpc { @@ -100,6 +106,9 @@ message ProxyProtocol { // If empty, circuit breaking is not performed. FailureAccrual failure_accrual = 2; + + // If set, configures load biasing for 429-aware load balancing. + LoadBiasConfig load_bias = 3; } message Tls { @@ -475,6 +484,19 @@ message FailureAccrual { SuccessRate success_rate = 2; } +// Configures load biasing for 429-aware load balancing. +// When enabled, the load balancer injects artificial penalties on +// rate-limited endpoints, causing P2C to prefer other endpoints. +message LoadBiasConfig { + // Whether load biasing is enabled. When the message is present + // but `enabled` is false, biasing is inactive. + bool enabled = 1; + // The penalty duration to inject when a 429 response is received. + google.protobuf.Duration penalty = 2; + // The EWMA decay window for the penalty. + google.protobuf.Duration penalty_decay = 3; +} + message ExponentialBackoff { // The minimum amount of time to wait before resuming an operation. google.protobuf.Duration min_backoff = 1; From 250e9866dd09aee260418fcf59f55a98eb2438e7 Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Ruiz Date: Thu, 7 May 2026 11:46:18 +0200 Subject: [PATCH 4/6] feat(outbound): add RetryAfterConfig and retry_after fields Introduce a RetryAfterConfig message for Retry-After header handling. When set on Http1, Http2, or Grpc protocol variants, the proxy honors Retry-After headers from 429 responses and clamps durations to the configured maximum. Added as field 4 on each HTTP protocol variant. The single max_duration field caps the Retry-After value the proxy will honor, falling back to a built-in default when absent. Signed-off-by: Alejandro Martinez Ruiz --- proto/outbound.proto | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/proto/outbound.proto b/proto/outbound.proto index 64a00d883..816303731 100644 --- a/proto/outbound.proto +++ b/proto/outbound.proto @@ -89,6 +89,9 @@ message ProxyProtocol { // If set, configures load biasing for 429-aware load balancing. LoadBiasConfig load_bias = 3; + + // If set, configures handling of Retry-After headers (HTTP 429/503). + RetryAfterConfig retry_after = 4; } message Http2 { @@ -99,6 +102,9 @@ message ProxyProtocol { // If set, configures load biasing for 429-aware load balancing. LoadBiasConfig load_bias = 3; + + // If set, configures handling of Retry-After headers (HTTP 429/503). + RetryAfterConfig retry_after = 4; } message Grpc { @@ -109,6 +115,10 @@ message ProxyProtocol { // If set, configures load biasing for 429-aware load balancing. LoadBiasConfig load_bias = 3; + + // If set, configures handling of Retry-After headers (HTTP 429/503) + // and grpc-retry-pushback-ms trailers (gRPC RESOURCE_EXHAUSTED). + RetryAfterConfig retry_after = 4; } message Tls { @@ -497,6 +507,17 @@ message LoadBiasConfig { google.protobuf.Duration penalty_decay = 3; } +// Configures handling of rate-limiting hints: Retry-After headers +// (HTTP 429/503) and grpc-retry-pushback-ms trailers (gRPC +// RESOURCE_EXHAUSTED). The proxy uses the parsed duration to extend +// circuit breaker backoff and amplify load biaser penalties. +message RetryAfterConfig { + // Maximum duration the proxy will honor from either hint source. + // Values exceeding this cap are clamped. When absent, the proxy + // uses DEFAULT_RETRY_AFTER_MAX_DURATION as the cap. + google.protobuf.Duration max_duration = 1; +} + message ExponentialBackoff { // The minimum amount of time to wait before resuming an operation. google.protobuf.Duration min_backoff = 1; From 27a5052fc63b778c691692f4031a6819b76be0b7 Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Ruiz Date: Wed, 20 May 2026 16:59:48 +0200 Subject: [PATCH 5/6] feat(outbound): add EjectionConfig to BalanceP2c Add pool-level ejection protection to the P2C load balancer configuration. When set this prevents circuit breakers from ejecting all endpoints in a load-balancing pool by enforcing a minimum number of ready endpoints. Signed-off-by: Alejandro Martinez Ruiz --- proto/outbound.proto | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/proto/outbound.proto b/proto/outbound.proto index 816303731..e21554047 100644 --- a/proto/outbound.proto +++ b/proto/outbound.proto @@ -439,6 +439,10 @@ message Backend { PeakEwma peak_ewma = 2; } + // Ejection protection for the pool. When set, prevents circuit + // breakers from ejecting endpoints below the configured floor. + EjectionConfig ejection = 3; + // Parameters configuring peak EWMA load estimation. message PeakEwma { // Initial latency value used when no latencies have been @@ -518,6 +522,16 @@ message RetryAfterConfig { google.protobuf.Duration max_duration = 1; } +// Pool-level ejection protection. Prevents circuit breakers from +// ejecting all endpoints in a load-balancing pool. +// +// Additional ejection parameters may follow in future fields. +message EjectionConfig { + // Minimum number of endpoints that must remain unejected. + // When set to 0 (or absent), ejection protection is disabled. + uint32 min_ready_endpoints = 1; +} + message ExponentialBackoff { // The minimum amount of time to wait before resuming an operation. google.protobuf.Duration min_backoff = 1; From 67cbb1430cc1791358efc9adf25db73f63b0c592 Mon Sep 17 00:00:00 2001 From: Alejandro Martinez Ruiz Date: Thu, 7 May 2026 11:34:49 +0200 Subject: [PATCH 6/6] build: regenerate Rust and Go bindings Full regeneration from updated outbound.proto after the FailureAccrual restructure, the additions of LoadBiasConfig, RetryAfterConfig and EjectionConfig messages, and load_bias, retry_after and ejection fields. Signed-off-by: Alejandro Martinez Ruiz --- go/destination/destination.pb.go | 4 +- go/destination/destination_grpc.pb.go | 10 +- go/grpc_route/grpc_route.pb.go | 4 +- go/http_route/http_route.pb.go | 4 +- go/http_types/http_types.pb.go | 4 +- go/identity/identity.pb.go | 4 +- go/identity/identity_grpc.pb.go | 8 +- go/inbound/inbound.pb.go | 4 +- go/inbound/inbound_grpc.pb.go | 10 +- go/meta/meta.pb.go | 4 +- go/net/net.pb.go | 4 +- go/opaque_route/opaque_route.pb.go | 4 +- go/outbound/outbound.pb.go | 1007 ++++++++++++++++--------- go/outbound/outbound_grpc.pb.go | 10 +- go/tap/tap.pb.go | 4 +- go/tap/tap_grpc.pb.go | 8 +- go/tls_route/tls_route.pb.go | 4 +- src/gen/io.linkerd.proxy.outbound.rs | 98 ++- 18 files changed, 805 insertions(+), 390 deletions(-) diff --git a/go/destination/destination.pb.go b/go/destination/destination.pb.go index 503d0a5cf..a770c2e21 100644 --- a/go/destination/destination.pb.go +++ b/go/destination/destination.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: destination.proto package destination diff --git a/go/destination/destination_grpc.pb.go b/go/destination/destination_grpc.pb.go index 27f574ea0..525fac183 100644 --- a/go/destination/destination_grpc.pb.go +++ b/go/destination/destination_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 -// - protoc v6.30.2 +// - protoc-gen-go-grpc v1.6.1 +// - protoc v4.25.9 // source: destination.proto package destination @@ -102,10 +102,10 @@ type DestinationServer interface { type UnimplementedDestinationServer struct{} func (UnimplementedDestinationServer) Get(*GetDestination, grpc.ServerStreamingServer[Update]) error { - return status.Errorf(codes.Unimplemented, "method Get not implemented") + return status.Error(codes.Unimplemented, "method Get not implemented") } func (UnimplementedDestinationServer) GetProfile(*GetDestination, grpc.ServerStreamingServer[DestinationProfile]) error { - return status.Errorf(codes.Unimplemented, "method GetProfile not implemented") + return status.Error(codes.Unimplemented, "method GetProfile not implemented") } func (UnimplementedDestinationServer) mustEmbedUnimplementedDestinationServer() {} func (UnimplementedDestinationServer) testEmbeddedByValue() {} @@ -118,7 +118,7 @@ type UnsafeDestinationServer interface { } func RegisterDestinationServer(s grpc.ServiceRegistrar, srv DestinationServer) { - // If the following call pancis, it indicates UnimplementedDestinationServer was + // If the following call panics, it indicates UnimplementedDestinationServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. diff --git a/go/grpc_route/grpc_route.pb.go b/go/grpc_route/grpc_route.pb.go index 8f8f9bc82..8476b8921 100644 --- a/go/grpc_route/grpc_route.pb.go +++ b/go/grpc_route/grpc_route.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: grpc_route.proto package grpc_route diff --git a/go/http_route/http_route.pb.go b/go/http_route/http_route.pb.go index e2d482a95..9f841a6c3 100644 --- a/go/http_route/http_route.pb.go +++ b/go/http_route/http_route.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: http_route.proto package http_route diff --git a/go/http_types/http_types.pb.go b/go/http_types/http_types.pb.go index 66dbcba5f..925e36f8a 100644 --- a/go/http_types/http_types.pb.go +++ b/go/http_types/http_types.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: http_types.proto package http_types diff --git a/go/identity/identity.pb.go b/go/identity/identity.pb.go index fc94afa78..687923b5f 100644 --- a/go/identity/identity.pb.go +++ b/go/identity/identity.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: identity.proto package identity diff --git a/go/identity/identity_grpc.pb.go b/go/identity/identity_grpc.pb.go index 49c14f3ae..259c80367 100644 --- a/go/identity/identity_grpc.pb.go +++ b/go/identity/identity_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 -// - protoc v6.30.2 +// - protoc-gen-go-grpc v1.6.1 +// - protoc v4.25.9 // source: identity.proto package identity @@ -77,7 +77,7 @@ type IdentityServer interface { type UnimplementedIdentityServer struct{} func (UnimplementedIdentityServer) Certify(context.Context, *CertifyRequest) (*CertifyResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Certify not implemented") + return nil, status.Error(codes.Unimplemented, "method Certify not implemented") } func (UnimplementedIdentityServer) mustEmbedUnimplementedIdentityServer() {} func (UnimplementedIdentityServer) testEmbeddedByValue() {} @@ -90,7 +90,7 @@ type UnsafeIdentityServer interface { } func RegisterIdentityServer(s grpc.ServiceRegistrar, srv IdentityServer) { - // If the following call pancis, it indicates UnimplementedIdentityServer was + // If the following call panics, it indicates UnimplementedIdentityServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. diff --git a/go/inbound/inbound.pb.go b/go/inbound/inbound.pb.go index 4ab6c163a..5df25b95b 100644 --- a/go/inbound/inbound.pb.go +++ b/go/inbound/inbound.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: inbound.proto package inbound diff --git a/go/inbound/inbound_grpc.pb.go b/go/inbound/inbound_grpc.pb.go index be32613ac..0d2c2988b 100644 --- a/go/inbound/inbound_grpc.pb.go +++ b/go/inbound/inbound_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 -// - protoc v6.30.2 +// - protoc-gen-go-grpc v1.6.1 +// - protoc v4.25.9 // source: inbound.proto package inbound @@ -105,10 +105,10 @@ type InboundServerPoliciesServer interface { type UnimplementedInboundServerPoliciesServer struct{} func (UnimplementedInboundServerPoliciesServer) GetPort(context.Context, *PortSpec) (*Server, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetPort not implemented") + return nil, status.Error(codes.Unimplemented, "method GetPort not implemented") } func (UnimplementedInboundServerPoliciesServer) WatchPort(*PortSpec, grpc.ServerStreamingServer[Server]) error { - return status.Errorf(codes.Unimplemented, "method WatchPort not implemented") + return status.Error(codes.Unimplemented, "method WatchPort not implemented") } func (UnimplementedInboundServerPoliciesServer) mustEmbedUnimplementedInboundServerPoliciesServer() {} func (UnimplementedInboundServerPoliciesServer) testEmbeddedByValue() {} @@ -121,7 +121,7 @@ type UnsafeInboundServerPoliciesServer interface { } func RegisterInboundServerPoliciesServer(s grpc.ServiceRegistrar, srv InboundServerPoliciesServer) { - // If the following call pancis, it indicates UnimplementedInboundServerPoliciesServer was + // If the following call panics, it indicates UnimplementedInboundServerPoliciesServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. diff --git a/go/meta/meta.pb.go b/go/meta/meta.pb.go index 807c12397..a5091fb12 100644 --- a/go/meta/meta.pb.go +++ b/go/meta/meta.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: meta.proto package meta diff --git a/go/net/net.pb.go b/go/net/net.pb.go index de89111ed..3391626c9 100644 --- a/go/net/net.pb.go +++ b/go/net/net.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: net.proto package net diff --git a/go/opaque_route/opaque_route.pb.go b/go/opaque_route/opaque_route.pb.go index eb592d03a..583a365d9 100644 --- a/go/opaque_route/opaque_route.pb.go +++ b/go/opaque_route/opaque_route.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: opaque_route.proto package opaque_route diff --git a/go/outbound/outbound.pb.go b/go/outbound/outbound.pb.go index dc04cf47e..5435251ea 100644 --- a/go/outbound/outbound.pb.go +++ b/go/outbound/outbound.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: outbound.proto package outbound @@ -730,12 +730,16 @@ func (x *Queue) GetFailfastTimeout() *duration.Duration { return nil } +// Configures failure accrual policies for circuit breaking. +// Setting a numeric policy field to zero disables that policy. type FailureAccrual struct { state protoimpl.MessageState `protogen:"open.v1"` - // Types that are valid to be assigned to Kind: - // - // *FailureAccrual_ConsecutiveFailures_ - Kind isFailureAccrual_Kind `protobuf_oneof:"kind"` + // Must be set. Set `max_failures` to 0 to disable the consecutive + // failure policy while retaining the shared backoff. + ConsecutiveFailures *FailureAccrual_ConsecutiveFailures `protobuf:"bytes,1,opt,name=consecutive_failures,json=consecutiveFailures,proto3" json:"consecutive_failures,omitempty"` + // Success rate policy. If set, the circuit trips when the EWMA success + // rate drops below the threshold. + SuccessRate *FailureAccrual_SuccessRate `protobuf:"bytes,2,opt,name=success_rate,json=successRate,proto3" json:"success_rate,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -770,31 +774,187 @@ func (*FailureAccrual) Descriptor() ([]byte, []int) { return file_outbound_proto_rawDescGZIP(), []int{9} } -func (x *FailureAccrual) GetKind() isFailureAccrual_Kind { +func (x *FailureAccrual) GetConsecutiveFailures() *FailureAccrual_ConsecutiveFailures { if x != nil { - return x.Kind + return x.ConsecutiveFailures } return nil } -func (x *FailureAccrual) GetConsecutiveFailures() *FailureAccrual_ConsecutiveFailures { +func (x *FailureAccrual) GetSuccessRate() *FailureAccrual_SuccessRate { + if x != nil { + return x.SuccessRate + } + return nil +} + +// Configures load biasing for 429-aware load balancing. +// When enabled, the load balancer injects artificial penalties on +// rate-limited endpoints, causing P2C to prefer other endpoints. +type LoadBiasConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Whether load biasing is enabled. When the message is present + // but `enabled` is false, biasing is inactive. + Enabled bool `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"` + // The penalty duration to inject when a 429 response is received. + Penalty *duration.Duration `protobuf:"bytes,2,opt,name=penalty,proto3" json:"penalty,omitempty"` + // The EWMA decay window for the penalty. + PenaltyDecay *duration.Duration `protobuf:"bytes,3,opt,name=penalty_decay,json=penaltyDecay,proto3" json:"penalty_decay,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LoadBiasConfig) Reset() { + *x = LoadBiasConfig{} + mi := &file_outbound_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LoadBiasConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoadBiasConfig) ProtoMessage() {} + +func (x *LoadBiasConfig) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoadBiasConfig.ProtoReflect.Descriptor instead. +func (*LoadBiasConfig) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{10} +} + +func (x *LoadBiasConfig) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *LoadBiasConfig) GetPenalty() *duration.Duration { + if x != nil { + return x.Penalty + } + return nil +} + +func (x *LoadBiasConfig) GetPenaltyDecay() *duration.Duration { + if x != nil { + return x.PenaltyDecay + } + return nil +} + +// Configures handling of rate-limiting hints: Retry-After headers +// (HTTP 429/503) and grpc-retry-pushback-ms trailers (gRPC +// RESOURCE_EXHAUSTED). The proxy uses the parsed duration to extend +// circuit breaker backoff and amplify load biaser penalties. +type RetryAfterConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Maximum duration the proxy will honor from either hint source. + // Values exceeding this cap are clamped. When absent, the proxy + // uses DEFAULT_RETRY_AFTER_MAX_DURATION as the cap. + MaxDuration *duration.Duration `protobuf:"bytes,1,opt,name=max_duration,json=maxDuration,proto3" json:"max_duration,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RetryAfterConfig) Reset() { + *x = RetryAfterConfig{} + mi := &file_outbound_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RetryAfterConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RetryAfterConfig) ProtoMessage() {} + +func (x *RetryAfterConfig) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[11] if x != nil { - if x, ok := x.Kind.(*FailureAccrual_ConsecutiveFailures_); ok { - return x.ConsecutiveFailures + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RetryAfterConfig.ProtoReflect.Descriptor instead. +func (*RetryAfterConfig) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{11} +} + +func (x *RetryAfterConfig) GetMaxDuration() *duration.Duration { + if x != nil { + return x.MaxDuration } return nil } -type isFailureAccrual_Kind interface { - isFailureAccrual_Kind() +// Pool-level ejection protection. Prevents circuit breakers from +// ejecting all endpoints in a load-balancing pool. +// +// Additional ejection parameters may follow in future fields. +type EjectionConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Minimum number of endpoints that must remain unejected. + // When set to 0 (or absent), ejection protection is disabled. + MinReadyEndpoints uint32 `protobuf:"varint,1,opt,name=min_ready_endpoints,json=minReadyEndpoints,proto3" json:"min_ready_endpoints,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EjectionConfig) Reset() { + *x = EjectionConfig{} + mi := &file_outbound_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -type FailureAccrual_ConsecutiveFailures_ struct { - ConsecutiveFailures *FailureAccrual_ConsecutiveFailures `protobuf:"bytes,1,opt,name=consecutive_failures,json=consecutiveFailures,proto3,oneof"` +func (x *EjectionConfig) String() string { + return protoimpl.X.MessageStringOf(x) } -func (*FailureAccrual_ConsecutiveFailures_) isFailureAccrual_Kind() {} +func (*EjectionConfig) ProtoMessage() {} + +func (x *EjectionConfig) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EjectionConfig.ProtoReflect.Descriptor instead. +func (*EjectionConfig) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{12} +} + +func (x *EjectionConfig) GetMinReadyEndpoints() uint32 { + if x != nil { + return x.MinReadyEndpoints + } + return 0 +} type ExponentialBackoff struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -812,7 +972,7 @@ type ExponentialBackoff struct { func (x *ExponentialBackoff) Reset() { *x = ExponentialBackoff{} - mi := &file_outbound_proto_msgTypes[10] + mi := &file_outbound_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -824,7 +984,7 @@ func (x *ExponentialBackoff) String() string { func (*ExponentialBackoff) ProtoMessage() {} func (x *ExponentialBackoff) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[10] + mi := &file_outbound_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -837,7 +997,7 @@ func (x *ExponentialBackoff) ProtoReflect() protoreflect.Message { // Deprecated: Use ExponentialBackoff.ProtoReflect.Descriptor instead. func (*ExponentialBackoff) Descriptor() ([]byte, []int) { - return file_outbound_proto_rawDescGZIP(), []int{10} + return file_outbound_proto_rawDescGZIP(), []int{13} } func (x *ExponentialBackoff) GetMinBackoff() *duration.Duration { @@ -876,7 +1036,7 @@ type ProxyProtocol_Detect struct { func (x *ProxyProtocol_Detect) Reset() { *x = ProxyProtocol_Detect{} - mi := &file_outbound_proto_msgTypes[11] + mi := &file_outbound_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -888,7 +1048,7 @@ func (x *ProxyProtocol_Detect) String() string { func (*ProxyProtocol_Detect) ProtoMessage() {} func (x *ProxyProtocol_Detect) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[11] + mi := &file_outbound_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -941,7 +1101,7 @@ type ProxyProtocol_Opaque struct { func (x *ProxyProtocol_Opaque) Reset() { *x = ProxyProtocol_Opaque{} - mi := &file_outbound_proto_msgTypes[12] + mi := &file_outbound_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -953,7 +1113,7 @@ func (x *ProxyProtocol_Opaque) String() string { func (*ProxyProtocol_Opaque) ProtoMessage() {} func (x *ProxyProtocol_Opaque) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[12] + mi := &file_outbound_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -981,13 +1141,17 @@ type ProxyProtocol_Http1 struct { Routes []*HttpRoute `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"` // If empty, circuit breaking is not performed. FailureAccrual *FailureAccrual `protobuf:"bytes,2,opt,name=failure_accrual,json=failureAccrual,proto3" json:"failure_accrual,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // If set, configures load biasing for 429-aware load balancing. + LoadBias *LoadBiasConfig `protobuf:"bytes,3,opt,name=load_bias,json=loadBias,proto3" json:"load_bias,omitempty"` + // If set, configures handling of Retry-After headers (HTTP 429/503). + RetryAfter *RetryAfterConfig `protobuf:"bytes,4,opt,name=retry_after,json=retryAfter,proto3" json:"retry_after,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ProxyProtocol_Http1) Reset() { *x = ProxyProtocol_Http1{} - mi := &file_outbound_proto_msgTypes[13] + mi := &file_outbound_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -999,7 +1163,7 @@ func (x *ProxyProtocol_Http1) String() string { func (*ProxyProtocol_Http1) ProtoMessage() {} func (x *ProxyProtocol_Http1) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[13] + mi := &file_outbound_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1029,18 +1193,36 @@ func (x *ProxyProtocol_Http1) GetFailureAccrual() *FailureAccrual { return nil } +func (x *ProxyProtocol_Http1) GetLoadBias() *LoadBiasConfig { + if x != nil { + return x.LoadBias + } + return nil +} + +func (x *ProxyProtocol_Http1) GetRetryAfter() *RetryAfterConfig { + if x != nil { + return x.RetryAfter + } + return nil +} + type ProxyProtocol_Http2 struct { state protoimpl.MessageState `protogen:"open.v1"` Routes []*HttpRoute `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"` // If empty, circuit breaking is not performed. FailureAccrual *FailureAccrual `protobuf:"bytes,2,opt,name=failure_accrual,json=failureAccrual,proto3" json:"failure_accrual,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // If set, configures load biasing for 429-aware load balancing. + LoadBias *LoadBiasConfig `protobuf:"bytes,3,opt,name=load_bias,json=loadBias,proto3" json:"load_bias,omitempty"` + // If set, configures handling of Retry-After headers (HTTP 429/503). + RetryAfter *RetryAfterConfig `protobuf:"bytes,4,opt,name=retry_after,json=retryAfter,proto3" json:"retry_after,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ProxyProtocol_Http2) Reset() { *x = ProxyProtocol_Http2{} - mi := &file_outbound_proto_msgTypes[14] + mi := &file_outbound_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1052,7 +1234,7 @@ func (x *ProxyProtocol_Http2) String() string { func (*ProxyProtocol_Http2) ProtoMessage() {} func (x *ProxyProtocol_Http2) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[14] + mi := &file_outbound_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1082,18 +1264,37 @@ func (x *ProxyProtocol_Http2) GetFailureAccrual() *FailureAccrual { return nil } +func (x *ProxyProtocol_Http2) GetLoadBias() *LoadBiasConfig { + if x != nil { + return x.LoadBias + } + return nil +} + +func (x *ProxyProtocol_Http2) GetRetryAfter() *RetryAfterConfig { + if x != nil { + return x.RetryAfter + } + return nil +} + type ProxyProtocol_Grpc struct { state protoimpl.MessageState `protogen:"open.v1"` Routes []*GrpcRoute `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"` // If empty, circuit breaking is not performed. FailureAccrual *FailureAccrual `protobuf:"bytes,2,opt,name=failure_accrual,json=failureAccrual,proto3" json:"failure_accrual,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // If set, configures load biasing for 429-aware load balancing. + LoadBias *LoadBiasConfig `protobuf:"bytes,3,opt,name=load_bias,json=loadBias,proto3" json:"load_bias,omitempty"` + // If set, configures handling of Retry-After headers (HTTP 429/503) + // and grpc-retry-pushback-ms trailers (gRPC RESOURCE_EXHAUSTED). + RetryAfter *RetryAfterConfig `protobuf:"bytes,4,opt,name=retry_after,json=retryAfter,proto3" json:"retry_after,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ProxyProtocol_Grpc) Reset() { *x = ProxyProtocol_Grpc{} - mi := &file_outbound_proto_msgTypes[15] + mi := &file_outbound_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1105,7 +1306,7 @@ func (x *ProxyProtocol_Grpc) String() string { func (*ProxyProtocol_Grpc) ProtoMessage() {} func (x *ProxyProtocol_Grpc) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[15] + mi := &file_outbound_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1135,6 +1336,20 @@ func (x *ProxyProtocol_Grpc) GetFailureAccrual() *FailureAccrual { return nil } +func (x *ProxyProtocol_Grpc) GetLoadBias() *LoadBiasConfig { + if x != nil { + return x.LoadBias + } + return nil +} + +func (x *ProxyProtocol_Grpc) GetRetryAfter() *RetryAfterConfig { + if x != nil { + return x.RetryAfter + } + return nil +} + type ProxyProtocol_Tls struct { state protoimpl.MessageState `protogen:"open.v1"` Routes []*TlsRoute `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"` @@ -1144,7 +1359,7 @@ type ProxyProtocol_Tls struct { func (x *ProxyProtocol_Tls) Reset() { *x = ProxyProtocol_Tls{} - mi := &file_outbound_proto_msgTypes[16] + mi := &file_outbound_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1156,7 +1371,7 @@ func (x *ProxyProtocol_Tls) String() string { func (*ProxyProtocol_Tls) ProtoMessage() {} func (x *ProxyProtocol_Tls) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[16] + mi := &file_outbound_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1200,7 +1415,7 @@ type HttpRoute_Rule struct { func (x *HttpRoute_Rule) Reset() { *x = HttpRoute_Rule{} - mi := &file_outbound_proto_msgTypes[17] + mi := &file_outbound_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1212,7 +1427,7 @@ func (x *HttpRoute_Rule) String() string { func (*HttpRoute_Rule) ProtoMessage() {} func (x *HttpRoute_Rule) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[17] + mi := &file_outbound_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1293,7 +1508,7 @@ type HttpRoute_Filter struct { func (x *HttpRoute_Filter) Reset() { *x = HttpRoute_Filter{} - mi := &file_outbound_proto_msgTypes[18] + mi := &file_outbound_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1305,7 +1520,7 @@ func (x *HttpRoute_Filter) String() string { func (*HttpRoute_Filter) ProtoMessage() {} func (x *HttpRoute_Filter) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[18] + mi := &file_outbound_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1406,7 +1621,7 @@ type HttpRoute_Distribution struct { func (x *HttpRoute_Distribution) Reset() { *x = HttpRoute_Distribution{} - mi := &file_outbound_proto_msgTypes[19] + mi := &file_outbound_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1418,7 +1633,7 @@ func (x *HttpRoute_Distribution) String() string { func (*HttpRoute_Distribution) ProtoMessage() {} func (x *HttpRoute_Distribution) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[19] + mi := &file_outbound_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1505,7 +1720,7 @@ type HttpRoute_Retry struct { func (x *HttpRoute_Retry) Reset() { *x = HttpRoute_Retry{} - mi := &file_outbound_proto_msgTypes[20] + mi := &file_outbound_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1517,7 +1732,7 @@ func (x *HttpRoute_Retry) String() string { func (*HttpRoute_Retry) ProtoMessage() {} func (x *HttpRoute_Retry) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[20] + mi := &file_outbound_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1582,7 +1797,7 @@ type HttpRoute_RouteBackend struct { func (x *HttpRoute_RouteBackend) Reset() { *x = HttpRoute_RouteBackend{} - mi := &file_outbound_proto_msgTypes[21] + mi := &file_outbound_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1594,7 +1809,7 @@ func (x *HttpRoute_RouteBackend) String() string { func (*HttpRoute_RouteBackend) ProtoMessage() {} func (x *HttpRoute_RouteBackend) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[21] + mi := &file_outbound_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1642,7 +1857,7 @@ type HttpRoute_WeightedRouteBackend struct { func (x *HttpRoute_WeightedRouteBackend) Reset() { *x = HttpRoute_WeightedRouteBackend{} - mi := &file_outbound_proto_msgTypes[22] + mi := &file_outbound_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1654,7 +1869,7 @@ func (x *HttpRoute_WeightedRouteBackend) String() string { func (*HttpRoute_WeightedRouteBackend) ProtoMessage() {} func (x *HttpRoute_WeightedRouteBackend) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[22] + mi := &file_outbound_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1692,7 +1907,7 @@ type HttpRoute_Distribution_Empty struct { func (x *HttpRoute_Distribution_Empty) Reset() { *x = HttpRoute_Distribution_Empty{} - mi := &file_outbound_proto_msgTypes[23] + mi := &file_outbound_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1704,7 +1919,7 @@ func (x *HttpRoute_Distribution_Empty) String() string { func (*HttpRoute_Distribution_Empty) ProtoMessage() {} func (x *HttpRoute_Distribution_Empty) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[23] + mi := &file_outbound_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1729,7 +1944,7 @@ type HttpRoute_Distribution_FirstAvailable struct { func (x *HttpRoute_Distribution_FirstAvailable) Reset() { *x = HttpRoute_Distribution_FirstAvailable{} - mi := &file_outbound_proto_msgTypes[24] + mi := &file_outbound_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1741,7 +1956,7 @@ func (x *HttpRoute_Distribution_FirstAvailable) String() string { func (*HttpRoute_Distribution_FirstAvailable) ProtoMessage() {} func (x *HttpRoute_Distribution_FirstAvailable) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[24] + mi := &file_outbound_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1773,7 +1988,7 @@ type HttpRoute_Distribution_RandomAvailable struct { func (x *HttpRoute_Distribution_RandomAvailable) Reset() { *x = HttpRoute_Distribution_RandomAvailable{} - mi := &file_outbound_proto_msgTypes[25] + mi := &file_outbound_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1785,7 +2000,7 @@ func (x *HttpRoute_Distribution_RandomAvailable) String() string { func (*HttpRoute_Distribution_RandomAvailable) ProtoMessage() {} func (x *HttpRoute_Distribution_RandomAvailable) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[25] + mi := &file_outbound_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1819,7 +2034,7 @@ type HttpRoute_Retry_Conditions struct { func (x *HttpRoute_Retry_Conditions) Reset() { *x = HttpRoute_Retry_Conditions{} - mi := &file_outbound_proto_msgTypes[26] + mi := &file_outbound_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1831,7 +2046,7 @@ func (x *HttpRoute_Retry_Conditions) String() string { func (*HttpRoute_Retry_Conditions) ProtoMessage() {} func (x *HttpRoute_Retry_Conditions) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[26] + mi := &file_outbound_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1864,7 +2079,7 @@ type HttpRoute_Retry_Conditions_StatusRange struct { func (x *HttpRoute_Retry_Conditions_StatusRange) Reset() { *x = HttpRoute_Retry_Conditions_StatusRange{} - mi := &file_outbound_proto_msgTypes[27] + mi := &file_outbound_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1876,7 +2091,7 @@ func (x *HttpRoute_Retry_Conditions_StatusRange) String() string { func (*HttpRoute_Retry_Conditions_StatusRange) ProtoMessage() {} func (x *HttpRoute_Retry_Conditions_StatusRange) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[27] + mi := &file_outbound_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1927,7 +2142,7 @@ type GrpcRoute_Rule struct { func (x *GrpcRoute_Rule) Reset() { *x = GrpcRoute_Rule{} - mi := &file_outbound_proto_msgTypes[28] + mi := &file_outbound_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1939,7 +2154,7 @@ func (x *GrpcRoute_Rule) String() string { func (*GrpcRoute_Rule) ProtoMessage() {} func (x *GrpcRoute_Rule) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[28] + mi := &file_outbound_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2018,7 +2233,7 @@ type GrpcRoute_Filter struct { func (x *GrpcRoute_Filter) Reset() { *x = GrpcRoute_Filter{} - mi := &file_outbound_proto_msgTypes[29] + mi := &file_outbound_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2030,7 +2245,7 @@ func (x *GrpcRoute_Filter) String() string { func (*GrpcRoute_Filter) ProtoMessage() {} func (x *GrpcRoute_Filter) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[29] + mi := &file_outbound_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2101,7 +2316,7 @@ type GrpcRoute_Distribution struct { func (x *GrpcRoute_Distribution) Reset() { *x = GrpcRoute_Distribution{} - mi := &file_outbound_proto_msgTypes[30] + mi := &file_outbound_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2113,7 +2328,7 @@ func (x *GrpcRoute_Distribution) String() string { func (*GrpcRoute_Distribution) ProtoMessage() {} func (x *GrpcRoute_Distribution) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[30] + mi := &file_outbound_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2200,7 +2415,7 @@ type GrpcRoute_Retry struct { func (x *GrpcRoute_Retry) Reset() { *x = GrpcRoute_Retry{} - mi := &file_outbound_proto_msgTypes[31] + mi := &file_outbound_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2212,7 +2427,7 @@ func (x *GrpcRoute_Retry) String() string { func (*GrpcRoute_Retry) ProtoMessage() {} func (x *GrpcRoute_Retry) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[31] + mi := &file_outbound_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2277,7 +2492,7 @@ type GrpcRoute_RouteBackend struct { func (x *GrpcRoute_RouteBackend) Reset() { *x = GrpcRoute_RouteBackend{} - mi := &file_outbound_proto_msgTypes[32] + mi := &file_outbound_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2289,7 +2504,7 @@ func (x *GrpcRoute_RouteBackend) String() string { func (*GrpcRoute_RouteBackend) ProtoMessage() {} func (x *GrpcRoute_RouteBackend) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[32] + mi := &file_outbound_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2337,7 +2552,7 @@ type GrpcRoute_WeightedRouteBackend struct { func (x *GrpcRoute_WeightedRouteBackend) Reset() { *x = GrpcRoute_WeightedRouteBackend{} - mi := &file_outbound_proto_msgTypes[33] + mi := &file_outbound_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2349,7 +2564,7 @@ func (x *GrpcRoute_WeightedRouteBackend) String() string { func (*GrpcRoute_WeightedRouteBackend) ProtoMessage() {} func (x *GrpcRoute_WeightedRouteBackend) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[33] + mi := &file_outbound_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2387,7 +2602,7 @@ type GrpcRoute_Distribution_Empty struct { func (x *GrpcRoute_Distribution_Empty) Reset() { *x = GrpcRoute_Distribution_Empty{} - mi := &file_outbound_proto_msgTypes[34] + mi := &file_outbound_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2399,7 +2614,7 @@ func (x *GrpcRoute_Distribution_Empty) String() string { func (*GrpcRoute_Distribution_Empty) ProtoMessage() {} func (x *GrpcRoute_Distribution_Empty) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[34] + mi := &file_outbound_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2424,7 +2639,7 @@ type GrpcRoute_Distribution_FirstAvailable struct { func (x *GrpcRoute_Distribution_FirstAvailable) Reset() { *x = GrpcRoute_Distribution_FirstAvailable{} - mi := &file_outbound_proto_msgTypes[35] + mi := &file_outbound_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2436,7 +2651,7 @@ func (x *GrpcRoute_Distribution_FirstAvailable) String() string { func (*GrpcRoute_Distribution_FirstAvailable) ProtoMessage() {} func (x *GrpcRoute_Distribution_FirstAvailable) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[35] + mi := &file_outbound_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2468,7 +2683,7 @@ type GrpcRoute_Distribution_RandomAvailable struct { func (x *GrpcRoute_Distribution_RandomAvailable) Reset() { *x = GrpcRoute_Distribution_RandomAvailable{} - mi := &file_outbound_proto_msgTypes[36] + mi := &file_outbound_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2480,7 +2695,7 @@ func (x *GrpcRoute_Distribution_RandomAvailable) String() string { func (*GrpcRoute_Distribution_RandomAvailable) ProtoMessage() {} func (x *GrpcRoute_Distribution_RandomAvailable) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[36] + mi := &file_outbound_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2517,7 +2732,7 @@ type GrpcRoute_Retry_Conditions struct { func (x *GrpcRoute_Retry_Conditions) Reset() { *x = GrpcRoute_Retry_Conditions{} - mi := &file_outbound_proto_msgTypes[37] + mi := &file_outbound_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2529,7 +2744,7 @@ func (x *GrpcRoute_Retry_Conditions) String() string { func (*GrpcRoute_Retry_Conditions) ProtoMessage() {} func (x *GrpcRoute_Retry_Conditions) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[37] + mi := &file_outbound_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2590,7 +2805,7 @@ type OpaqueRoute_Rule struct { func (x *OpaqueRoute_Rule) Reset() { *x = OpaqueRoute_Rule{} - mi := &file_outbound_proto_msgTypes[38] + mi := &file_outbound_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2602,7 +2817,7 @@ func (x *OpaqueRoute_Rule) String() string { func (*OpaqueRoute_Rule) ProtoMessage() {} func (x *OpaqueRoute_Rule) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[38] + mi := &file_outbound_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2645,7 +2860,7 @@ type OpaqueRoute_Filter struct { func (x *OpaqueRoute_Filter) Reset() { *x = OpaqueRoute_Filter{} - mi := &file_outbound_proto_msgTypes[39] + mi := &file_outbound_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2657,7 +2872,7 @@ func (x *OpaqueRoute_Filter) String() string { func (*OpaqueRoute_Filter) ProtoMessage() {} func (x *OpaqueRoute_Filter) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[39] + mi := &file_outbound_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2728,7 +2943,7 @@ type OpaqueRoute_Distribution struct { func (x *OpaqueRoute_Distribution) Reset() { *x = OpaqueRoute_Distribution{} - mi := &file_outbound_proto_msgTypes[40] + mi := &file_outbound_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2740,7 +2955,7 @@ func (x *OpaqueRoute_Distribution) String() string { func (*OpaqueRoute_Distribution) ProtoMessage() {} func (x *OpaqueRoute_Distribution) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[40] + mi := &file_outbound_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2823,7 +3038,7 @@ type OpaqueRoute_RouteBackend struct { func (x *OpaqueRoute_RouteBackend) Reset() { *x = OpaqueRoute_RouteBackend{} - mi := &file_outbound_proto_msgTypes[41] + mi := &file_outbound_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2835,7 +3050,7 @@ func (x *OpaqueRoute_RouteBackend) String() string { func (*OpaqueRoute_RouteBackend) ProtoMessage() {} func (x *OpaqueRoute_RouteBackend) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[41] + mi := &file_outbound_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2875,7 +3090,7 @@ type OpaqueRoute_WeightedRouteBackend struct { func (x *OpaqueRoute_WeightedRouteBackend) Reset() { *x = OpaqueRoute_WeightedRouteBackend{} - mi := &file_outbound_proto_msgTypes[42] + mi := &file_outbound_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2887,7 +3102,7 @@ func (x *OpaqueRoute_WeightedRouteBackend) String() string { func (*OpaqueRoute_WeightedRouteBackend) ProtoMessage() {} func (x *OpaqueRoute_WeightedRouteBackend) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[42] + mi := &file_outbound_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2925,7 +3140,7 @@ type OpaqueRoute_Distribution_Empty struct { func (x *OpaqueRoute_Distribution_Empty) Reset() { *x = OpaqueRoute_Distribution_Empty{} - mi := &file_outbound_proto_msgTypes[43] + mi := &file_outbound_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2937,7 +3152,7 @@ func (x *OpaqueRoute_Distribution_Empty) String() string { func (*OpaqueRoute_Distribution_Empty) ProtoMessage() {} func (x *OpaqueRoute_Distribution_Empty) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[43] + mi := &file_outbound_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2962,7 +3177,7 @@ type OpaqueRoute_Distribution_FirstAvailable struct { func (x *OpaqueRoute_Distribution_FirstAvailable) Reset() { *x = OpaqueRoute_Distribution_FirstAvailable{} - mi := &file_outbound_proto_msgTypes[44] + mi := &file_outbound_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2974,7 +3189,7 @@ func (x *OpaqueRoute_Distribution_FirstAvailable) String() string { func (*OpaqueRoute_Distribution_FirstAvailable) ProtoMessage() {} func (x *OpaqueRoute_Distribution_FirstAvailable) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[44] + mi := &file_outbound_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3006,7 +3221,7 @@ type OpaqueRoute_Distribution_RandomAvailable struct { func (x *OpaqueRoute_Distribution_RandomAvailable) Reset() { *x = OpaqueRoute_Distribution_RandomAvailable{} - mi := &file_outbound_proto_msgTypes[45] + mi := &file_outbound_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3018,7 +3233,7 @@ func (x *OpaqueRoute_Distribution_RandomAvailable) String() string { func (*OpaqueRoute_Distribution_RandomAvailable) ProtoMessage() {} func (x *OpaqueRoute_Distribution_RandomAvailable) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[45] + mi := &file_outbound_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3051,7 +3266,7 @@ type TlsRoute_Rule struct { func (x *TlsRoute_Rule) Reset() { *x = TlsRoute_Rule{} - mi := &file_outbound_proto_msgTypes[46] + mi := &file_outbound_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3063,7 +3278,7 @@ func (x *TlsRoute_Rule) String() string { func (*TlsRoute_Rule) ProtoMessage() {} func (x *TlsRoute_Rule) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[46] + mi := &file_outbound_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3106,7 +3321,7 @@ type TlsRoute_Filter struct { func (x *TlsRoute_Filter) Reset() { *x = TlsRoute_Filter{} - mi := &file_outbound_proto_msgTypes[47] + mi := &file_outbound_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3118,7 +3333,7 @@ func (x *TlsRoute_Filter) String() string { func (*TlsRoute_Filter) ProtoMessage() {} func (x *TlsRoute_Filter) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[47] + mi := &file_outbound_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3189,7 +3404,7 @@ type TlsRoute_Distribution struct { func (x *TlsRoute_Distribution) Reset() { *x = TlsRoute_Distribution{} - mi := &file_outbound_proto_msgTypes[48] + mi := &file_outbound_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3201,7 +3416,7 @@ func (x *TlsRoute_Distribution) String() string { func (*TlsRoute_Distribution) ProtoMessage() {} func (x *TlsRoute_Distribution) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[48] + mi := &file_outbound_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3284,7 +3499,7 @@ type TlsRoute_RouteBackend struct { func (x *TlsRoute_RouteBackend) Reset() { *x = TlsRoute_RouteBackend{} - mi := &file_outbound_proto_msgTypes[49] + mi := &file_outbound_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3296,7 +3511,7 @@ func (x *TlsRoute_RouteBackend) String() string { func (*TlsRoute_RouteBackend) ProtoMessage() {} func (x *TlsRoute_RouteBackend) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[49] + mi := &file_outbound_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3336,7 +3551,7 @@ type TlsRoute_WeightedRouteBackend struct { func (x *TlsRoute_WeightedRouteBackend) Reset() { *x = TlsRoute_WeightedRouteBackend{} - mi := &file_outbound_proto_msgTypes[50] + mi := &file_outbound_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3348,7 +3563,7 @@ func (x *TlsRoute_WeightedRouteBackend) String() string { func (*TlsRoute_WeightedRouteBackend) ProtoMessage() {} func (x *TlsRoute_WeightedRouteBackend) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[50] + mi := &file_outbound_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3386,7 +3601,7 @@ type TlsRoute_Distribution_Empty struct { func (x *TlsRoute_Distribution_Empty) Reset() { *x = TlsRoute_Distribution_Empty{} - mi := &file_outbound_proto_msgTypes[51] + mi := &file_outbound_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3398,7 +3613,7 @@ func (x *TlsRoute_Distribution_Empty) String() string { func (*TlsRoute_Distribution_Empty) ProtoMessage() {} func (x *TlsRoute_Distribution_Empty) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[51] + mi := &file_outbound_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3423,7 +3638,7 @@ type TlsRoute_Distribution_FirstAvailable struct { func (x *TlsRoute_Distribution_FirstAvailable) Reset() { *x = TlsRoute_Distribution_FirstAvailable{} - mi := &file_outbound_proto_msgTypes[52] + mi := &file_outbound_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3435,7 +3650,7 @@ func (x *TlsRoute_Distribution_FirstAvailable) String() string { func (*TlsRoute_Distribution_FirstAvailable) ProtoMessage() {} func (x *TlsRoute_Distribution_FirstAvailable) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[52] + mi := &file_outbound_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3467,7 +3682,7 @@ type TlsRoute_Distribution_RandomAvailable struct { func (x *TlsRoute_Distribution_RandomAvailable) Reset() { *x = TlsRoute_Distribution_RandomAvailable{} - mi := &file_outbound_proto_msgTypes[53] + mi := &file_outbound_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3479,7 +3694,7 @@ func (x *TlsRoute_Distribution_RandomAvailable) String() string { func (*TlsRoute_Distribution_RandomAvailable) ProtoMessage() {} func (x *TlsRoute_Distribution_RandomAvailable) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[53] + mi := &file_outbound_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3515,7 +3730,7 @@ type Backend_EndpointDiscovery struct { func (x *Backend_EndpointDiscovery) Reset() { *x = Backend_EndpointDiscovery{} - mi := &file_outbound_proto_msgTypes[54] + mi := &file_outbound_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3527,7 +3742,7 @@ func (x *Backend_EndpointDiscovery) String() string { func (*Backend_EndpointDiscovery) ProtoMessage() {} func (x *Backend_EndpointDiscovery) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[54] + mi := &file_outbound_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3580,14 +3795,17 @@ type Backend_BalanceP2C struct { // Types that are valid to be assigned to Load: // // *Backend_BalanceP2C_PeakEwma_ - Load isBackend_BalanceP2C_Load `protobuf_oneof:"load"` + Load isBackend_BalanceP2C_Load `protobuf_oneof:"load"` + // Ejection protection for the pool. When set, prevents circuit + // breakers from ejecting endpoints below the configured floor. + Ejection *EjectionConfig `protobuf:"bytes,3,opt,name=ejection,proto3" json:"ejection,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *Backend_BalanceP2C) Reset() { *x = Backend_BalanceP2C{} - mi := &file_outbound_proto_msgTypes[55] + mi := &file_outbound_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3599,7 +3817,7 @@ func (x *Backend_BalanceP2C) String() string { func (*Backend_BalanceP2C) ProtoMessage() {} func (x *Backend_BalanceP2C) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[55] + mi := &file_outbound_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3638,6 +3856,13 @@ func (x *Backend_BalanceP2C) GetPeakEwma() *Backend_BalanceP2C_PeakEwma { return nil } +func (x *Backend_BalanceP2C) GetEjection() *EjectionConfig { + if x != nil { + return x.Ejection + } + return nil +} + type isBackend_BalanceP2C_Load interface { isBackend_BalanceP2C_Load() } @@ -3659,7 +3884,7 @@ type Backend_EndpointDiscovery_DestinationGet struct { func (x *Backend_EndpointDiscovery_DestinationGet) Reset() { *x = Backend_EndpointDiscovery_DestinationGet{} - mi := &file_outbound_proto_msgTypes[56] + mi := &file_outbound_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3671,7 +3896,7 @@ func (x *Backend_EndpointDiscovery_DestinationGet) String() string { func (*Backend_EndpointDiscovery_DestinationGet) ProtoMessage() {} func (x *Backend_EndpointDiscovery_DestinationGet) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[56] + mi := &file_outbound_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3708,7 +3933,7 @@ type Backend_BalanceP2C_PeakEwma struct { func (x *Backend_BalanceP2C_PeakEwma) Reset() { *x = Backend_BalanceP2C_PeakEwma{} - mi := &file_outbound_proto_msgTypes[57] + mi := &file_outbound_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3720,7 +3945,7 @@ func (x *Backend_BalanceP2C_PeakEwma) String() string { func (*Backend_BalanceP2C_PeakEwma) ProtoMessage() {} func (x *Backend_BalanceP2C_PeakEwma) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[57] + mi := &file_outbound_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3751,16 +3976,20 @@ func (x *Backend_BalanceP2C_PeakEwma) GetDecay() *duration.Duration { } type FailureAccrual_ConsecutiveFailures struct { - state protoimpl.MessageState `protogen:"open.v1"` - MaxFailures uint32 `protobuf:"varint,1,opt,name=max_failures,json=maxFailures,proto3" json:"max_failures,omitempty"` - Backoff *ExponentialBackoff `protobuf:"bytes,2,opt,name=backoff,proto3" json:"backoff,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + // Maximum consecutive failures before the circuit trips. + // Set to 0 to disable (an unset field has the same effect). + MaxFailures uint32 `protobuf:"varint,1,opt,name=max_failures,json=maxFailures,proto3" json:"max_failures,omitempty"` + // Must be set. Controls the ejection duration before probe requests + // are allowed after any policy (not just CF) trips the circuit. + Backoff *ExponentialBackoff `protobuf:"bytes,2,opt,name=backoff,proto3" json:"backoff,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *FailureAccrual_ConsecutiveFailures) Reset() { *x = FailureAccrual_ConsecutiveFailures{} - mi := &file_outbound_proto_msgTypes[58] + mi := &file_outbound_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3772,7 +4001,7 @@ func (x *FailureAccrual_ConsecutiveFailures) String() string { func (*FailureAccrual_ConsecutiveFailures) ProtoMessage() {} func (x *FailureAccrual_ConsecutiveFailures) ProtoReflect() protoreflect.Message { - mi := &file_outbound_proto_msgTypes[58] + mi := &file_outbound_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3802,6 +4031,72 @@ func (x *FailureAccrual_ConsecutiveFailures) GetBackoff() *ExponentialBackoff { return nil } +type FailureAccrual_SuccessRate struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Success rate threshold in [0.0, 1.0]. The circuit trips when the + // EWMA success rate drops below this value. Set to 0.0 to disable. + // Defined as `double` (not `float`) because this value is compared + // against the proxy's f64 EWMA on every request. + Threshold float64 `protobuf:"fixed64,1,opt,name=threshold,proto3" json:"threshold,omitempty"` + // EWMA decay window for success rate tracking. + Decay *duration.Duration `protobuf:"bytes,2,opt,name=decay,proto3" json:"decay,omitempty"` + // Minimum requests before the success rate policy can trip (cold-start guard). + MinRequests uint32 `protobuf:"varint,3,opt,name=min_requests,json=minRequests,proto3" json:"min_requests,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *FailureAccrual_SuccessRate) Reset() { + *x = FailureAccrual_SuccessRate{} + mi := &file_outbound_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *FailureAccrual_SuccessRate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FailureAccrual_SuccessRate) ProtoMessage() {} + +func (x *FailureAccrual_SuccessRate) ProtoReflect() protoreflect.Message { + mi := &file_outbound_proto_msgTypes[62] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FailureAccrual_SuccessRate.ProtoReflect.Descriptor instead. +func (*FailureAccrual_SuccessRate) Descriptor() ([]byte, []int) { + return file_outbound_proto_rawDescGZIP(), []int{9, 1} +} + +func (x *FailureAccrual_SuccessRate) GetThreshold() float64 { + if x != nil { + return x.Threshold + } + return 0 +} + +func (x *FailureAccrual_SuccessRate) GetDecay() *duration.Duration { + if x != nil { + return x.Decay + } + return nil +} + +func (x *FailureAccrual_SuccessRate) GetMinRequests() uint32 { + if x != nil { + return x.MinRequests + } + return 0 +} + var File_outbound_proto protoreflect.FileDescriptor const file_outbound_proto_rawDesc = "" + @@ -3815,8 +4110,7 @@ const file_outbound_proto_rawDesc = "" + "\x06target\"\x93\x01\n" + "\x0eOutboundPolicy\x12D\n" + "\bprotocol\x18\x01 \x01(\v2(.io.linkerd.proxy.outbound.ProxyProtocolR\bprotocol\x12;\n" + - "\bmetadata\x18\x02 \x01(\v2\x1f.io.linkerd.proxy.meta.MetadataR\bmetadata\"\xba\n" + - "\n" + + "\bmetadata\x18\x02 \x01(\v2\x1f.io.linkerd.proxy.meta.MetadataR\bmetadata\"\xfc\r\n" + "\rProxyProtocol\x12I\n" + "\x06detect\x18\x01 \x01(\v2/.io.linkerd.proxy.outbound.ProxyProtocol.DetectH\x00R\x06detect\x12I\n" + "\x06opaque\x18\x02 \x01(\v2/.io.linkerd.proxy.outbound.ProxyProtocol.OpaqueH\x00R\x06opaque\x12F\n" + @@ -3830,16 +4124,25 @@ const file_outbound_proto_rawDesc = "" + "\x05http1\x18\x03 \x01(\v2..io.linkerd.proxy.outbound.ProxyProtocol.Http1R\x05http1\x12D\n" + "\x05http2\x18\x04 \x01(\v2..io.linkerd.proxy.outbound.ProxyProtocol.Http2R\x05http2\x1aH\n" + "\x06Opaque\x12>\n" + - "\x06routes\x18\x01 \x03(\v2&.io.linkerd.proxy.outbound.OpaqueRouteR\x06routes\x1a\x99\x01\n" + + "\x06routes\x18\x01 \x03(\v2&.io.linkerd.proxy.outbound.OpaqueRouteR\x06routes\x1a\xaf\x02\n" + "\x05Http1\x12<\n" + "\x06routes\x18\x01 \x03(\v2$.io.linkerd.proxy.outbound.HttpRouteR\x06routes\x12R\n" + - "\x0ffailure_accrual\x18\x02 \x01(\v2).io.linkerd.proxy.outbound.FailureAccrualR\x0efailureAccrual\x1a\x99\x01\n" + + "\x0ffailure_accrual\x18\x02 \x01(\v2).io.linkerd.proxy.outbound.FailureAccrualR\x0efailureAccrual\x12F\n" + + "\tload_bias\x18\x03 \x01(\v2).io.linkerd.proxy.outbound.LoadBiasConfigR\bloadBias\x12L\n" + + "\vretry_after\x18\x04 \x01(\v2+.io.linkerd.proxy.outbound.RetryAfterConfigR\n" + + "retryAfter\x1a\xaf\x02\n" + "\x05Http2\x12<\n" + "\x06routes\x18\x01 \x03(\v2$.io.linkerd.proxy.outbound.HttpRouteR\x06routes\x12R\n" + - "\x0ffailure_accrual\x18\x02 \x01(\v2).io.linkerd.proxy.outbound.FailureAccrualR\x0efailureAccrual\x1a\x98\x01\n" + + "\x0ffailure_accrual\x18\x02 \x01(\v2).io.linkerd.proxy.outbound.FailureAccrualR\x0efailureAccrual\x12F\n" + + "\tload_bias\x18\x03 \x01(\v2).io.linkerd.proxy.outbound.LoadBiasConfigR\bloadBias\x12L\n" + + "\vretry_after\x18\x04 \x01(\v2+.io.linkerd.proxy.outbound.RetryAfterConfigR\n" + + "retryAfter\x1a\xae\x02\n" + "\x04Grpc\x12<\n" + "\x06routes\x18\x01 \x03(\v2$.io.linkerd.proxy.outbound.GrpcRouteR\x06routes\x12R\n" + - "\x0ffailure_accrual\x18\x02 \x01(\v2).io.linkerd.proxy.outbound.FailureAccrualR\x0efailureAccrual\x1aB\n" + + "\x0ffailure_accrual\x18\x02 \x01(\v2).io.linkerd.proxy.outbound.FailureAccrualR\x0efailureAccrual\x12F\n" + + "\tload_bias\x18\x03 \x01(\v2).io.linkerd.proxy.outbound.LoadBiasConfigR\bloadBias\x12L\n" + + "\vretry_after\x18\x04 \x01(\v2+.io.linkerd.proxy.outbound.RetryAfterConfigR\n" + + "retryAfter\x1aB\n" + "\x03Tls\x12;\n" + "\x06routes\x18\x01 \x03(\v2#.io.linkerd.proxy.outbound.TlsRouteR\x06routesB\x06\n" + "\x04kind\"\xa0\x13\n" + @@ -3996,7 +4299,7 @@ const file_outbound_proto_rawDesc = "" + "\afilters\x18\x03 \x03(\v2*.io.linkerd.proxy.outbound.TlsRoute.FilterR\afiltersJ\x04\b\x02\x10\x03\x1az\n" + "\x14WeightedRouteBackend\x12J\n" + "\abackend\x18\x01 \x01(\v20.io.linkerd.proxy.outbound.TlsRoute.RouteBackendR\abackend\x12\x16\n" + - "\x06weight\x18\x02 \x01(\rR\x06weightJ\x04\b\x04\x10\x05\"\xf3\x05\n" + + "\x06weight\x18\x02 \x01(\rR\x06weightJ\x04\b\x04\x10\x05\"\xba\x06\n" + "\aBackend\x12;\n" + "\bmetadata\x18\x01 \x01(\v2\x1f.io.linkerd.proxy.meta.MetadataR\bmetadata\x12F\n" + "\aforward\x18\x02 \x01(\v2*.io.linkerd.proxy.destination.WeightedAddrH\x00R\aforward\x12K\n" + @@ -4006,11 +4309,12 @@ const file_outbound_proto_rawDesc = "" + "\x03dst\x18\x01 \x01(\v2C.io.linkerd.proxy.outbound.Backend.EndpointDiscovery.DestinationGetH\x00R\x03dst\x1a$\n" + "\x0eDestinationGet\x12\x12\n" + "\x04path\x18\x01 \x01(\tR\x04pathB\x06\n" + - "\x04kind\x1a\xb8\x02\n" + + "\x04kind\x1a\xff\x02\n" + "\n" + "BalanceP2c\x12R\n" + "\tdiscovery\x18\x01 \x01(\v24.io.linkerd.proxy.outbound.Backend.EndpointDiscoveryR\tdiscovery\x12U\n" + - "\tpeak_ewma\x18\x02 \x01(\v26.io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwmaH\x00R\bpeakEwma\x1aw\n" + + "\tpeak_ewma\x18\x02 \x01(\v26.io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwmaH\x00R\bpeakEwma\x12E\n" + + "\bejection\x18\x03 \x01(\v2).io.linkerd.proxy.outbound.EjectionConfigR\bejection\x1aw\n" + "\bPeakEwma\x12:\n" + "\vdefault_rtt\x18\x01 \x01(\v2\x19.google.protobuf.DurationR\n" + "defaultRtt\x12/\n" + @@ -4019,13 +4323,25 @@ const file_outbound_proto_rawDesc = "" + "\x04kind\"i\n" + "\x05Queue\x12\x1a\n" + "\bcapacity\x18\x01 \x01(\rR\bcapacity\x12D\n" + - "\x10failfast_timeout\x18\x02 \x01(\v2\x19.google.protobuf.DurationR\x0ffailfastTimeout\"\x90\x02\n" + - "\x0eFailureAccrual\x12r\n" + - "\x14consecutive_failures\x18\x01 \x01(\v2=.io.linkerd.proxy.outbound.FailureAccrual.ConsecutiveFailuresH\x00R\x13consecutiveFailures\x1a\x81\x01\n" + + "\x10failfast_timeout\x18\x02 \x01(\v2\x19.google.protobuf.DurationR\x0ffailfastTimeout\"\xe1\x03\n" + + "\x0eFailureAccrual\x12p\n" + + "\x14consecutive_failures\x18\x01 \x01(\v2=.io.linkerd.proxy.outbound.FailureAccrual.ConsecutiveFailuresR\x13consecutiveFailures\x12X\n" + + "\fsuccess_rate\x18\x02 \x01(\v25.io.linkerd.proxy.outbound.FailureAccrual.SuccessRateR\vsuccessRate\x1a\x81\x01\n" + "\x13ConsecutiveFailures\x12!\n" + "\fmax_failures\x18\x01 \x01(\rR\vmaxFailures\x12G\n" + - "\abackoff\x18\x02 \x01(\v2-.io.linkerd.proxy.outbound.ExponentialBackoffR\abackoffB\x06\n" + - "\x04kind\"\xaf\x01\n" + + "\abackoff\x18\x02 \x01(\v2-.io.linkerd.proxy.outbound.ExponentialBackoffR\abackoff\x1a\x7f\n" + + "\vSuccessRate\x12\x1c\n" + + "\tthreshold\x18\x01 \x01(\x01R\tthreshold\x12/\n" + + "\x05decay\x18\x02 \x01(\v2\x19.google.protobuf.DurationR\x05decay\x12!\n" + + "\fmin_requests\x18\x03 \x01(\rR\vminRequests\"\x9f\x01\n" + + "\x0eLoadBiasConfig\x12\x18\n" + + "\aenabled\x18\x01 \x01(\bR\aenabled\x123\n" + + "\apenalty\x18\x02 \x01(\v2\x19.google.protobuf.DurationR\apenalty\x12>\n" + + "\rpenalty_decay\x18\x03 \x01(\v2\x19.google.protobuf.DurationR\fpenaltyDecay\"P\n" + + "\x10RetryAfterConfig\x12<\n" + + "\fmax_duration\x18\x01 \x01(\v2\x19.google.protobuf.DurationR\vmaxDuration\"@\n" + + "\x0eEjectionConfig\x12.\n" + + "\x13min_ready_endpoints\x18\x01 \x01(\rR\x11minReadyEndpoints\"\xaf\x01\n" + "\x12ExponentialBackoff\x12:\n" + "\vmin_backoff\x18\x01 \x01(\v2\x19.google.protobuf.DurationR\n" + "minBackoff\x12:\n" + @@ -4048,7 +4364,7 @@ func file_outbound_proto_rawDescGZIP() []byte { return file_outbound_proto_rawDescData } -var file_outbound_proto_msgTypes = make([]protoimpl.MessageInfo, 59) +var file_outbound_proto_msgTypes = make([]protoimpl.MessageInfo, 63) var file_outbound_proto_goTypes = []any{ (*TrafficSpec)(nil), // 0: io.linkerd.proxy.outbound.TrafficSpec (*OutboundPolicy)(nil), // 1: io.linkerd.proxy.outbound.OutboundPolicy @@ -4060,195 +4376,211 @@ var file_outbound_proto_goTypes = []any{ (*Backend)(nil), // 7: io.linkerd.proxy.outbound.Backend (*Queue)(nil), // 8: io.linkerd.proxy.outbound.Queue (*FailureAccrual)(nil), // 9: io.linkerd.proxy.outbound.FailureAccrual - (*ExponentialBackoff)(nil), // 10: io.linkerd.proxy.outbound.ExponentialBackoff - (*ProxyProtocol_Detect)(nil), // 11: io.linkerd.proxy.outbound.ProxyProtocol.Detect - (*ProxyProtocol_Opaque)(nil), // 12: io.linkerd.proxy.outbound.ProxyProtocol.Opaque - (*ProxyProtocol_Http1)(nil), // 13: io.linkerd.proxy.outbound.ProxyProtocol.Http1 - (*ProxyProtocol_Http2)(nil), // 14: io.linkerd.proxy.outbound.ProxyProtocol.Http2 - (*ProxyProtocol_Grpc)(nil), // 15: io.linkerd.proxy.outbound.ProxyProtocol.Grpc - (*ProxyProtocol_Tls)(nil), // 16: io.linkerd.proxy.outbound.ProxyProtocol.Tls - (*HttpRoute_Rule)(nil), // 17: io.linkerd.proxy.outbound.HttpRoute.Rule - (*HttpRoute_Filter)(nil), // 18: io.linkerd.proxy.outbound.HttpRoute.Filter - (*HttpRoute_Distribution)(nil), // 19: io.linkerd.proxy.outbound.HttpRoute.Distribution - (*HttpRoute_Retry)(nil), // 20: io.linkerd.proxy.outbound.HttpRoute.Retry - (*HttpRoute_RouteBackend)(nil), // 21: io.linkerd.proxy.outbound.HttpRoute.RouteBackend - (*HttpRoute_WeightedRouteBackend)(nil), // 22: io.linkerd.proxy.outbound.HttpRoute.WeightedRouteBackend - (*HttpRoute_Distribution_Empty)(nil), // 23: io.linkerd.proxy.outbound.HttpRoute.Distribution.Empty - (*HttpRoute_Distribution_FirstAvailable)(nil), // 24: io.linkerd.proxy.outbound.HttpRoute.Distribution.FirstAvailable - (*HttpRoute_Distribution_RandomAvailable)(nil), // 25: io.linkerd.proxy.outbound.HttpRoute.Distribution.RandomAvailable - (*HttpRoute_Retry_Conditions)(nil), // 26: io.linkerd.proxy.outbound.HttpRoute.Retry.Conditions - (*HttpRoute_Retry_Conditions_StatusRange)(nil), // 27: io.linkerd.proxy.outbound.HttpRoute.Retry.Conditions.StatusRange - (*GrpcRoute_Rule)(nil), // 28: io.linkerd.proxy.outbound.GrpcRoute.Rule - (*GrpcRoute_Filter)(nil), // 29: io.linkerd.proxy.outbound.GrpcRoute.Filter - (*GrpcRoute_Distribution)(nil), // 30: io.linkerd.proxy.outbound.GrpcRoute.Distribution - (*GrpcRoute_Retry)(nil), // 31: io.linkerd.proxy.outbound.GrpcRoute.Retry - (*GrpcRoute_RouteBackend)(nil), // 32: io.linkerd.proxy.outbound.GrpcRoute.RouteBackend - (*GrpcRoute_WeightedRouteBackend)(nil), // 33: io.linkerd.proxy.outbound.GrpcRoute.WeightedRouteBackend - (*GrpcRoute_Distribution_Empty)(nil), // 34: io.linkerd.proxy.outbound.GrpcRoute.Distribution.Empty - (*GrpcRoute_Distribution_FirstAvailable)(nil), // 35: io.linkerd.proxy.outbound.GrpcRoute.Distribution.FirstAvailable - (*GrpcRoute_Distribution_RandomAvailable)(nil), // 36: io.linkerd.proxy.outbound.GrpcRoute.Distribution.RandomAvailable - (*GrpcRoute_Retry_Conditions)(nil), // 37: io.linkerd.proxy.outbound.GrpcRoute.Retry.Conditions - (*OpaqueRoute_Rule)(nil), // 38: io.linkerd.proxy.outbound.OpaqueRoute.Rule - (*OpaqueRoute_Filter)(nil), // 39: io.linkerd.proxy.outbound.OpaqueRoute.Filter - (*OpaqueRoute_Distribution)(nil), // 40: io.linkerd.proxy.outbound.OpaqueRoute.Distribution - (*OpaqueRoute_RouteBackend)(nil), // 41: io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend - (*OpaqueRoute_WeightedRouteBackend)(nil), // 42: io.linkerd.proxy.outbound.OpaqueRoute.WeightedRouteBackend - (*OpaqueRoute_Distribution_Empty)(nil), // 43: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.Empty - (*OpaqueRoute_Distribution_FirstAvailable)(nil), // 44: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.FirstAvailable - (*OpaqueRoute_Distribution_RandomAvailable)(nil), // 45: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.RandomAvailable - (*TlsRoute_Rule)(nil), // 46: io.linkerd.proxy.outbound.TlsRoute.Rule - (*TlsRoute_Filter)(nil), // 47: io.linkerd.proxy.outbound.TlsRoute.Filter - (*TlsRoute_Distribution)(nil), // 48: io.linkerd.proxy.outbound.TlsRoute.Distribution - (*TlsRoute_RouteBackend)(nil), // 49: io.linkerd.proxy.outbound.TlsRoute.RouteBackend - (*TlsRoute_WeightedRouteBackend)(nil), // 50: io.linkerd.proxy.outbound.TlsRoute.WeightedRouteBackend - (*TlsRoute_Distribution_Empty)(nil), // 51: io.linkerd.proxy.outbound.TlsRoute.Distribution.Empty - (*TlsRoute_Distribution_FirstAvailable)(nil), // 52: io.linkerd.proxy.outbound.TlsRoute.Distribution.FirstAvailable - (*TlsRoute_Distribution_RandomAvailable)(nil), // 53: io.linkerd.proxy.outbound.TlsRoute.Distribution.RandomAvailable - (*Backend_EndpointDiscovery)(nil), // 54: io.linkerd.proxy.outbound.Backend.EndpointDiscovery - (*Backend_BalanceP2C)(nil), // 55: io.linkerd.proxy.outbound.Backend.BalanceP2c - (*Backend_EndpointDiscovery_DestinationGet)(nil), // 56: io.linkerd.proxy.outbound.Backend.EndpointDiscovery.DestinationGet - (*Backend_BalanceP2C_PeakEwma)(nil), // 57: io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma - (*FailureAccrual_ConsecutiveFailures)(nil), // 58: io.linkerd.proxy.outbound.FailureAccrual.ConsecutiveFailures - (*net.TcpAddress)(nil), // 59: io.linkerd.proxy.net.TcpAddress - (*meta.Metadata)(nil), // 60: io.linkerd.proxy.meta.Metadata - (*http_route.HostMatch)(nil), // 61: io.linkerd.proxy.http_route.HostMatch - (*tls_route.SniMatch)(nil), // 62: io.linkerd.proxy.tls_route.SniMatch - (*destination.WeightedAddr)(nil), // 63: io.linkerd.proxy.destination.WeightedAddr - (*duration.Duration)(nil), // 64: google.protobuf.Duration - (*http_route.HttpRouteMatch)(nil), // 65: io.linkerd.proxy.http_route.HttpRouteMatch - (*http_route.Timeouts)(nil), // 66: io.linkerd.proxy.http_route.Timeouts - (*http_route.HttpFailureInjector)(nil), // 67: io.linkerd.proxy.http_route.HttpFailureInjector - (*http_route.RequestHeaderModifier)(nil), // 68: io.linkerd.proxy.http_route.RequestHeaderModifier - (*http_route.RequestRedirect)(nil), // 69: io.linkerd.proxy.http_route.RequestRedirect - (*http_route.ResponseHeaderModifier)(nil), // 70: io.linkerd.proxy.http_route.ResponseHeaderModifier - (*grpc_route.GrpcRouteMatch)(nil), // 71: io.linkerd.proxy.grpc_route.GrpcRouteMatch - (*grpc_route.GrpcFailureInjector)(nil), // 72: io.linkerd.proxy.grpc_route.GrpcFailureInjector - (*opaque_route.Invalid)(nil), // 73: io.linkerd.proxy.opaque_route.Invalid - (*opaque_route.Forbidden)(nil), // 74: io.linkerd.proxy.opaque_route.Forbidden + (*LoadBiasConfig)(nil), // 10: io.linkerd.proxy.outbound.LoadBiasConfig + (*RetryAfterConfig)(nil), // 11: io.linkerd.proxy.outbound.RetryAfterConfig + (*EjectionConfig)(nil), // 12: io.linkerd.proxy.outbound.EjectionConfig + (*ExponentialBackoff)(nil), // 13: io.linkerd.proxy.outbound.ExponentialBackoff + (*ProxyProtocol_Detect)(nil), // 14: io.linkerd.proxy.outbound.ProxyProtocol.Detect + (*ProxyProtocol_Opaque)(nil), // 15: io.linkerd.proxy.outbound.ProxyProtocol.Opaque + (*ProxyProtocol_Http1)(nil), // 16: io.linkerd.proxy.outbound.ProxyProtocol.Http1 + (*ProxyProtocol_Http2)(nil), // 17: io.linkerd.proxy.outbound.ProxyProtocol.Http2 + (*ProxyProtocol_Grpc)(nil), // 18: io.linkerd.proxy.outbound.ProxyProtocol.Grpc + (*ProxyProtocol_Tls)(nil), // 19: io.linkerd.proxy.outbound.ProxyProtocol.Tls + (*HttpRoute_Rule)(nil), // 20: io.linkerd.proxy.outbound.HttpRoute.Rule + (*HttpRoute_Filter)(nil), // 21: io.linkerd.proxy.outbound.HttpRoute.Filter + (*HttpRoute_Distribution)(nil), // 22: io.linkerd.proxy.outbound.HttpRoute.Distribution + (*HttpRoute_Retry)(nil), // 23: io.linkerd.proxy.outbound.HttpRoute.Retry + (*HttpRoute_RouteBackend)(nil), // 24: io.linkerd.proxy.outbound.HttpRoute.RouteBackend + (*HttpRoute_WeightedRouteBackend)(nil), // 25: io.linkerd.proxy.outbound.HttpRoute.WeightedRouteBackend + (*HttpRoute_Distribution_Empty)(nil), // 26: io.linkerd.proxy.outbound.HttpRoute.Distribution.Empty + (*HttpRoute_Distribution_FirstAvailable)(nil), // 27: io.linkerd.proxy.outbound.HttpRoute.Distribution.FirstAvailable + (*HttpRoute_Distribution_RandomAvailable)(nil), // 28: io.linkerd.proxy.outbound.HttpRoute.Distribution.RandomAvailable + (*HttpRoute_Retry_Conditions)(nil), // 29: io.linkerd.proxy.outbound.HttpRoute.Retry.Conditions + (*HttpRoute_Retry_Conditions_StatusRange)(nil), // 30: io.linkerd.proxy.outbound.HttpRoute.Retry.Conditions.StatusRange + (*GrpcRoute_Rule)(nil), // 31: io.linkerd.proxy.outbound.GrpcRoute.Rule + (*GrpcRoute_Filter)(nil), // 32: io.linkerd.proxy.outbound.GrpcRoute.Filter + (*GrpcRoute_Distribution)(nil), // 33: io.linkerd.proxy.outbound.GrpcRoute.Distribution + (*GrpcRoute_Retry)(nil), // 34: io.linkerd.proxy.outbound.GrpcRoute.Retry + (*GrpcRoute_RouteBackend)(nil), // 35: io.linkerd.proxy.outbound.GrpcRoute.RouteBackend + (*GrpcRoute_WeightedRouteBackend)(nil), // 36: io.linkerd.proxy.outbound.GrpcRoute.WeightedRouteBackend + (*GrpcRoute_Distribution_Empty)(nil), // 37: io.linkerd.proxy.outbound.GrpcRoute.Distribution.Empty + (*GrpcRoute_Distribution_FirstAvailable)(nil), // 38: io.linkerd.proxy.outbound.GrpcRoute.Distribution.FirstAvailable + (*GrpcRoute_Distribution_RandomAvailable)(nil), // 39: io.linkerd.proxy.outbound.GrpcRoute.Distribution.RandomAvailable + (*GrpcRoute_Retry_Conditions)(nil), // 40: io.linkerd.proxy.outbound.GrpcRoute.Retry.Conditions + (*OpaqueRoute_Rule)(nil), // 41: io.linkerd.proxy.outbound.OpaqueRoute.Rule + (*OpaqueRoute_Filter)(nil), // 42: io.linkerd.proxy.outbound.OpaqueRoute.Filter + (*OpaqueRoute_Distribution)(nil), // 43: io.linkerd.proxy.outbound.OpaqueRoute.Distribution + (*OpaqueRoute_RouteBackend)(nil), // 44: io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend + (*OpaqueRoute_WeightedRouteBackend)(nil), // 45: io.linkerd.proxy.outbound.OpaqueRoute.WeightedRouteBackend + (*OpaqueRoute_Distribution_Empty)(nil), // 46: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.Empty + (*OpaqueRoute_Distribution_FirstAvailable)(nil), // 47: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.FirstAvailable + (*OpaqueRoute_Distribution_RandomAvailable)(nil), // 48: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.RandomAvailable + (*TlsRoute_Rule)(nil), // 49: io.linkerd.proxy.outbound.TlsRoute.Rule + (*TlsRoute_Filter)(nil), // 50: io.linkerd.proxy.outbound.TlsRoute.Filter + (*TlsRoute_Distribution)(nil), // 51: io.linkerd.proxy.outbound.TlsRoute.Distribution + (*TlsRoute_RouteBackend)(nil), // 52: io.linkerd.proxy.outbound.TlsRoute.RouteBackend + (*TlsRoute_WeightedRouteBackend)(nil), // 53: io.linkerd.proxy.outbound.TlsRoute.WeightedRouteBackend + (*TlsRoute_Distribution_Empty)(nil), // 54: io.linkerd.proxy.outbound.TlsRoute.Distribution.Empty + (*TlsRoute_Distribution_FirstAvailable)(nil), // 55: io.linkerd.proxy.outbound.TlsRoute.Distribution.FirstAvailable + (*TlsRoute_Distribution_RandomAvailable)(nil), // 56: io.linkerd.proxy.outbound.TlsRoute.Distribution.RandomAvailable + (*Backend_EndpointDiscovery)(nil), // 57: io.linkerd.proxy.outbound.Backend.EndpointDiscovery + (*Backend_BalanceP2C)(nil), // 58: io.linkerd.proxy.outbound.Backend.BalanceP2c + (*Backend_EndpointDiscovery_DestinationGet)(nil), // 59: io.linkerd.proxy.outbound.Backend.EndpointDiscovery.DestinationGet + (*Backend_BalanceP2C_PeakEwma)(nil), // 60: io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma + (*FailureAccrual_ConsecutiveFailures)(nil), // 61: io.linkerd.proxy.outbound.FailureAccrual.ConsecutiveFailures + (*FailureAccrual_SuccessRate)(nil), // 62: io.linkerd.proxy.outbound.FailureAccrual.SuccessRate + (*net.TcpAddress)(nil), // 63: io.linkerd.proxy.net.TcpAddress + (*meta.Metadata)(nil), // 64: io.linkerd.proxy.meta.Metadata + (*http_route.HostMatch)(nil), // 65: io.linkerd.proxy.http_route.HostMatch + (*tls_route.SniMatch)(nil), // 66: io.linkerd.proxy.tls_route.SniMatch + (*destination.WeightedAddr)(nil), // 67: io.linkerd.proxy.destination.WeightedAddr + (*duration.Duration)(nil), // 68: google.protobuf.Duration + (*http_route.HttpRouteMatch)(nil), // 69: io.linkerd.proxy.http_route.HttpRouteMatch + (*http_route.Timeouts)(nil), // 70: io.linkerd.proxy.http_route.Timeouts + (*http_route.HttpFailureInjector)(nil), // 71: io.linkerd.proxy.http_route.HttpFailureInjector + (*http_route.RequestHeaderModifier)(nil), // 72: io.linkerd.proxy.http_route.RequestHeaderModifier + (*http_route.RequestRedirect)(nil), // 73: io.linkerd.proxy.http_route.RequestRedirect + (*http_route.ResponseHeaderModifier)(nil), // 74: io.linkerd.proxy.http_route.ResponseHeaderModifier + (*grpc_route.GrpcRouteMatch)(nil), // 75: io.linkerd.proxy.grpc_route.GrpcRouteMatch + (*grpc_route.GrpcFailureInjector)(nil), // 76: io.linkerd.proxy.grpc_route.GrpcFailureInjector + (*opaque_route.Invalid)(nil), // 77: io.linkerd.proxy.opaque_route.Invalid + (*opaque_route.Forbidden)(nil), // 78: io.linkerd.proxy.opaque_route.Forbidden } var file_outbound_proto_depIdxs = []int32{ - 59, // 0: io.linkerd.proxy.outbound.TrafficSpec.addr:type_name -> io.linkerd.proxy.net.TcpAddress + 63, // 0: io.linkerd.proxy.outbound.TrafficSpec.addr:type_name -> io.linkerd.proxy.net.TcpAddress 2, // 1: io.linkerd.proxy.outbound.OutboundPolicy.protocol:type_name -> io.linkerd.proxy.outbound.ProxyProtocol - 60, // 2: io.linkerd.proxy.outbound.OutboundPolicy.metadata:type_name -> io.linkerd.proxy.meta.Metadata - 11, // 3: io.linkerd.proxy.outbound.ProxyProtocol.detect:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Detect - 12, // 4: io.linkerd.proxy.outbound.ProxyProtocol.opaque:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Opaque - 13, // 5: io.linkerd.proxy.outbound.ProxyProtocol.http1:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http1 - 14, // 6: io.linkerd.proxy.outbound.ProxyProtocol.http2:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http2 - 15, // 7: io.linkerd.proxy.outbound.ProxyProtocol.grpc:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Grpc - 16, // 8: io.linkerd.proxy.outbound.ProxyProtocol.tls:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Tls - 60, // 9: io.linkerd.proxy.outbound.HttpRoute.metadata:type_name -> io.linkerd.proxy.meta.Metadata - 61, // 10: io.linkerd.proxy.outbound.HttpRoute.hosts:type_name -> io.linkerd.proxy.http_route.HostMatch - 17, // 11: io.linkerd.proxy.outbound.HttpRoute.rules:type_name -> io.linkerd.proxy.outbound.HttpRoute.Rule - 60, // 12: io.linkerd.proxy.outbound.GrpcRoute.metadata:type_name -> io.linkerd.proxy.meta.Metadata - 61, // 13: io.linkerd.proxy.outbound.GrpcRoute.hosts:type_name -> io.linkerd.proxy.http_route.HostMatch - 28, // 14: io.linkerd.proxy.outbound.GrpcRoute.rules:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Rule - 60, // 15: io.linkerd.proxy.outbound.OpaqueRoute.metadata:type_name -> io.linkerd.proxy.meta.Metadata - 38, // 16: io.linkerd.proxy.outbound.OpaqueRoute.rules:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Rule - 60, // 17: io.linkerd.proxy.outbound.TlsRoute.metadata:type_name -> io.linkerd.proxy.meta.Metadata - 62, // 18: io.linkerd.proxy.outbound.TlsRoute.snis:type_name -> io.linkerd.proxy.tls_route.SniMatch - 46, // 19: io.linkerd.proxy.outbound.TlsRoute.rules:type_name -> io.linkerd.proxy.outbound.TlsRoute.Rule - 60, // 20: io.linkerd.proxy.outbound.Backend.metadata:type_name -> io.linkerd.proxy.meta.Metadata - 63, // 21: io.linkerd.proxy.outbound.Backend.forward:type_name -> io.linkerd.proxy.destination.WeightedAddr - 55, // 22: io.linkerd.proxy.outbound.Backend.balancer:type_name -> io.linkerd.proxy.outbound.Backend.BalanceP2c + 64, // 2: io.linkerd.proxy.outbound.OutboundPolicy.metadata:type_name -> io.linkerd.proxy.meta.Metadata + 14, // 3: io.linkerd.proxy.outbound.ProxyProtocol.detect:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Detect + 15, // 4: io.linkerd.proxy.outbound.ProxyProtocol.opaque:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Opaque + 16, // 5: io.linkerd.proxy.outbound.ProxyProtocol.http1:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http1 + 17, // 6: io.linkerd.proxy.outbound.ProxyProtocol.http2:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http2 + 18, // 7: io.linkerd.proxy.outbound.ProxyProtocol.grpc:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Grpc + 19, // 8: io.linkerd.proxy.outbound.ProxyProtocol.tls:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Tls + 64, // 9: io.linkerd.proxy.outbound.HttpRoute.metadata:type_name -> io.linkerd.proxy.meta.Metadata + 65, // 10: io.linkerd.proxy.outbound.HttpRoute.hosts:type_name -> io.linkerd.proxy.http_route.HostMatch + 20, // 11: io.linkerd.proxy.outbound.HttpRoute.rules:type_name -> io.linkerd.proxy.outbound.HttpRoute.Rule + 64, // 12: io.linkerd.proxy.outbound.GrpcRoute.metadata:type_name -> io.linkerd.proxy.meta.Metadata + 65, // 13: io.linkerd.proxy.outbound.GrpcRoute.hosts:type_name -> io.linkerd.proxy.http_route.HostMatch + 31, // 14: io.linkerd.proxy.outbound.GrpcRoute.rules:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Rule + 64, // 15: io.linkerd.proxy.outbound.OpaqueRoute.metadata:type_name -> io.linkerd.proxy.meta.Metadata + 41, // 16: io.linkerd.proxy.outbound.OpaqueRoute.rules:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Rule + 64, // 17: io.linkerd.proxy.outbound.TlsRoute.metadata:type_name -> io.linkerd.proxy.meta.Metadata + 66, // 18: io.linkerd.proxy.outbound.TlsRoute.snis:type_name -> io.linkerd.proxy.tls_route.SniMatch + 49, // 19: io.linkerd.proxy.outbound.TlsRoute.rules:type_name -> io.linkerd.proxy.outbound.TlsRoute.Rule + 64, // 20: io.linkerd.proxy.outbound.Backend.metadata:type_name -> io.linkerd.proxy.meta.Metadata + 67, // 21: io.linkerd.proxy.outbound.Backend.forward:type_name -> io.linkerd.proxy.destination.WeightedAddr + 58, // 22: io.linkerd.proxy.outbound.Backend.balancer:type_name -> io.linkerd.proxy.outbound.Backend.BalanceP2c 8, // 23: io.linkerd.proxy.outbound.Backend.queue:type_name -> io.linkerd.proxy.outbound.Queue - 64, // 24: io.linkerd.proxy.outbound.Queue.failfast_timeout:type_name -> google.protobuf.Duration - 58, // 25: io.linkerd.proxy.outbound.FailureAccrual.consecutive_failures:type_name -> io.linkerd.proxy.outbound.FailureAccrual.ConsecutiveFailures - 64, // 26: io.linkerd.proxy.outbound.ExponentialBackoff.min_backoff:type_name -> google.protobuf.Duration - 64, // 27: io.linkerd.proxy.outbound.ExponentialBackoff.max_backoff:type_name -> google.protobuf.Duration - 64, // 28: io.linkerd.proxy.outbound.ProxyProtocol.Detect.timeout:type_name -> google.protobuf.Duration - 12, // 29: io.linkerd.proxy.outbound.ProxyProtocol.Detect.opaque:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Opaque - 13, // 30: io.linkerd.proxy.outbound.ProxyProtocol.Detect.http1:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http1 - 14, // 31: io.linkerd.proxy.outbound.ProxyProtocol.Detect.http2:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http2 - 5, // 32: io.linkerd.proxy.outbound.ProxyProtocol.Opaque.routes:type_name -> io.linkerd.proxy.outbound.OpaqueRoute - 3, // 33: io.linkerd.proxy.outbound.ProxyProtocol.Http1.routes:type_name -> io.linkerd.proxy.outbound.HttpRoute - 9, // 34: io.linkerd.proxy.outbound.ProxyProtocol.Http1.failure_accrual:type_name -> io.linkerd.proxy.outbound.FailureAccrual - 3, // 35: io.linkerd.proxy.outbound.ProxyProtocol.Http2.routes:type_name -> io.linkerd.proxy.outbound.HttpRoute - 9, // 36: io.linkerd.proxy.outbound.ProxyProtocol.Http2.failure_accrual:type_name -> io.linkerd.proxy.outbound.FailureAccrual - 4, // 37: io.linkerd.proxy.outbound.ProxyProtocol.Grpc.routes:type_name -> io.linkerd.proxy.outbound.GrpcRoute - 9, // 38: io.linkerd.proxy.outbound.ProxyProtocol.Grpc.failure_accrual:type_name -> io.linkerd.proxy.outbound.FailureAccrual - 6, // 39: io.linkerd.proxy.outbound.ProxyProtocol.Tls.routes:type_name -> io.linkerd.proxy.outbound.TlsRoute - 65, // 40: io.linkerd.proxy.outbound.HttpRoute.Rule.matches:type_name -> io.linkerd.proxy.http_route.HttpRouteMatch - 18, // 41: io.linkerd.proxy.outbound.HttpRoute.Rule.filters:type_name -> io.linkerd.proxy.outbound.HttpRoute.Filter - 19, // 42: io.linkerd.proxy.outbound.HttpRoute.Rule.backends:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution - 64, // 43: io.linkerd.proxy.outbound.HttpRoute.Rule.requestTimeout:type_name -> google.protobuf.Duration - 66, // 44: io.linkerd.proxy.outbound.HttpRoute.Rule.timeouts:type_name -> io.linkerd.proxy.http_route.Timeouts - 20, // 45: io.linkerd.proxy.outbound.HttpRoute.Rule.retry:type_name -> io.linkerd.proxy.outbound.HttpRoute.Retry - 67, // 46: io.linkerd.proxy.outbound.HttpRoute.Filter.failure_injector:type_name -> io.linkerd.proxy.http_route.HttpFailureInjector - 68, // 47: io.linkerd.proxy.outbound.HttpRoute.Filter.request_header_modifier:type_name -> io.linkerd.proxy.http_route.RequestHeaderModifier - 69, // 48: io.linkerd.proxy.outbound.HttpRoute.Filter.redirect:type_name -> io.linkerd.proxy.http_route.RequestRedirect - 70, // 49: io.linkerd.proxy.outbound.HttpRoute.Filter.response_header_modifier:type_name -> io.linkerd.proxy.http_route.ResponseHeaderModifier - 23, // 50: io.linkerd.proxy.outbound.HttpRoute.Distribution.empty:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution.Empty - 24, // 51: io.linkerd.proxy.outbound.HttpRoute.Distribution.first_available:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution.FirstAvailable - 25, // 52: io.linkerd.proxy.outbound.HttpRoute.Distribution.random_available:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution.RandomAvailable - 26, // 53: io.linkerd.proxy.outbound.HttpRoute.Retry.conditions:type_name -> io.linkerd.proxy.outbound.HttpRoute.Retry.Conditions - 64, // 54: io.linkerd.proxy.outbound.HttpRoute.Retry.timeout:type_name -> google.protobuf.Duration - 10, // 55: io.linkerd.proxy.outbound.HttpRoute.Retry.backoff:type_name -> io.linkerd.proxy.outbound.ExponentialBackoff - 7, // 56: io.linkerd.proxy.outbound.HttpRoute.RouteBackend.backend:type_name -> io.linkerd.proxy.outbound.Backend - 18, // 57: io.linkerd.proxy.outbound.HttpRoute.RouteBackend.filters:type_name -> io.linkerd.proxy.outbound.HttpRoute.Filter - 64, // 58: io.linkerd.proxy.outbound.HttpRoute.RouteBackend.requestTimeout:type_name -> google.protobuf.Duration - 21, // 59: io.linkerd.proxy.outbound.HttpRoute.WeightedRouteBackend.backend:type_name -> io.linkerd.proxy.outbound.HttpRoute.RouteBackend - 21, // 60: io.linkerd.proxy.outbound.HttpRoute.Distribution.FirstAvailable.backends:type_name -> io.linkerd.proxy.outbound.HttpRoute.RouteBackend - 22, // 61: io.linkerd.proxy.outbound.HttpRoute.Distribution.RandomAvailable.backends:type_name -> io.linkerd.proxy.outbound.HttpRoute.WeightedRouteBackend - 27, // 62: io.linkerd.proxy.outbound.HttpRoute.Retry.Conditions.status_ranges:type_name -> io.linkerd.proxy.outbound.HttpRoute.Retry.Conditions.StatusRange - 71, // 63: io.linkerd.proxy.outbound.GrpcRoute.Rule.matches:type_name -> io.linkerd.proxy.grpc_route.GrpcRouteMatch - 29, // 64: io.linkerd.proxy.outbound.GrpcRoute.Rule.filters:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Filter - 30, // 65: io.linkerd.proxy.outbound.GrpcRoute.Rule.backends:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution - 64, // 66: io.linkerd.proxy.outbound.GrpcRoute.Rule.requestTimeout:type_name -> google.protobuf.Duration - 66, // 67: io.linkerd.proxy.outbound.GrpcRoute.Rule.timeouts:type_name -> io.linkerd.proxy.http_route.Timeouts - 31, // 68: io.linkerd.proxy.outbound.GrpcRoute.Rule.retry:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Retry - 72, // 69: io.linkerd.proxy.outbound.GrpcRoute.Filter.failure_injector:type_name -> io.linkerd.proxy.grpc_route.GrpcFailureInjector - 68, // 70: io.linkerd.proxy.outbound.GrpcRoute.Filter.request_header_modifier:type_name -> io.linkerd.proxy.http_route.RequestHeaderModifier - 34, // 71: io.linkerd.proxy.outbound.GrpcRoute.Distribution.empty:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution.Empty - 35, // 72: io.linkerd.proxy.outbound.GrpcRoute.Distribution.first_available:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution.FirstAvailable - 36, // 73: io.linkerd.proxy.outbound.GrpcRoute.Distribution.random_available:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution.RandomAvailable - 37, // 74: io.linkerd.proxy.outbound.GrpcRoute.Retry.conditions:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Retry.Conditions - 64, // 75: io.linkerd.proxy.outbound.GrpcRoute.Retry.timeout:type_name -> google.protobuf.Duration - 10, // 76: io.linkerd.proxy.outbound.GrpcRoute.Retry.backoff:type_name -> io.linkerd.proxy.outbound.ExponentialBackoff - 7, // 77: io.linkerd.proxy.outbound.GrpcRoute.RouteBackend.backend:type_name -> io.linkerd.proxy.outbound.Backend - 29, // 78: io.linkerd.proxy.outbound.GrpcRoute.RouteBackend.filters:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Filter - 64, // 79: io.linkerd.proxy.outbound.GrpcRoute.RouteBackend.requestTimeout:type_name -> google.protobuf.Duration - 32, // 80: io.linkerd.proxy.outbound.GrpcRoute.WeightedRouteBackend.backend:type_name -> io.linkerd.proxy.outbound.GrpcRoute.RouteBackend - 32, // 81: io.linkerd.proxy.outbound.GrpcRoute.Distribution.FirstAvailable.backends:type_name -> io.linkerd.proxy.outbound.GrpcRoute.RouteBackend - 33, // 82: io.linkerd.proxy.outbound.GrpcRoute.Distribution.RandomAvailable.backends:type_name -> io.linkerd.proxy.outbound.GrpcRoute.WeightedRouteBackend - 40, // 83: io.linkerd.proxy.outbound.OpaqueRoute.Rule.backends:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution - 39, // 84: io.linkerd.proxy.outbound.OpaqueRoute.Rule.filters:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Filter - 73, // 85: io.linkerd.proxy.outbound.OpaqueRoute.Filter.invalid:type_name -> io.linkerd.proxy.opaque_route.Invalid - 74, // 86: io.linkerd.proxy.outbound.OpaqueRoute.Filter.forbidden:type_name -> io.linkerd.proxy.opaque_route.Forbidden - 43, // 87: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.empty:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution.Empty - 44, // 88: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.first_available:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution.FirstAvailable - 45, // 89: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.random_available:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution.RandomAvailable - 7, // 90: io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend.backend:type_name -> io.linkerd.proxy.outbound.Backend - 39, // 91: io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend.filters:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Filter - 41, // 92: io.linkerd.proxy.outbound.OpaqueRoute.WeightedRouteBackend.backend:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend - 41, // 93: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.FirstAvailable.backends:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend - 42, // 94: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.RandomAvailable.backends:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.WeightedRouteBackend - 48, // 95: io.linkerd.proxy.outbound.TlsRoute.Rule.backends:type_name -> io.linkerd.proxy.outbound.TlsRoute.Distribution - 47, // 96: io.linkerd.proxy.outbound.TlsRoute.Rule.filters:type_name -> io.linkerd.proxy.outbound.TlsRoute.Filter - 73, // 97: io.linkerd.proxy.outbound.TlsRoute.Filter.invalid:type_name -> io.linkerd.proxy.opaque_route.Invalid - 74, // 98: io.linkerd.proxy.outbound.TlsRoute.Filter.forbidden:type_name -> io.linkerd.proxy.opaque_route.Forbidden - 51, // 99: io.linkerd.proxy.outbound.TlsRoute.Distribution.empty:type_name -> io.linkerd.proxy.outbound.TlsRoute.Distribution.Empty - 52, // 100: io.linkerd.proxy.outbound.TlsRoute.Distribution.first_available:type_name -> io.linkerd.proxy.outbound.TlsRoute.Distribution.FirstAvailable - 53, // 101: io.linkerd.proxy.outbound.TlsRoute.Distribution.random_available:type_name -> io.linkerd.proxy.outbound.TlsRoute.Distribution.RandomAvailable - 7, // 102: io.linkerd.proxy.outbound.TlsRoute.RouteBackend.backend:type_name -> io.linkerd.proxy.outbound.Backend - 47, // 103: io.linkerd.proxy.outbound.TlsRoute.RouteBackend.filters:type_name -> io.linkerd.proxy.outbound.TlsRoute.Filter - 49, // 104: io.linkerd.proxy.outbound.TlsRoute.WeightedRouteBackend.backend:type_name -> io.linkerd.proxy.outbound.TlsRoute.RouteBackend - 49, // 105: io.linkerd.proxy.outbound.TlsRoute.Distribution.FirstAvailable.backends:type_name -> io.linkerd.proxy.outbound.TlsRoute.RouteBackend - 50, // 106: io.linkerd.proxy.outbound.TlsRoute.Distribution.RandomAvailable.backends:type_name -> io.linkerd.proxy.outbound.TlsRoute.WeightedRouteBackend - 56, // 107: io.linkerd.proxy.outbound.Backend.EndpointDiscovery.dst:type_name -> io.linkerd.proxy.outbound.Backend.EndpointDiscovery.DestinationGet - 54, // 108: io.linkerd.proxy.outbound.Backend.BalanceP2c.discovery:type_name -> io.linkerd.proxy.outbound.Backend.EndpointDiscovery - 57, // 109: io.linkerd.proxy.outbound.Backend.BalanceP2c.peak_ewma:type_name -> io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma - 64, // 110: io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma.default_rtt:type_name -> google.protobuf.Duration - 64, // 111: io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma.decay:type_name -> google.protobuf.Duration - 10, // 112: io.linkerd.proxy.outbound.FailureAccrual.ConsecutiveFailures.backoff:type_name -> io.linkerd.proxy.outbound.ExponentialBackoff - 0, // 113: io.linkerd.proxy.outbound.OutboundPolicies.Get:input_type -> io.linkerd.proxy.outbound.TrafficSpec - 0, // 114: io.linkerd.proxy.outbound.OutboundPolicies.Watch:input_type -> io.linkerd.proxy.outbound.TrafficSpec - 1, // 115: io.linkerd.proxy.outbound.OutboundPolicies.Get:output_type -> io.linkerd.proxy.outbound.OutboundPolicy - 1, // 116: io.linkerd.proxy.outbound.OutboundPolicies.Watch:output_type -> io.linkerd.proxy.outbound.OutboundPolicy - 115, // [115:117] is the sub-list for method output_type - 113, // [113:115] is the sub-list for method input_type - 113, // [113:113] is the sub-list for extension type_name - 113, // [113:113] is the sub-list for extension extendee - 0, // [0:113] is the sub-list for field type_name + 68, // 24: io.linkerd.proxy.outbound.Queue.failfast_timeout:type_name -> google.protobuf.Duration + 61, // 25: io.linkerd.proxy.outbound.FailureAccrual.consecutive_failures:type_name -> io.linkerd.proxy.outbound.FailureAccrual.ConsecutiveFailures + 62, // 26: io.linkerd.proxy.outbound.FailureAccrual.success_rate:type_name -> io.linkerd.proxy.outbound.FailureAccrual.SuccessRate + 68, // 27: io.linkerd.proxy.outbound.LoadBiasConfig.penalty:type_name -> google.protobuf.Duration + 68, // 28: io.linkerd.proxy.outbound.LoadBiasConfig.penalty_decay:type_name -> google.protobuf.Duration + 68, // 29: io.linkerd.proxy.outbound.RetryAfterConfig.max_duration:type_name -> google.protobuf.Duration + 68, // 30: io.linkerd.proxy.outbound.ExponentialBackoff.min_backoff:type_name -> google.protobuf.Duration + 68, // 31: io.linkerd.proxy.outbound.ExponentialBackoff.max_backoff:type_name -> google.protobuf.Duration + 68, // 32: io.linkerd.proxy.outbound.ProxyProtocol.Detect.timeout:type_name -> google.protobuf.Duration + 15, // 33: io.linkerd.proxy.outbound.ProxyProtocol.Detect.opaque:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Opaque + 16, // 34: io.linkerd.proxy.outbound.ProxyProtocol.Detect.http1:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http1 + 17, // 35: io.linkerd.proxy.outbound.ProxyProtocol.Detect.http2:type_name -> io.linkerd.proxy.outbound.ProxyProtocol.Http2 + 5, // 36: io.linkerd.proxy.outbound.ProxyProtocol.Opaque.routes:type_name -> io.linkerd.proxy.outbound.OpaqueRoute + 3, // 37: io.linkerd.proxy.outbound.ProxyProtocol.Http1.routes:type_name -> io.linkerd.proxy.outbound.HttpRoute + 9, // 38: io.linkerd.proxy.outbound.ProxyProtocol.Http1.failure_accrual:type_name -> io.linkerd.proxy.outbound.FailureAccrual + 10, // 39: io.linkerd.proxy.outbound.ProxyProtocol.Http1.load_bias:type_name -> io.linkerd.proxy.outbound.LoadBiasConfig + 11, // 40: io.linkerd.proxy.outbound.ProxyProtocol.Http1.retry_after:type_name -> io.linkerd.proxy.outbound.RetryAfterConfig + 3, // 41: io.linkerd.proxy.outbound.ProxyProtocol.Http2.routes:type_name -> io.linkerd.proxy.outbound.HttpRoute + 9, // 42: io.linkerd.proxy.outbound.ProxyProtocol.Http2.failure_accrual:type_name -> io.linkerd.proxy.outbound.FailureAccrual + 10, // 43: io.linkerd.proxy.outbound.ProxyProtocol.Http2.load_bias:type_name -> io.linkerd.proxy.outbound.LoadBiasConfig + 11, // 44: io.linkerd.proxy.outbound.ProxyProtocol.Http2.retry_after:type_name -> io.linkerd.proxy.outbound.RetryAfterConfig + 4, // 45: io.linkerd.proxy.outbound.ProxyProtocol.Grpc.routes:type_name -> io.linkerd.proxy.outbound.GrpcRoute + 9, // 46: io.linkerd.proxy.outbound.ProxyProtocol.Grpc.failure_accrual:type_name -> io.linkerd.proxy.outbound.FailureAccrual + 10, // 47: io.linkerd.proxy.outbound.ProxyProtocol.Grpc.load_bias:type_name -> io.linkerd.proxy.outbound.LoadBiasConfig + 11, // 48: io.linkerd.proxy.outbound.ProxyProtocol.Grpc.retry_after:type_name -> io.linkerd.proxy.outbound.RetryAfterConfig + 6, // 49: io.linkerd.proxy.outbound.ProxyProtocol.Tls.routes:type_name -> io.linkerd.proxy.outbound.TlsRoute + 69, // 50: io.linkerd.proxy.outbound.HttpRoute.Rule.matches:type_name -> io.linkerd.proxy.http_route.HttpRouteMatch + 21, // 51: io.linkerd.proxy.outbound.HttpRoute.Rule.filters:type_name -> io.linkerd.proxy.outbound.HttpRoute.Filter + 22, // 52: io.linkerd.proxy.outbound.HttpRoute.Rule.backends:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution + 68, // 53: io.linkerd.proxy.outbound.HttpRoute.Rule.requestTimeout:type_name -> google.protobuf.Duration + 70, // 54: io.linkerd.proxy.outbound.HttpRoute.Rule.timeouts:type_name -> io.linkerd.proxy.http_route.Timeouts + 23, // 55: io.linkerd.proxy.outbound.HttpRoute.Rule.retry:type_name -> io.linkerd.proxy.outbound.HttpRoute.Retry + 71, // 56: io.linkerd.proxy.outbound.HttpRoute.Filter.failure_injector:type_name -> io.linkerd.proxy.http_route.HttpFailureInjector + 72, // 57: io.linkerd.proxy.outbound.HttpRoute.Filter.request_header_modifier:type_name -> io.linkerd.proxy.http_route.RequestHeaderModifier + 73, // 58: io.linkerd.proxy.outbound.HttpRoute.Filter.redirect:type_name -> io.linkerd.proxy.http_route.RequestRedirect + 74, // 59: io.linkerd.proxy.outbound.HttpRoute.Filter.response_header_modifier:type_name -> io.linkerd.proxy.http_route.ResponseHeaderModifier + 26, // 60: io.linkerd.proxy.outbound.HttpRoute.Distribution.empty:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution.Empty + 27, // 61: io.linkerd.proxy.outbound.HttpRoute.Distribution.first_available:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution.FirstAvailable + 28, // 62: io.linkerd.proxy.outbound.HttpRoute.Distribution.random_available:type_name -> io.linkerd.proxy.outbound.HttpRoute.Distribution.RandomAvailable + 29, // 63: io.linkerd.proxy.outbound.HttpRoute.Retry.conditions:type_name -> io.linkerd.proxy.outbound.HttpRoute.Retry.Conditions + 68, // 64: io.linkerd.proxy.outbound.HttpRoute.Retry.timeout:type_name -> google.protobuf.Duration + 13, // 65: io.linkerd.proxy.outbound.HttpRoute.Retry.backoff:type_name -> io.linkerd.proxy.outbound.ExponentialBackoff + 7, // 66: io.linkerd.proxy.outbound.HttpRoute.RouteBackend.backend:type_name -> io.linkerd.proxy.outbound.Backend + 21, // 67: io.linkerd.proxy.outbound.HttpRoute.RouteBackend.filters:type_name -> io.linkerd.proxy.outbound.HttpRoute.Filter + 68, // 68: io.linkerd.proxy.outbound.HttpRoute.RouteBackend.requestTimeout:type_name -> google.protobuf.Duration + 24, // 69: io.linkerd.proxy.outbound.HttpRoute.WeightedRouteBackend.backend:type_name -> io.linkerd.proxy.outbound.HttpRoute.RouteBackend + 24, // 70: io.linkerd.proxy.outbound.HttpRoute.Distribution.FirstAvailable.backends:type_name -> io.linkerd.proxy.outbound.HttpRoute.RouteBackend + 25, // 71: io.linkerd.proxy.outbound.HttpRoute.Distribution.RandomAvailable.backends:type_name -> io.linkerd.proxy.outbound.HttpRoute.WeightedRouteBackend + 30, // 72: io.linkerd.proxy.outbound.HttpRoute.Retry.Conditions.status_ranges:type_name -> io.linkerd.proxy.outbound.HttpRoute.Retry.Conditions.StatusRange + 75, // 73: io.linkerd.proxy.outbound.GrpcRoute.Rule.matches:type_name -> io.linkerd.proxy.grpc_route.GrpcRouteMatch + 32, // 74: io.linkerd.proxy.outbound.GrpcRoute.Rule.filters:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Filter + 33, // 75: io.linkerd.proxy.outbound.GrpcRoute.Rule.backends:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution + 68, // 76: io.linkerd.proxy.outbound.GrpcRoute.Rule.requestTimeout:type_name -> google.protobuf.Duration + 70, // 77: io.linkerd.proxy.outbound.GrpcRoute.Rule.timeouts:type_name -> io.linkerd.proxy.http_route.Timeouts + 34, // 78: io.linkerd.proxy.outbound.GrpcRoute.Rule.retry:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Retry + 76, // 79: io.linkerd.proxy.outbound.GrpcRoute.Filter.failure_injector:type_name -> io.linkerd.proxy.grpc_route.GrpcFailureInjector + 72, // 80: io.linkerd.proxy.outbound.GrpcRoute.Filter.request_header_modifier:type_name -> io.linkerd.proxy.http_route.RequestHeaderModifier + 37, // 81: io.linkerd.proxy.outbound.GrpcRoute.Distribution.empty:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution.Empty + 38, // 82: io.linkerd.proxy.outbound.GrpcRoute.Distribution.first_available:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution.FirstAvailable + 39, // 83: io.linkerd.proxy.outbound.GrpcRoute.Distribution.random_available:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Distribution.RandomAvailable + 40, // 84: io.linkerd.proxy.outbound.GrpcRoute.Retry.conditions:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Retry.Conditions + 68, // 85: io.linkerd.proxy.outbound.GrpcRoute.Retry.timeout:type_name -> google.protobuf.Duration + 13, // 86: io.linkerd.proxy.outbound.GrpcRoute.Retry.backoff:type_name -> io.linkerd.proxy.outbound.ExponentialBackoff + 7, // 87: io.linkerd.proxy.outbound.GrpcRoute.RouteBackend.backend:type_name -> io.linkerd.proxy.outbound.Backend + 32, // 88: io.linkerd.proxy.outbound.GrpcRoute.RouteBackend.filters:type_name -> io.linkerd.proxy.outbound.GrpcRoute.Filter + 68, // 89: io.linkerd.proxy.outbound.GrpcRoute.RouteBackend.requestTimeout:type_name -> google.protobuf.Duration + 35, // 90: io.linkerd.proxy.outbound.GrpcRoute.WeightedRouteBackend.backend:type_name -> io.linkerd.proxy.outbound.GrpcRoute.RouteBackend + 35, // 91: io.linkerd.proxy.outbound.GrpcRoute.Distribution.FirstAvailable.backends:type_name -> io.linkerd.proxy.outbound.GrpcRoute.RouteBackend + 36, // 92: io.linkerd.proxy.outbound.GrpcRoute.Distribution.RandomAvailable.backends:type_name -> io.linkerd.proxy.outbound.GrpcRoute.WeightedRouteBackend + 43, // 93: io.linkerd.proxy.outbound.OpaqueRoute.Rule.backends:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution + 42, // 94: io.linkerd.proxy.outbound.OpaqueRoute.Rule.filters:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Filter + 77, // 95: io.linkerd.proxy.outbound.OpaqueRoute.Filter.invalid:type_name -> io.linkerd.proxy.opaque_route.Invalid + 78, // 96: io.linkerd.proxy.outbound.OpaqueRoute.Filter.forbidden:type_name -> io.linkerd.proxy.opaque_route.Forbidden + 46, // 97: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.empty:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution.Empty + 47, // 98: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.first_available:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution.FirstAvailable + 48, // 99: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.random_available:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Distribution.RandomAvailable + 7, // 100: io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend.backend:type_name -> io.linkerd.proxy.outbound.Backend + 42, // 101: io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend.filters:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.Filter + 44, // 102: io.linkerd.proxy.outbound.OpaqueRoute.WeightedRouteBackend.backend:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend + 44, // 103: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.FirstAvailable.backends:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.RouteBackend + 45, // 104: io.linkerd.proxy.outbound.OpaqueRoute.Distribution.RandomAvailable.backends:type_name -> io.linkerd.proxy.outbound.OpaqueRoute.WeightedRouteBackend + 51, // 105: io.linkerd.proxy.outbound.TlsRoute.Rule.backends:type_name -> io.linkerd.proxy.outbound.TlsRoute.Distribution + 50, // 106: io.linkerd.proxy.outbound.TlsRoute.Rule.filters:type_name -> io.linkerd.proxy.outbound.TlsRoute.Filter + 77, // 107: io.linkerd.proxy.outbound.TlsRoute.Filter.invalid:type_name -> io.linkerd.proxy.opaque_route.Invalid + 78, // 108: io.linkerd.proxy.outbound.TlsRoute.Filter.forbidden:type_name -> io.linkerd.proxy.opaque_route.Forbidden + 54, // 109: io.linkerd.proxy.outbound.TlsRoute.Distribution.empty:type_name -> io.linkerd.proxy.outbound.TlsRoute.Distribution.Empty + 55, // 110: io.linkerd.proxy.outbound.TlsRoute.Distribution.first_available:type_name -> io.linkerd.proxy.outbound.TlsRoute.Distribution.FirstAvailable + 56, // 111: io.linkerd.proxy.outbound.TlsRoute.Distribution.random_available:type_name -> io.linkerd.proxy.outbound.TlsRoute.Distribution.RandomAvailable + 7, // 112: io.linkerd.proxy.outbound.TlsRoute.RouteBackend.backend:type_name -> io.linkerd.proxy.outbound.Backend + 50, // 113: io.linkerd.proxy.outbound.TlsRoute.RouteBackend.filters:type_name -> io.linkerd.proxy.outbound.TlsRoute.Filter + 52, // 114: io.linkerd.proxy.outbound.TlsRoute.WeightedRouteBackend.backend:type_name -> io.linkerd.proxy.outbound.TlsRoute.RouteBackend + 52, // 115: io.linkerd.proxy.outbound.TlsRoute.Distribution.FirstAvailable.backends:type_name -> io.linkerd.proxy.outbound.TlsRoute.RouteBackend + 53, // 116: io.linkerd.proxy.outbound.TlsRoute.Distribution.RandomAvailable.backends:type_name -> io.linkerd.proxy.outbound.TlsRoute.WeightedRouteBackend + 59, // 117: io.linkerd.proxy.outbound.Backend.EndpointDiscovery.dst:type_name -> io.linkerd.proxy.outbound.Backend.EndpointDiscovery.DestinationGet + 57, // 118: io.linkerd.proxy.outbound.Backend.BalanceP2c.discovery:type_name -> io.linkerd.proxy.outbound.Backend.EndpointDiscovery + 60, // 119: io.linkerd.proxy.outbound.Backend.BalanceP2c.peak_ewma:type_name -> io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma + 12, // 120: io.linkerd.proxy.outbound.Backend.BalanceP2c.ejection:type_name -> io.linkerd.proxy.outbound.EjectionConfig + 68, // 121: io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma.default_rtt:type_name -> google.protobuf.Duration + 68, // 122: io.linkerd.proxy.outbound.Backend.BalanceP2c.PeakEwma.decay:type_name -> google.protobuf.Duration + 13, // 123: io.linkerd.proxy.outbound.FailureAccrual.ConsecutiveFailures.backoff:type_name -> io.linkerd.proxy.outbound.ExponentialBackoff + 68, // 124: io.linkerd.proxy.outbound.FailureAccrual.SuccessRate.decay:type_name -> google.protobuf.Duration + 0, // 125: io.linkerd.proxy.outbound.OutboundPolicies.Get:input_type -> io.linkerd.proxy.outbound.TrafficSpec + 0, // 126: io.linkerd.proxy.outbound.OutboundPolicies.Watch:input_type -> io.linkerd.proxy.outbound.TrafficSpec + 1, // 127: io.linkerd.proxy.outbound.OutboundPolicies.Get:output_type -> io.linkerd.proxy.outbound.OutboundPolicy + 1, // 128: io.linkerd.proxy.outbound.OutboundPolicies.Watch:output_type -> io.linkerd.proxy.outbound.OutboundPolicy + 127, // [127:129] is the sub-list for method output_type + 125, // [125:127] is the sub-list for method input_type + 125, // [125:125] is the sub-list for extension type_name + 125, // [125:125] is the sub-list for extension extendee + 0, // [0:125] is the sub-list for field type_name } func init() { file_outbound_proto_init() } @@ -4272,51 +4604,48 @@ func file_outbound_proto_init() { (*Backend_Forward)(nil), (*Backend_Balancer)(nil), } - file_outbound_proto_msgTypes[9].OneofWrappers = []any{ - (*FailureAccrual_ConsecutiveFailures_)(nil), - } - file_outbound_proto_msgTypes[18].OneofWrappers = []any{ + file_outbound_proto_msgTypes[21].OneofWrappers = []any{ (*HttpRoute_Filter_FailureInjector)(nil), (*HttpRoute_Filter_RequestHeaderModifier)(nil), (*HttpRoute_Filter_Redirect)(nil), (*HttpRoute_Filter_ResponseHeaderModifier)(nil), } - file_outbound_proto_msgTypes[19].OneofWrappers = []any{ + file_outbound_proto_msgTypes[22].OneofWrappers = []any{ (*HttpRoute_Distribution_Empty_)(nil), (*HttpRoute_Distribution_FirstAvailable_)(nil), (*HttpRoute_Distribution_RandomAvailable_)(nil), } - file_outbound_proto_msgTypes[29].OneofWrappers = []any{ + file_outbound_proto_msgTypes[32].OneofWrappers = []any{ (*GrpcRoute_Filter_FailureInjector)(nil), (*GrpcRoute_Filter_RequestHeaderModifier)(nil), } - file_outbound_proto_msgTypes[30].OneofWrappers = []any{ + file_outbound_proto_msgTypes[33].OneofWrappers = []any{ (*GrpcRoute_Distribution_Empty_)(nil), (*GrpcRoute_Distribution_FirstAvailable_)(nil), (*GrpcRoute_Distribution_RandomAvailable_)(nil), } - file_outbound_proto_msgTypes[39].OneofWrappers = []any{ + file_outbound_proto_msgTypes[42].OneofWrappers = []any{ (*OpaqueRoute_Filter_Invalid)(nil), (*OpaqueRoute_Filter_Forbidden)(nil), } - file_outbound_proto_msgTypes[40].OneofWrappers = []any{ + file_outbound_proto_msgTypes[43].OneofWrappers = []any{ (*OpaqueRoute_Distribution_Empty_)(nil), (*OpaqueRoute_Distribution_FirstAvailable_)(nil), (*OpaqueRoute_Distribution_RandomAvailable_)(nil), } - file_outbound_proto_msgTypes[47].OneofWrappers = []any{ + file_outbound_proto_msgTypes[50].OneofWrappers = []any{ (*TlsRoute_Filter_Invalid)(nil), (*TlsRoute_Filter_Forbidden)(nil), } - file_outbound_proto_msgTypes[48].OneofWrappers = []any{ + file_outbound_proto_msgTypes[51].OneofWrappers = []any{ (*TlsRoute_Distribution_Empty_)(nil), (*TlsRoute_Distribution_FirstAvailable_)(nil), (*TlsRoute_Distribution_RandomAvailable_)(nil), } - file_outbound_proto_msgTypes[54].OneofWrappers = []any{ + file_outbound_proto_msgTypes[57].OneofWrappers = []any{ (*Backend_EndpointDiscovery_Dst)(nil), } - file_outbound_proto_msgTypes[55].OneofWrappers = []any{ + file_outbound_proto_msgTypes[58].OneofWrappers = []any{ (*Backend_BalanceP2C_PeakEwma_)(nil), } type x struct{} @@ -4325,7 +4654,7 @@ func file_outbound_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_outbound_proto_rawDesc), len(file_outbound_proto_rawDesc)), NumEnums: 0, - NumMessages: 59, + NumMessages: 63, NumExtensions: 0, NumServices: 1, }, diff --git a/go/outbound/outbound_grpc.pb.go b/go/outbound/outbound_grpc.pb.go index cfe134ab7..657b522ef 100644 --- a/go/outbound/outbound_grpc.pb.go +++ b/go/outbound/outbound_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 -// - protoc v6.30.2 +// - protoc-gen-go-grpc v1.6.1 +// - protoc v4.25.9 // source: outbound.proto package outbound @@ -85,10 +85,10 @@ type OutboundPoliciesServer interface { type UnimplementedOutboundPoliciesServer struct{} func (UnimplementedOutboundPoliciesServer) Get(context.Context, *TrafficSpec) (*OutboundPolicy, error) { - return nil, status.Errorf(codes.Unimplemented, "method Get not implemented") + return nil, status.Error(codes.Unimplemented, "method Get not implemented") } func (UnimplementedOutboundPoliciesServer) Watch(*TrafficSpec, grpc.ServerStreamingServer[OutboundPolicy]) error { - return status.Errorf(codes.Unimplemented, "method Watch not implemented") + return status.Error(codes.Unimplemented, "method Watch not implemented") } func (UnimplementedOutboundPoliciesServer) mustEmbedUnimplementedOutboundPoliciesServer() {} func (UnimplementedOutboundPoliciesServer) testEmbeddedByValue() {} @@ -101,7 +101,7 @@ type UnsafeOutboundPoliciesServer interface { } func RegisterOutboundPoliciesServer(s grpc.ServiceRegistrar, srv OutboundPoliciesServer) { - // If the following call pancis, it indicates UnimplementedOutboundPoliciesServer was + // If the following call panics, it indicates UnimplementedOutboundPoliciesServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. diff --git a/go/tap/tap.pb.go b/go/tap/tap.pb.go index 6ed24424a..fd0cd9fe8 100644 --- a/go/tap/tap.pb.go +++ b/go/tap/tap.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: tap.proto package tap diff --git a/go/tap/tap_grpc.pb.go b/go/tap/tap_grpc.pb.go index edc9c8ce6..a9452f01c 100644 --- a/go/tap/tap_grpc.pb.go +++ b/go/tap/tap_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 -// - protoc v6.30.2 +// - protoc-gen-go-grpc v1.6.1 +// - protoc v4.25.9 // source: tap.proto package tap @@ -76,7 +76,7 @@ type TapServer interface { type UnimplementedTapServer struct{} func (UnimplementedTapServer) Observe(*ObserveRequest, grpc.ServerStreamingServer[TapEvent]) error { - return status.Errorf(codes.Unimplemented, "method Observe not implemented") + return status.Error(codes.Unimplemented, "method Observe not implemented") } func (UnimplementedTapServer) mustEmbedUnimplementedTapServer() {} func (UnimplementedTapServer) testEmbeddedByValue() {} @@ -89,7 +89,7 @@ type UnsafeTapServer interface { } func RegisterTapServer(s grpc.ServiceRegistrar, srv TapServer) { - // If the following call pancis, it indicates UnimplementedTapServer was + // If the following call panics, it indicates UnimplementedTapServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. diff --git a/go/tls_route/tls_route.pb.go b/go/tls_route/tls_route.pb.go index f71f2eee8..38cfac0e2 100644 --- a/go/tls_route/tls_route.pb.go +++ b/go/tls_route/tls_route.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.36.10 -// protoc v6.30.2 +// protoc-gen-go v1.36.11 +// protoc v4.25.9 // source: tls_route.proto package tls_route diff --git a/src/gen/io.linkerd.proxy.outbound.rs b/src/gen/io.linkerd.proxy.outbound.rs index b3103bfbb..7adedfac2 100644 --- a/src/gen/io.linkerd.proxy.outbound.rs +++ b/src/gen/io.linkerd.proxy.outbound.rs @@ -67,6 +67,12 @@ pub mod proxy_protocol { /// If empty, circuit breaking is not performed. #[prost(message, optional, tag = "2")] pub failure_accrual: ::core::option::Option, + /// If set, configures load biasing for 429-aware load balancing. + #[prost(message, optional, tag = "3")] + pub load_bias: ::core::option::Option, + /// If set, configures handling of Retry-After headers (HTTP 429/503). + #[prost(message, optional, tag = "4")] + pub retry_after: ::core::option::Option, } #[derive(Clone, PartialEq, ::prost::Message)] pub struct Http2 { @@ -75,6 +81,12 @@ pub mod proxy_protocol { /// If empty, circuit breaking is not performed. #[prost(message, optional, tag = "2")] pub failure_accrual: ::core::option::Option, + /// If set, configures load biasing for 429-aware load balancing. + #[prost(message, optional, tag = "3")] + pub load_bias: ::core::option::Option, + /// If set, configures handling of Retry-After headers (HTTP 429/503). + #[prost(message, optional, tag = "4")] + pub retry_after: ::core::option::Option, } #[derive(Clone, PartialEq, ::prost::Message)] pub struct Grpc { @@ -83,6 +95,13 @@ pub mod proxy_protocol { /// If empty, circuit breaking is not performed. #[prost(message, optional, tag = "2")] pub failure_accrual: ::core::option::Option, + /// If set, configures load biasing for 429-aware load balancing. + #[prost(message, optional, tag = "3")] + pub load_bias: ::core::option::Option, + /// If set, configures handling of Retry-After headers (HTTP 429/503) + /// and grpc-retry-pushback-ms trailers (gRPC RESOURCE_EXHAUSTED). + #[prost(message, optional, tag = "4")] + pub retry_after: ::core::option::Option, } #[derive(Clone, PartialEq, ::prost::Message)] pub struct Tls { @@ -579,6 +598,10 @@ pub mod backend { pub struct BalanceP2c { #[prost(message, optional, tag = "1")] pub discovery: ::core::option::Option, + /// Ejection protection for the pool. When set, prevents circuit + /// breakers from ejecting endpoints below the configured floor. + #[prost(message, optional, tag = "3")] + pub ejection: ::core::option::Option, /// The load estimation strategy used by this load balancer. #[prost(oneof = "balance_p2c::Load", tags = "2")] pub load: ::core::option::Option, @@ -626,26 +649,89 @@ pub struct Queue { #[prost(message, optional, tag = "2")] pub failfast_timeout: ::core::option::Option<::prost_types::Duration>, } +/// Configures failure accrual policies for circuit breaking. +/// Setting a numeric policy field to zero disables that policy. #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct FailureAccrual { - #[prost(oneof = "failure_accrual::Kind", tags = "1")] - pub kind: ::core::option::Option, + /// Must be set. Set `max_failures` to 0 to disable the consecutive + /// failure policy while retaining the shared backoff. + #[prost(message, optional, tag = "1")] + pub consecutive_failures: ::core::option::Option< + failure_accrual::ConsecutiveFailures, + >, + /// Success rate policy. If set, the circuit trips when the EWMA success + /// rate drops below the threshold. + #[prost(message, optional, tag = "2")] + pub success_rate: ::core::option::Option, } /// Nested message and enum types in `FailureAccrual`. pub mod failure_accrual { #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ConsecutiveFailures { + /// Maximum consecutive failures before the circuit trips. + /// Set to 0 to disable (an unset field has the same effect). #[prost(uint32, tag = "1")] pub max_failures: u32, + /// Must be set. Controls the ejection duration before probe requests + /// are allowed after any policy (not just CF) trips the circuit. #[prost(message, optional, tag = "2")] pub backoff: ::core::option::Option, } - #[derive(Clone, Copy, PartialEq, ::prost::Oneof)] - pub enum Kind { - #[prost(message, tag = "1")] - ConsecutiveFailures(ConsecutiveFailures), + #[derive(Clone, Copy, PartialEq, ::prost::Message)] + pub struct SuccessRate { + /// Success rate threshold in \[0.0, 1.0\]. The circuit trips when the + /// EWMA success rate drops below this value. Set to 0.0 to disable. + /// Defined as `double` (not `float`) because this value is compared + /// against the proxy's f64 EWMA on every request. + #[prost(double, tag = "1")] + pub threshold: f64, + /// EWMA decay window for success rate tracking. + #[prost(message, optional, tag = "2")] + pub decay: ::core::option::Option<::prost_types::Duration>, + /// Minimum requests before the success rate policy can trip (cold-start guard). + #[prost(uint32, tag = "3")] + pub min_requests: u32, } } +/// Configures load biasing for 429-aware load balancing. +/// When enabled, the load balancer injects artificial penalties on +/// rate-limited endpoints, causing P2C to prefer other endpoints. +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] +pub struct LoadBiasConfig { + /// Whether load biasing is enabled. When the message is present + /// but `enabled` is false, biasing is inactive. + #[prost(bool, tag = "1")] + pub enabled: bool, + /// The penalty duration to inject when a 429 response is received. + #[prost(message, optional, tag = "2")] + pub penalty: ::core::option::Option<::prost_types::Duration>, + /// The EWMA decay window for the penalty. + #[prost(message, optional, tag = "3")] + pub penalty_decay: ::core::option::Option<::prost_types::Duration>, +} +/// Configures handling of rate-limiting hints: Retry-After headers +/// (HTTP 429/503) and grpc-retry-pushback-ms trailers (gRPC +/// RESOURCE_EXHAUSTED). The proxy uses the parsed duration to extend +/// circuit breaker backoff and amplify load biaser penalties. +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] +pub struct RetryAfterConfig { + /// Maximum duration the proxy will honor from either hint source. + /// Values exceeding this cap are clamped. When absent, the proxy + /// uses DEFAULT_RETRY_AFTER_MAX_DURATION as the cap. + #[prost(message, optional, tag = "1")] + pub max_duration: ::core::option::Option<::prost_types::Duration>, +} +/// Pool-level ejection protection. Prevents circuit breakers from +/// ejecting all endpoints in a load-balancing pool. +/// +/// Additional ejection parameters may follow in future fields. +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] +pub struct EjectionConfig { + /// Minimum number of endpoints that must remain unejected. + /// When set to 0 (or absent), ejection protection is disabled. + #[prost(uint32, tag = "1")] + pub min_ready_endpoints: u32, +} #[derive(Clone, Copy, PartialEq, ::prost::Message)] pub struct ExponentialBackoff { /// The minimum amount of time to wait before resuming an operation.