Skip to content

Commit 1503b63

Browse files
authored
control: Recover from failed resolutions (#640)
Arbitrary (unexpected) DNS errors can blow up the control client. Instead, we should try to backoff & recover from these unexpected errors.
1 parent ca2fc1f commit 1503b63

File tree

1 file changed

+28
-15
lines changed

1 file changed

+28
-15
lines changed

linkerd/app/core/src/control.rs

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,17 @@ impl Config {
5353
B::Error: Into<Error> + Send + Sync,
5454
I: Clone + tls::client::HasConfig + Send + 'static,
5555
{
56+
let backoff = {
57+
let backoff = self.connect.backoff;
58+
move |_| Ok(backoff.stream())
59+
};
5660
svc::connect(self.connect.keepalive)
5761
.push(tls::ConnectLayer::new(identity))
5862
.push_timeout(self.connect.timeout)
5963
.push(self::client::layer())
60-
.push(reconnect::layer({
61-
let backoff = self.connect.backoff;
62-
move |_| Ok(backoff.stream())
63-
}))
64+
.push(reconnect::layer(backoff.clone()))
6465
.push_spawn_ready()
65-
.push(self::resolve::layer(dns))
66+
.push(self::resolve::layer(dns, backoff))
6667
.push_on_response(self::control::balance::layer())
6768
.push(metrics.into_layer::<classify::Response>())
6869
.push(self::add_origin::Layer::new())
@@ -209,26 +210,38 @@ mod resolve {
209210
use super::client::Target;
210211
use crate::{
211212
dns,
212-
proxy::{discover, dns_resolve::DnsResolve, resolve::map_endpoint},
213+
proxy::{
214+
discover,
215+
dns_resolve::DnsResolve,
216+
resolve::{map_endpoint, recover},
217+
},
213218
svc,
214219
};
220+
use linkerd2_error::Recover;
215221
use std::net::SocketAddr;
216222

217-
pub fn layer<M>(
223+
pub fn layer<M, R>(
218224
dns: dns::Resolver,
219-
) -> impl svc::Layer<
220-
M,
221-
Service = discover::MakeEndpoint<
222-
discover::FromResolve<map_endpoint::Resolve<IntoTarget, DnsResolve>, Target>,
223-
M,
224-
>,
225-
> {
225+
recover: R,
226+
) -> impl svc::Layer<M, Service = Discover<M, R>>
227+
where
228+
R: Recover + Clone,
229+
R::Backoff: Unpin,
230+
{
226231
discover::resolve(map_endpoint::Resolve::new(
227232
IntoTarget(()),
228-
DnsResolve::new(dns),
233+
recover::Resolve::new(recover, DnsResolve::new(dns)),
229234
))
230235
}
231236

237+
type Discover<M, R> = discover::MakeEndpoint<
238+
discover::FromResolve<
239+
map_endpoint::Resolve<IntoTarget, recover::Resolve<R, DnsResolve>>,
240+
Target,
241+
>,
242+
M,
243+
>;
244+
232245
#[derive(Copy, Clone, Debug)]
233246
pub struct IntoTarget(());
234247

0 commit comments

Comments
 (0)