refactor: extract cache_and_parse, remove dead truncation log, restore TCP_TIMEOUT to 400ms

This commit is contained in:
Razvan Dimescu
2026-04-12 13:08:37 +03:00
parent 85cff052a4
commit 628ed00074
2 changed files with 25 additions and 32 deletions

View File

@@ -229,29 +229,17 @@ pub async fn resolve_query(
) )
.await .await
{ {
Ok(resp_wire) => { Ok(resp_wire) => match cache_and_parse(ctx, &qname, qtype, &resp_wire) {
ctx.cache.write().unwrap().insert_wire(
&qname,
qtype,
&resp_wire,
DnssecStatus::Indeterminate,
);
let mut buf = BytePacketBuffer::from_bytes(&resp_wire);
match DnsPacket::from_buffer(&mut buf) {
Ok(resp) => (resp, QueryPath::Forwarded, DnssecStatus::Indeterminate), Ok(resp) => (resp, QueryPath::Forwarded, DnssecStatus::Indeterminate),
Err(e) => { Err(e) => {
error!( error!("{} | {:?} {} | PARSE ERROR | {}", src_addr, qtype, qname, e);
"{} | {:?} {} | PARSE ERROR | {}",
src_addr, qtype, qname, e
);
( (
DnsPacket::response_from(&query, ResultCode::SERVFAIL), DnsPacket::response_from(&query, ResultCode::SERVFAIL),
QueryPath::UpstreamError, QueryPath::UpstreamError,
DnssecStatus::Indeterminate, DnssecStatus::Indeterminate,
) )
} }
} },
}
Err(e) => { Err(e) => {
error!( error!(
"{} | {:?} {} | UPSTREAM ERROR | {}", "{} | {:?} {} | UPSTREAM ERROR | {}",
@@ -373,6 +361,20 @@ pub async fn resolve_query(
Ok(resp_buffer) Ok(resp_buffer)
} }
fn cache_and_parse(
ctx: &ServerCtx,
qname: &str,
qtype: QueryType,
resp_wire: &[u8],
) -> crate::Result<DnsPacket> {
ctx.cache
.write()
.unwrap()
.insert_wire(qname, qtype, resp_wire, DnssecStatus::Indeterminate);
let mut buf = BytePacketBuffer::from_bytes(resp_wire);
DnsPacket::from_buffer(&mut buf)
}
async fn forward_and_cache( async fn forward_and_cache(
wire: &[u8], wire: &[u8],
upstream: &Upstream, upstream: &Upstream,
@@ -381,12 +383,7 @@ async fn forward_and_cache(
qtype: QueryType, qtype: QueryType,
) -> crate::Result<DnsPacket> { ) -> crate::Result<DnsPacket> {
let resp_wire = forward_query_raw(wire, upstream, ctx.timeout).await?; let resp_wire = forward_query_raw(wire, upstream, ctx.timeout).await?;
ctx.cache cache_and_parse(ctx, qname, qtype, &resp_wire)
.write()
.unwrap()
.insert_wire(qname, qtype, &resp_wire, DnssecStatus::Indeterminate);
let mut buf = BytePacketBuffer::from_bytes(&resp_wire);
DnsPacket::from_buffer(&mut buf)
} }
pub async fn handle_query( pub async fn handle_query(

View File

@@ -176,11 +176,7 @@ pub(crate) async fn forward_udp(
) -> Result<DnsPacket> { ) -> Result<DnsPacket> {
let mut send_buffer = BytePacketBuffer::new(); let mut send_buffer = BytePacketBuffer::new();
query.write(&mut send_buffer)?; query.write(&mut send_buffer)?;
let data = forward_udp_raw(send_buffer.filled(), upstream, timeout_duration).await?; let data = forward_udp_raw(send_buffer.filled(), upstream, timeout_duration).await?;
if data.len() >= 4096 {
log::debug!("upstream response may be truncated ({} bytes)", data.len());
}
let mut recv_buffer = BytePacketBuffer::from_bytes(&data); let mut recv_buffer = BytePacketBuffer::from_bytes(&data);
DnsPacket::from_buffer(&mut recv_buffer) DnsPacket::from_buffer(&mut recv_buffer)
} }