From 2b57d07da557c2c87008d5c9f2754bb16f35ecd6 Mon Sep 17 00:00:00 2001 From: Revertron Date: Fri, 10 Sep 2021 16:30:17 +0200 Subject: [PATCH] Optimized requests handling. --- src/dns/server.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/dns/server.rs b/src/dns/server.rs index 405540e..01ca3d3 100644 --- a/src/dns/server.rs +++ b/src/dns/server.rs @@ -17,6 +17,8 @@ use crate::dns::context::ServerContext; use crate::dns::netutil::{read_packet_length, write_packet_length}; use crate::dns::protocol::{DnsPacket, DnsRecord, QueryType, ResultCode}; use crate::dns::resolve::DnsResolver; +use lru::LruCache; +use chrono::Utc; #[derive(Debug, Display, From, Error)] pub enum ServerError { @@ -237,6 +239,7 @@ impl DnsServer for DnsUdpServer { let _ = Builder::new() .name("DnsUdpServer-incoming".into()) .spawn(move || { + let mut working_ids: LruCache<(SocketAddr, u16), i64> = LruCache::new(256); loop { let _ = self.context.statistics.udp_query_count.fetch_add(1, Ordering::Release); @@ -264,6 +267,15 @@ impl DnsServer for DnsUdpServer { continue; } }; + // If we got a request resent in 100ms interval, then we just skip it + let key = (src.clone(), request.header.id); + let cur_time = Utc::now().timestamp_millis(); + if let Some(time) = working_ids.get(&key) { + if time + 100 > cur_time { + continue; + } + } + working_ids.put(key, cur_time); // Acquire lock, add request to queue, and notify waiting threads using the condition. match self.request_queue.lock() {