Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -1521,9 +1521,9 @@ dependencies = [

[[package]]
name = "linkerd2-proxy-api"
version = "0.18.0"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ba9e3b341ca4992feaf43a4d2bdbfe2081aa3e2b9a503753544ce55242af6342"
checksum = "e0cd682795e8f91ea36e2131a2f7021da136c74f6d3cd3d9eabbf7842511042d"
dependencies = [
"http",
"ipnet",
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,5 @@ path = "./policy-controller/runtime"
default-features = false

[workspace.dependencies.linkerd2-proxy-api]
version = "0.18.0"
version = "0.19.0"
features = ["inbound", "outbound"]
17 changes: 17 additions & 0 deletions policy-controller/core/src/outbound.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,23 @@ pub struct Backoff {
pub jitter: f32,
}

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct LoadBiasConfig {
pub enabled: bool,
pub penalty: time::Duration,
pub penalty_decay: time::Duration,
}

pub const DEFAULT_LOAD_BIAS_PENALTY: time::Duration = time::Duration::from_secs(5);
pub const DEFAULT_LOAD_BIAS_PENALTY_DECAY: time::Duration = time::Duration::from_secs(10);

pub const DEFAULT_RETRY_AFTER_MAX_DURATION: time::Duration = time::Duration::from_secs(300);

#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct RetryAfterConfig {
pub max_duration: time::Duration,
}

#[derive(Clone, Debug, PartialEq, Eq)]
pub enum Filter {
RequestHeaderModifier(HeaderModifierFilter),
Expand Down
5 changes: 4 additions & 1 deletion policy-controller/core/src/outbound/policy.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use super::{
AppProtocol, FailureAccrual, GrpcRetryCondition, GrpcRoute, HttpRetryCondition, HttpRoute,
RouteRetry, RouteSet, RouteTimeouts, TcpRoute, TlsRoute, TrafficPolicy,
LoadBiasConfig, RetryAfterConfig, RouteRetry, RouteSet, RouteTimeouts, TcpRoute, TlsRoute,
TrafficPolicy,
};

use std::num::NonZeroU16;
Expand Down Expand Up @@ -31,6 +32,8 @@ pub struct OutboundPolicy {
pub port: NonZeroU16,
pub app_protocol: Option<AppProtocol>,
pub accrual: Option<FailureAccrual>,
pub load_bias: Option<LoadBiasConfig>,
pub retry_after: Option<RetryAfterConfig>,
pub http_retry: Option<RouteRetry<HttpRetryCondition>>,
pub grpc_retry: Option<RouteRetry<GrpcRetryCondition>>,
pub timeouts: RouteTimeouts,
Expand Down
57 changes: 42 additions & 15 deletions policy-controller/grpc/src/outbound.rs
Original file line number Diff line number Diff line change
Expand Up @@ -402,10 +402,14 @@ fn fallback(original_dst: SocketAddr) -> outbound::OutboundPolicy {
http1: Some(outbound::proxy_protocol::Http1 {
routes: http_routes.clone(),
failure_accrual: None,
load_bias: None,
retry_after: None,
}),
http2: Some(outbound::proxy_protocol::Http2 {
routes: http_routes,
failure_accrual: None,
load_bias: None,
retry_after: None,
}),
},
)),
Expand Down Expand Up @@ -472,22 +476,32 @@ fn to_proto(
) -> outbound::OutboundPolicy {
let backend: outbound::Backend = default_backend(&policy, original_dst);

let accrual = policy.accrual.map(|accrual| outbound::FailureAccrual {
kind: Some(match accrual {
linkerd_policy_controller_core::outbound::FailureAccrual::Consecutive {
let accrual = policy.accrual.map(|accrual| {
let linkerd_policy_controller_core::outbound::FailureAccrual::Consecutive {
max_failures,
backoff,
} = accrual;
outbound::FailureAccrual {
consecutive_failures: Some(outbound::failure_accrual::ConsecutiveFailures {
max_failures,
backoff,
} => outbound::failure_accrual::Kind::ConsecutiveFailures(
outbound::failure_accrual::ConsecutiveFailures {
max_failures,
backoff: Some(outbound::ExponentialBackoff {
min_backoff: convert_duration("min_backoff", backoff.min_penalty),
max_backoff: convert_duration("max_backoff", backoff.max_penalty),
jitter_ratio: backoff.jitter,
}),
},
),
}),
backoff: Some(outbound::ExponentialBackoff {
min_backoff: convert_duration("min_backoff", backoff.min_penalty),
max_backoff: convert_duration("max_backoff", backoff.max_penalty),
jitter_ratio: backoff.jitter,
}),
}),
success_rate: None,
}
});

let load_bias = policy.load_bias.map(|lb| outbound::LoadBiasConfig {
enabled: lb.enabled,
penalty: convert_duration("load_bias_penalty", lb.penalty),
penalty_decay: convert_duration("load_bias_penalty_decay", lb.penalty_decay),
});

let retry_after = policy.retry_after.map(|ra| outbound::RetryAfterConfig {
max_duration: convert_duration("retry_after_max_duration", ra.max_duration),
});

let mut http_routes = policy.http_routes.clone().into_iter().collect::<Vec<_>>();
Expand All @@ -499,6 +513,8 @@ fn to_proto(
backend,
http_routes.into_iter(),
accrual,
load_bias,
retry_after,
policy.http_retry.clone(),
policy.timeouts.clone(),
allow_l5d_request_headers,
Expand All @@ -515,6 +531,8 @@ fn to_proto(
backend,
grpc_routes.into_iter(),
accrual,
load_bias,
retry_after,
policy.grpc_retry.clone(),
policy.timeouts.clone(),
allow_l5d_request_headers,
Expand All @@ -527,6 +545,8 @@ fn to_proto(
backend,
http_routes.into_iter(),
accrual,
load_bias,
retry_after,
policy.http_retry.clone(),
policy.timeouts.clone(),
allow_l5d_request_headers,
Expand Down Expand Up @@ -567,6 +587,8 @@ fn to_proto(
backend,
grpc_routes.into_iter(),
accrual,
load_bias,
retry_after,
policy.grpc_retry.clone(),
policy.timeouts.clone(),
allow_l5d_request_headers,
Expand All @@ -579,6 +601,8 @@ fn to_proto(
backend,
http_routes.into_iter(),
accrual,
load_bias,
retry_after,
policy.http_retry.clone(),
policy.timeouts.clone(),
allow_l5d_request_headers,
Expand Down Expand Up @@ -607,6 +631,8 @@ fn to_proto(
backend,
http_routes.into_iter(),
accrual,
load_bias,
retry_after,
policy.http_retry.clone(),
policy.timeouts.clone(),
allow_l5d_request_headers,
Expand Down Expand Up @@ -690,6 +716,7 @@ fn default_backend(policy: &OutboundPolicy, original_dst: Option<SocketAddr>) ->
)),
}),
load: Some(default_balancer_config()),
ejection: None,
},
)),
},
Expand Down
5 changes: 5 additions & 0 deletions policy-controller/grpc/src/outbound/grpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ pub(crate) fn protocol(
default_backend: outbound::Backend,
routes: impl Iterator<Item = (GroupKindNamespaceName, GrpcRoute)>,
failure_accrual: Option<outbound::FailureAccrual>,
load_bias: Option<outbound::LoadBiasConfig>,
retry_after: Option<outbound::RetryAfterConfig>,
service_retry: Option<RouteRetry<GrpcRetryCondition>>,
service_timeouts: RouteTimeouts,
allow_l5d_request_headers: bool,
Expand Down Expand Up @@ -54,6 +56,8 @@ pub(crate) fn protocol(
outbound::proxy_protocol::Kind::Grpc(outbound::proxy_protocol::Grpc {
routes,
failure_accrual,
load_bias,
retry_after,
})
}

Expand Down Expand Up @@ -230,6 +234,7 @@ fn convert_backend(
)),
}),
load: Some(default_balancer_config()),
ejection: None,
},
)),
}),
Expand Down
15 changes: 15 additions & 0 deletions policy-controller/grpc/src/outbound/http.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ pub(crate) fn protocol(
default_backend: outbound::Backend,
routes: impl Iterator<Item = (GroupKindNamespaceName, HttpRoute)>,
accrual: Option<outbound::FailureAccrual>,
load_bias: Option<outbound::LoadBiasConfig>,
retry_after: Option<outbound::RetryAfterConfig>,
service_retry: Option<RouteRetry<HttpRetryCondition>>,
service_timeouts: RouteTimeouts,
allow_l5d_request_headers: bool,
Expand Down Expand Up @@ -76,10 +78,14 @@ pub(crate) fn protocol(
http1: Some(outbound::proxy_protocol::Http1 {
routes: routes.clone(),
failure_accrual: accrual,
load_bias,
retry_after,
}),
http2: Some(outbound::proxy_protocol::Http2 {
routes,
failure_accrual: accrual,
load_bias,
retry_after,
}),
})
}
Expand All @@ -89,6 +95,8 @@ pub(crate) fn http1_only_protocol(
default_backend: outbound::Backend,
routes: impl Iterator<Item = (GroupKindNamespaceName, HttpRoute)>,
accrual: Option<outbound::FailureAccrual>,
load_bias: Option<outbound::LoadBiasConfig>,
retry_after: Option<outbound::RetryAfterConfig>,
service_retry: Option<RouteRetry<HttpRetryCondition>>,
service_timeouts: RouteTimeouts,
allow_l5d_request_headers: bool,
Expand All @@ -106,6 +114,8 @@ pub(crate) fn http1_only_protocol(
original_dst,
),
failure_accrual: accrual,
load_bias,
retry_after,
})
}

