gateway: custom-domain app lookup does an uncached DNS query on every connection, adding ~0.8–3s to the TLS handshake
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 68/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Tranquilo
- Stack tecnológico
- rust
Línea de trabajo
Empieza en gateway/src/proxy/tls_passthough.rs, en resolve_app_address(), y luego sigue su llamada desde proxy_with_sni() a través de tls_accept(). Comprueba cómo se crea el resolvedor de hickory y cómo se gestionan los resultados TXT primarios y heredados. Se considera terminado cuando la reutilización del resolvedor y de la dirección de la aplicación respeta el TTL, un resultado primario no se retrasa por la búsqueda heredada y los handshakes de dominios personalizados evitan costes DNS repetidos.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Problem
For a custom domain (an SNI that isn't a <app-id>.<base-domain> subdomain), the gateway looks up the target app via DNS on every connection, before the TLS handshake completes — so the delay shows up as handshake latency. The lookup is slow because it:
- Builds a new DNS resolver every call (
AsyncResolver::tokio_from_system_conf()), so nothing is cached between connections and the record TTL is never used. - Runs the primary and legacy TXT lookups with
tokio::join!and waits for both, putting a slow/negative legacy lookup on the critical path.
This is worst when the gateway's resolver is slow — e.g. a CVM on QEMU user-mode (SLIRP) networking, where DNS is forwarded and uncached. Subdomain-routed apps skip the lookup and are unaffected.
Code
gateway/src/proxy/tls_passthough.rs, resolve_app_address() (called per connection from proxy_with_sni(), before tls_accept()):
let resolver = hickory_resolver::AsyncResolver::tokio_from_system_conf()?; // (1) new resolver every call
// ...
let (lookup, lookup_legacy) = tokio::join!( // (2) waits for BOTH; legacy is usually NXDOMAIN
resolver.txt_lookup(txt_domain),
resolver.txt_lookup(txt_domain_legacy),
);
Evidence
TLS-handshake time against one gateway, over loopback (no internet RTT), 18 samples each:
| SNI | pre-handshake work | median | max |
|---|---|---|---|
| custom domain | DNS lookup + handshake | 820 ms | 3373 ms |
<app-id>.<base> subdomain |
no DNS | 10 ms | 16 ms |
The ~810 ms gap is entirely the DNS step. Adding the missing legacy TXT record (so the second lookup isn't NXDOMAIN) dropped the median to ~499 ms — confirming the join!-on-both cost, but most of the delay is the per-connection uncached resolver.
Suggested fix
- Build the resolver once and reuse it (hickory caches by TTL).
- Cache resolved app-addresses by record TTL so steady-state connections skip DNS.
- Make the legacy lookup a fallback (only on primary miss), not a
join!that always waits.
(1)+(2) should bring custom-domain connections down to the subdomain baseline.
- Lenguaje dominante
- Rust
- Estrellas
- 550
- Forks
- 97
- Merge medio
- 19 h 22 min
- PR fusionados (30 d)
- 109
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de Dstack-TEE/dstack
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 30/100
Dstack-TEE/dstack#1301 ·
-
Dificultad 3/5 1-2 días Aptitud para principiantes 55/100
Dstack-TEE/dstack#1300 ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
Dstack-TEE/dstack#1299 ·
-
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
Dstack-TEE/dstack#1298 ·
-
P0
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
Dstack-TEE/dstack#1297 ·
Todos los issues de Dstack-TEE/dstack
Issues similares
-
has_tail_capacity wraps and get_writable_raw_unchecked commits raw_len before the bounds check Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
stratum-mining/stratum#2404 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 85/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
Eynzof/Hermes-CN-Desktop#610 ·
-
Axis areas are always keyboard-focusable (Sense::drag), even with allow_axis_zoom_drag(false) Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
-
bug team:backend track:services-maintenance
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
cowprotocol/services#4950 ·