This is an automated email from the ASF dual-hosted git repository.
abhishek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push:
new 9065ef1aff Fix a bug in QosFilter (#14859)
9065ef1aff is described below
commit 9065ef1aff01b8812f410c1a400e2be632cb7672
Author: Abhishek Agarwal <[email protected]>
AuthorDate: Mon Aug 21 13:00:41 2023 +0530
Fix a bug in QosFilter (#14859)
QoSFilter class is trying to parse the timeout as an integer. We need to
round a value of query timeout that is higher than INT.MAX to INT.MAX.
---
.../indexer/DeterminePartitionsJobSamplerTest.java | 4 +-
.../server/initialization/jetty/JettyBindings.java | 11 ++--
.../druid/server/initialization/JettyQosTest.java | 59 ++++++++++++++++++++++
3 files changed, 69 insertions(+), 5 deletions(-)
diff --git
a/indexing-hadoop/src/test/java/org/apache/druid/indexer/DeterminePartitionsJobSamplerTest.java
b/indexing-hadoop/src/test/java/org/apache/druid/indexer/DeterminePartitionsJobSamplerTest.java
index 21f6be8114..16b3894244 100644
---
a/indexing-hadoop/src/test/java/org/apache/druid/indexer/DeterminePartitionsJobSamplerTest.java
+++
b/indexing-hadoop/src/test/java/org/apache/druid/indexer/DeterminePartitionsJobSamplerTest.java
@@ -76,7 +76,7 @@ public class DeterminePartitionsJobSamplerTest
}
double expect = total * 1.0 / samplingFactor;
double error = Math.abs(hit - expect) / expect;
- Assert.assertTrue(error < 0.01);
+ Assert.assertTrue(String.valueOf(error), error < 0.02);
}
@Test
@@ -97,6 +97,6 @@ public class DeterminePartitionsJobSamplerTest
}
double expect = total * 1.0 / samplingFactor;
double error = Math.abs(hit - expect) / expect;
- Assert.assertTrue(error < 0.01);
+ Assert.assertTrue(String.valueOf(error), error < 0.02);
}
}
diff --git
a/server/src/main/java/org/apache/druid/server/initialization/jetty/JettyBindings.java
b/server/src/main/java/org/apache/druid/server/initialization/jetty/JettyBindings.java
index 9fc26a73be..d955ce9848 100644
---
a/server/src/main/java/org/apache/druid/server/initialization/jetty/JettyBindings.java
+++
b/server/src/main/java/org/apache/druid/server/initialization/jetty/JettyBindings.java
@@ -94,10 +94,15 @@ public class JettyBindings
@Override
public Map<String, String> getInitParameters()
{
- if (timeoutMs >= 0) {
- return ImmutableMap.of("maxRequests", String.valueOf(maxRequests),
"suspendMs", String.valueOf(timeoutMs));
+ if (timeoutMs < 0) {
+ return ImmutableMap.of("maxRequests", String.valueOf(maxRequests));
}
- return ImmutableMap.of("maxRequests", String.valueOf(maxRequests));
+ if (timeoutMs > Integer.MAX_VALUE) {
+ // QoSFilter tries to parse the suspendMs parameter as an int, so we
can't set it to more than Integer
+ // .MAX_VALUE.
+ return ImmutableMap.of("maxRequests", String.valueOf(maxRequests),
"suspendMs", String.valueOf(Integer.MAX_VALUE));
+ }
+ return ImmutableMap.of("maxRequests", String.valueOf(maxRequests),
"suspendMs", String.valueOf(timeoutMs));
}
@Override
diff --git
a/server/src/test/java/org/apache/druid/server/initialization/JettyQosTest.java
b/server/src/test/java/org/apache/druid/server/initialization/JettyQosTest.java
index e9f7fc016a..b0fea90bc4 100644
---
a/server/src/test/java/org/apache/druid/server/initialization/JettyQosTest.java
+++
b/server/src/test/java/org/apache/druid/server/initialization/JettyQosTest.java
@@ -22,6 +22,7 @@ package org.apache.druid.server.initialization;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterators;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.inject.Binder;
import com.google.inject.Injector;
@@ -45,12 +46,16 @@ import
org.apache.druid.server.initialization.jetty.JettyServerInitializer;
import org.apache.druid.server.security.AuthTestUtils;
import org.apache.druid.server.security.AuthorizerMapper;
import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.servlets.QoSFilter;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.jboss.netty.handler.codec.http.HttpMethod;
import org.junit.Assert;
import org.junit.Test;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
import java.net.URL;
+import java.util.Enumeration;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicLong;
@@ -193,4 +198,58 @@ public class JettyQosTest extends BaseJettyTest
// check that fast requests finished quickly
Assert.assertTrue(fastElapsed.get() / fastCount.get() < 500);
}
+
+ @Test
+ public void testQoSFilterMaxTimeout()
+ {
+ QoSFilter filter = new QoSFilter();
+ JettyBindings.QosFilterHolder qosFilterHolder = new
JettyBindings.QosFilterHolder(new String[]{"/slow/*"}, 1,
+
Long.MAX_VALUE
+ );
+ filter.init(new QoSFilterConfig(qosFilterHolder));
+ Assert.assertEquals(Integer.MAX_VALUE, filter.getSuspendMs());
+ }
+
+ @Test
+ public void testQoSFilterNoTimeout()
+ {
+ QoSFilter filter = new QoSFilter();
+ JettyBindings.QosFilterHolder qosFilterHolder = new
JettyBindings.QosFilterHolder(new String[]{"/slow/*"}, 1);
+ filter.init(new QoSFilterConfig(qosFilterHolder));
+ Assert.assertEquals(-1, filter.getSuspendMs());
+ }
+
+ private static class QoSFilterConfig implements FilterConfig
+ {
+ private JettyBindings.QosFilterHolder qosFilterHolder;
+
+ public QoSFilterConfig(JettyBindings.QosFilterHolder qosFilterHolder)
+ {
+ this.qosFilterHolder = qosFilterHolder;
+ }
+
+ @Override
+ public String getFilterName()
+ {
+ return "dummy";
+ }
+
+ @Override
+ public ServletContext getServletContext()
+ {
+ return null;
+ }
+
+ @Override
+ public String getInitParameter(String name)
+ {
+ return qosFilterHolder.getInitParameters().get(name);
+ }
+
+ @Override
+ public Enumeration<String> getInitParameterNames()
+ {
+ return
Iterators.asEnumeration(qosFilterHolder.getInitParameters().keySet().iterator());
+ }
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]