-
Notifications
You must be signed in to change notification settings - Fork 2.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
DNS Cache Manager always reads in resolv.config when using custom DNS resolver #3515
Comments
Sebb (migrated from Bugzilla): It does not have an ExtendedResolver class. |
Yifan Cai (migrated from Bugzilla): Please consider it again. (In reply to Sebb from comment 1)
|
Sebb (migrated from Bugzilla): |
@FSchumacher (migrated from Bugzilla): Two thing the attached patch solves:
Created attachment 0001-Use-only-configured-DNS-Servers.patch: Use only the configured DNS servers 0001-Use-only-configured-DNS-Servers.patchFrom 92ef52ca2031a33498b424fb204e27dfc78999d3 Mon Sep 17 00:00:00 2001
From: Felix Schumacher <felix.schumacher@internetallee.de>
Date: Fri, 16 Jan 2015 22:15:40 +0100
Subject: [PATCH] Use only configured DNS Servers
---
.../protocol/http/control/DNSCacheManager.java | 16 +++++++++------
.../protocol/http/control/TestDNSCacheManager.java | 24 ++++++++++++++++++++++
2 files changed, 34 insertions(+), 6 deletions(-)
create mode 100644 test/src/org/apache/jmeter/protocol/http/control/TestDNSCacheManager.java
diff --git a/src/protocol/http/org/apache/jmeter/protocol/http/control/DNSCacheManager.java b/src/protocol/http/org/apache/jmeter/protocol/http/control/DNSCacheManager.java
index c3862b2..3cd31e9 100644
--- a/src/protocol/http/org/apache/jmeter/protocol/http/control/DNSCacheManager.java
+++ b/src/protocol/http/org/apache/jmeter/protocol/http/control/DNSCacheManager.java
@@ -42,7 +42,6 @@ import org.xbill.DNS.ExtendedResolver;
import org.xbill.DNS.Lookup;
import org.xbill.DNS.Record;
import org.xbill.DNS.Resolver;
-import org.xbill.DNS.SimpleResolver;
import org.xbill.DNS.TextParseException;
import org.xbill.DNS.Type;
@@ -104,12 +103,17 @@ public class DNSCacheManager extends ConfigTestElement implements TestIterationL
clone.cache = new LinkedHashMap<String, InetAddress[]>();
CollectionProperty dnsServers = getServers();
try {
- clone.resolver = new ExtendedResolver();
+ String[] serverNames = new String[dnsServers.size()];
PropertyIterator dnsServIt = dnsServers.iterator();
+ int index=0;
while (dnsServIt.hasNext()) {
- String dnsServer = dnsServIt.next().getStringValue();
- ((ExtendedResolver) clone.resolver).addResolver(new SimpleResolver(dnsServer));
+ serverNames[index] = dnsServIt.next().getStringValue();
+ index++;
}
+ clone.resolver = new ExtendedResolver(serverNames);
+ log.debug("Using DNS Resolvers: "
+ + Arrays.asList(((ExtendedResolver) clone.resolver)
+ .getResolvers()));
// resolvers will be chosen via round-robin
((ExtendedResolver) clone.resolver).setLoadBalance(true);
} catch (UnknownHostException uhe) {
@@ -146,13 +150,13 @@ public class DNSCacheManager extends ConfigTestElement implements TestIterationL
*/
private InetAddress[] requestLookup(String host) throws UnknownHostException {
InetAddress[] addresses = null;
- if (isCustomResolver() && ((ExtendedResolver) resolver).getResolvers().length > 1) {
+ if (isCustomResolver() && ((ExtendedResolver) resolver).getResolvers().length > 0) {
try {
Lookup lookup = new Lookup(host, Type.A);
lookup.setCache(lookupCache);
lookup.setResolver(resolver);
Record[] records = lookup.run();
- if (records.length == 0) {
+ if (records == null || records.length == 0) {
throw new UnknownHostException("Failed to resolve host name: " + host);
}
addresses = new InetAddress[records.length];
diff --git a/test/src/org/apache/jmeter/protocol/http/control/TestDNSCacheManager.java b/test/src/org/apache/jmeter/protocol/http/control/TestDNSCacheManager.java
new file mode 100644
index 0000000..67a0c9f
--- /dev/null
+++ b/test/src/org/apache/jmeter/protocol/http/control/TestDNSCacheManager.java
@@ -0,0 +1,24 @@
+package org.apache.jmeter.protocol.http.control;
+
+import java.net.UnknownHostException;
+
+import org.apache.jmeter.junit.JMeterTestCase;
+import org.junit.Test;
+
+public class TestDNSCacheManager extends JMeterTestCase {
+
+ @Test
+ public void testCloneWithCustomResolverAndInvalidNameserver() throws UnknownHostException {
+ DNSCacheManager original = new DNSCacheManager();
+ original.setCustomResolver(true);
+ original.addServer("127.0.0.99");
+ DNSCacheManager clone = (DNSCacheManager) original.clone();
+ try {
+ clone.resolve("jmeter.apache.org");
+ fail();
+ } catch (UnknownHostException e) {
+ // OK
+ }
+ }
+
+}
--
1.9.1
|
@milamberspace (migrated from Bugzilla): Patch looks good, except the AL header on TestDNSCacheManager file. I have uploaded the same patch with some formatting and the AL. @felix, you can committing on the SVN (don't forget to add the bug record in changes.xml) |
@milamberspace (migrated from Bugzilla): dns.patchIndex: src/protocol/http/org/apache/jmeter/protocol/http/control/DNSCacheManager.java
===================================================================
--- src/protocol/http/org/apache/jmeter/protocol/http/control/DNSCacheManager.java (revision 1654553)
+++ src/protocol/http/org/apache/jmeter/protocol/http/control/DNSCacheManager.java (working copy)
@@ -42,7 +42,6 @@
import org.xbill.DNS.Lookup;
import org.xbill.DNS.Record;
import org.xbill.DNS.Resolver;
-import org.xbill.DNS.SimpleResolver;
import org.xbill.DNS.TextParseException;
import org.xbill.DNS.Type;
@@ -104,11 +103,16 @@
clone.cache = new LinkedHashMap<String, InetAddress[]>();
CollectionProperty dnsServers = getServers();
try {
- clone.resolver = new ExtendedResolver();
+ String[] serverNames = new String[dnsServers.size()];
PropertyIterator dnsServIt = dnsServers.iterator();
+ int index = 0;
while (dnsServIt.hasNext()) {
- String dnsServer = dnsServIt.next().getStringValue();
- ((ExtendedResolver) clone.resolver).addResolver(new SimpleResolver(dnsServer));
+ serverNames[index] = dnsServIt.next().getStringValue();
+ index++;
+ }
+ clone.resolver = new ExtendedResolver(serverNames);
+ if (log.isDebugEnabled()) {
+ log.debug("Using DNS Resolvers: " + Arrays.asList(((ExtendedResolver) clone.resolver).getResolvers()));
}
// resolvers will be chosen via round-robin
((ExtendedResolver) clone.resolver).setLoadBalance(true);
@@ -146,13 +150,13 @@
*/
private InetAddress[] requestLookup(String host) throws UnknownHostException {
InetAddress[] addresses = null;
- if (isCustomResolver() && ((ExtendedResolver) resolver).getResolvers().length > 1) {
+ if (isCustomResolver() && ((ExtendedResolver) resolver).getResolvers().length > 0) {
try {
Lookup lookup = new Lookup(host, Type.A);
lookup.setCache(lookupCache);
lookup.setResolver(resolver);
Record[] records = lookup.run();
- if (records.length == 0) {
+ if (records == null || records.length == 0) {
throw new UnknownHostException("Failed to resolve host name: " + host);
}
addresses = new InetAddress[records.length];
Index: test/src/org/apache/jmeter/protocol/http/control/TestDNSCacheManager.java
===================================================================
--- test/src/org/apache/jmeter/protocol/http/control/TestDNSCacheManager.java (revision 0)
+++ test/src/org/apache/jmeter/protocol/http/control/TestDNSCacheManager.java (revision 0)
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to You under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jmeter.protocol.http.control;
+
+import java.net.UnknownHostException;
+import org.apache.jmeter.junit.JMeterTestCase;
+import org.junit.Test;
+
+public class TestDNSCacheManager extends JMeterTestCase {
+
+ @Test
+ public void testCloneWithCustomResolverAndInvalidNameserver() throws UnknownHostException {
+ DNSCacheManager original = new DNSCacheManager();
+ original.setCustomResolver(true);
+ original.addServer("127.0.0.99");
+ DNSCacheManager clone = (DNSCacheManager) original.clone();
+ try {
+ clone.resolve("jmeter.apache.org");
+ fail();
+ } catch (UnknownHostException e) {
+ // OK
+ }
+ }
+}
\ No newline at end of file
|
@FSchumacher (migrated from Bugzilla): URL: http://svn.apache.org/r1654575 Added: |
Sean Chang (migrated from Bugzilla): |
@pmouawad (migrated from Bugzilla): |
Sean Chang (migrated from Bugzilla): Created attachment Sean_A_Rio2_Case10_2billion.fill_w_swift.jmx: test plan |
Sean Chang (migrated from Bugzilla): Created attachment jmeter.log: jmeter.log jmeter.log
|
Sean Chang (migrated from Bugzilla): |
@pmouawad (migrated from Bugzilla): Also , could you provide a simple test plan with only regular Thread Group and the minimal elements to reproduce your issue ? |
@pmouawad (migrated from Bugzilla): Thanks for report |
Yifan Cai (Bug 57447):
The "use custom DNS resolver" option means ONLY use the DNS severs add to the list in the DNS Manager component.
In the Unix environment, the behavior is not as described (not tried in other OSs, but from the view of the code, I think, the other OSs have the same issue). It will read in the DNS servers specified in the /etc/resolv.config file first, then add the DNS servers from the DNS Manager list.
The reason, I believe, is because that ExtendedResolver, which is used by DNS Manager, reads in the system DNS settings first, when instantiating.
public ExtendedResolver()
throws UnknownHostException
{
init();
String[] servers = ResolverConfig.getCurrentConfig().servers();
if (servers != null) {
for (int i = 0; i < servers.length; i++)
{
Resolver r = new SimpleResolver(servers[i]);
r.setTimeout(5);
this.resolvers.add(r);
}
} else {
this.resolvers.add(new SimpleResolver());
}
}
Please correct me, if I have a misunderstanding on how "custom DNS resolvers" should work.
Severity: normal
OS: All
The text was updated successfully, but these errors were encountered: