Skip to content

Commit 0a3a5f6

Browse files
committed
fix: replace unreliable dnspython timing with perf_counter measurements
1 parent 6d14c1f commit 0a3a5f6

File tree

2 files changed

+7
-16
lines changed

2 files changed

+7
-16
lines changed

dnsdiag/dns.py

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2525
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2626

27-
import datetime
2827
import errno
2928
import socket
29+
import time
3030
from statistics import stdev
3131
from typing import Optional, List, Any
3232

@@ -131,6 +131,7 @@ def ping(qname: str, server: str, dst_port: int, rdtype: str, timeout: float, co
131131
query = dns.message.make_query(fqdn, rdtype, dns.rdataclass.IN, use_edns=False, want_dnssec=False)
132132

133133
try:
134+
stime = time.perf_counter()
134135
if proto == PROTO_UDP:
135136
response = dns.query.udp(query, server, timeout=timeout, port=dst_port, source=src_ip,
136137
ignore_unexpected=True)
@@ -181,13 +182,9 @@ def ping(qname: str, server: str, dst_port: int, rdtype: str, timeout: float, co
181182
err(f"ERROR: {e}")
182183
break
183184
else:
184-
# convert time to milliseconds, considering that
185-
# time property is retruned differently by query.https
186-
# dns library returns float for most protocols but timedelta for HTTPS
187-
if isinstance(response.time, datetime.timedelta):
188-
elapsed = response.time.total_seconds() * 1000
189-
else:
190-
elapsed = response.time * 1000
185+
etime = time.perf_counter()
186+
# Use perf_counter() measurements for accurate wall-clock time
187+
elapsed = (etime - stime) * 1000 # Convert seconds to milliseconds
191188
response_times.append(elapsed)
192189
if response:
193190
retval.response = response

dnsping.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2626

2727

28-
import datetime
2928
import errno
3029
import getopt
3130
import ipaddress
@@ -619,13 +618,8 @@ def main() -> None:
619618
shutdown = True
620619
break
621620
else:
622-
# convert time to milliseconds, considering that
623-
# time property is returned differently by query.https
624-
# dns library returns float for most protocols but timedelta for HTTPS
625-
if isinstance(answers.time, datetime.timedelta):
626-
elapsed = answers.time.total_seconds() * 1000
627-
else:
628-
elapsed = answers.time * 1000
621+
# Use perf_counter() measurements for accurate wall-clock time
622+
elapsed = (etime - stime) * 1000 # Convert seconds to milliseconds
629623
response_time.append(elapsed)
630624
if not quiet:
631625
extras = ""

0 commit comments

Comments
 (0)