Expand All @@ -114,6 +124,8 @@ pub(crate) fn http2_only_protocol(
default_backend: outbound::Backend,
routes: impl Iterator<Item = (GroupKindNamespaceName, HttpRoute)>,
accrual: Option<outbound::FailureAccrual>,
load_bias: Option<outbound::LoadBiasConfig>,
retry_after: Option<outbound::RetryAfterConfig>,
service_retry: Option<RouteRetry<HttpRetryCondition>>,
service_timeouts: RouteTimeouts,
allow_l5d_request_headers: bool,
Expand All @@ -131,6 +143,8 @@ pub(crate) fn http2_only_protocol(
original_dst,
),
failure_accrual: accrual,
load_bias,
retry_after,
})
}

Expand Down Expand Up @@ -318,6 +332,7 @@ fn convert_backend(
)),
}),
load: Some(default_balancer_config()),
ejection: None,
},
)),
}),
Expand Down
1 change: 1 addition & 0 deletions policy-controller/grpc/src/outbound/tcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ fn convert_backend(
)),
}),
load: Some(default_balancer_config()),
ejection: None,
},
)),
}),
Expand Down
1 change: 1 addition & 0 deletions policy-controller/grpc/src/outbound/tls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ fn convert_backend(
)),
}),
load: Some(default_balancer_config()),
ejection: None,
},
)),
}),
Expand Down
Loading
Loading