This is an automated email from the ASF dual-hosted git repository.
achennaka pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git
The following commit(s) were added to refs/heads/master by this push:
new 9ede74b8a [java] sync slow DNS resolution threshold with the C++ code
9ede74b8a is described below
commit 9ede74b8a575be4185a73530181e8714a1f1b322
Author: Alexey Serbin <[email protected]>
AuthorDate: Thu Nov 30 12:47:26 2023 -0800
[java] sync slow DNS resolution threshold with the C++ code
Prior to this patch, the threshold for slow DNS resolution warning
was set to just 3 ms in the code of the Kudu Java client, which didn't
make a lot of sense if talking about non-cached DNS queries.
This patch synchronizes the warning threshold with the corresponding
threshold in the Kudu's C++ code (200 ms), and also doubles the debug
threshold, bumping up the latter from 0.5 ms to 1 ms.
Change-Id: I8c2b938b2738e1127adfdf834f0e7f0176cf35b7
Reviewed-on: http://gerrit.cloudera.org:8080/20743
Tested-by: Alexey Serbin <[email protected]>
Reviewed-by: Abhishek Chennaka <[email protected]>
---
.../main/java/org/apache/kudu/util/NetUtil.java | 28 +++++++++++++++-------
1 file changed, 20 insertions(+), 8 deletions(-)
diff --git a/java/kudu-client/src/main/java/org/apache/kudu/util/NetUtil.java
b/java/kudu-client/src/main/java/org/apache/kudu/util/NetUtil.java
index 26b10450d..5f40e49ba 100644
--- a/java/kudu-client/src/main/java/org/apache/kudu/util/NetUtil.java
+++ b/java/kudu-client/src/main/java/org/apache/kudu/util/NetUtil.java
@@ -113,25 +113,37 @@ public class NetUtil {
/**
* Gets a hostname or an IP address and returns an array of InetAddresses.
* <p>
- * <strong>This method can block</strong> as there is no API for
- * asynchronous DNS resolution in the JDK.
+ * <strong>This method can block for a long time</strong> if DNS resolution
+ * is slow.
* @param host the hostname to resolve
* @return an array of InetAddresses for the given hostname,
* or {@code null} if the address couldn't be resolved
*/
public static InetAddress[] getAllInetAddresses(final String host) {
+ // The 'slow DNS resolution' warning threshold is set to be the same as
+ // in HostPort::ResolveAddresses() from src/kudu/util/net/net_util.cc.
+ final long kWarningThresholdNs = 200000000; // 200 ms
+
+ // Once a DNS name is resolved into IP addresses, DNS caching layers of
+ // a contemporary OS makes follow-up resolutions faster. However, when
+ // investigating latencies of relatively fast RPC calls, make it possible
+ // to see in debug logs the exact timing of DNS resolutions that took
+ // over one millisecond.
+ final long kDebugThresholdNs = 1000000; // 1 ms
+
final long start = System.nanoTime();
try {
InetAddress[] ipAddrs = InetAddress.getAllByName(host);
- long latency = System.nanoTime() - start;
- if (latency > 500000/*ns*/ && LOG.isDebugEnabled()) {
- LOG.debug("Resolved IP of `{}' to {} in {}ns", host, ipAddrs, latency);
- } else if (latency >= 3000000/*ns*/) {
- LOG.warn("Slow DNS lookup! Resolved IP of `{}' to {} in {}ns", host,
ipAddrs, latency);
+ final long elapsedNs = System.nanoTime() - start;
+
+ if (elapsedNs > kDebugThresholdNs && LOG.isDebugEnabled()) {
+ LOG.debug("Resolved '{}' into {} in {}ns", host, ipAddrs, elapsedNs);
+ } else if (elapsedNs > kWarningThresholdNs) {
+ LOG.warn("Slow DNS lookup! Resolved '{}' into {} in {}ns", host,
ipAddrs, elapsedNs);
}
return ipAddrs;
} catch (UnknownHostException e) {
- LOG.error("Failed to resolve the IP of `{}' in {}ns", host,
(System.nanoTime() - start));
+ LOG.error("Failed resolving '{}' into IP addresses in {}ns", host,
System.nanoTime() - start);
return null;
}
}