mirror of https://github.com/apache/druid.git
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.
This commit is contained in:
parent
263ac36e8d
commit
9065ef1aff
|
@ -76,7 +76,7 @@ public class DeterminePartitionsJobSamplerTest
|
||||||
}
|
}
|
||||||
double expect = total * 1.0 / samplingFactor;
|
double expect = total * 1.0 / samplingFactor;
|
||||||
double error = Math.abs(hit - expect) / expect;
|
double error = Math.abs(hit - expect) / expect;
|
||||||
Assert.assertTrue(error < 0.01);
|
Assert.assertTrue(String.valueOf(error), error < 0.02);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -97,6 +97,6 @@ public class DeterminePartitionsJobSamplerTest
|
||||||
}
|
}
|
||||||
double expect = total * 1.0 / samplingFactor;
|
double expect = total * 1.0 / samplingFactor;
|
||||||
double error = Math.abs(hit - expect) / expect;
|
double error = Math.abs(hit - expect) / expect;
|
||||||
Assert.assertTrue(error < 0.01);
|
Assert.assertTrue(String.valueOf(error), error < 0.02);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,10 +94,15 @@ public class JettyBindings
|
||||||
@Override
|
@Override
|
||||||
public Map<String, String> getInitParameters()
|
public Map<String, String> getInitParameters()
|
||||||
{
|
{
|
||||||
if (timeoutMs >= 0) {
|
if (timeoutMs < 0) {
|
||||||
return ImmutableMap.of("maxRequests", String.valueOf(maxRequests), "suspendMs", String.valueOf(timeoutMs));
|
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
|
@Override
|
||||||
|
|
|
@ -22,6 +22,7 @@ package org.apache.druid.server.initialization;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.Iterators;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import com.google.inject.Binder;
|
import com.google.inject.Binder;
|
||||||
import com.google.inject.Injector;
|
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.AuthTestUtils;
|
||||||
import org.apache.druid.server.security.AuthorizerMapper;
|
import org.apache.druid.server.security.AuthorizerMapper;
|
||||||
import org.eclipse.jetty.server.Server;
|
import org.eclipse.jetty.server.Server;
|
||||||
|
import org.eclipse.jetty.servlets.QoSFilter;
|
||||||
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
import org.eclipse.jetty.util.thread.QueuedThreadPool;
|
||||||
import org.jboss.netty.handler.codec.http.HttpMethod;
|
import org.jboss.netty.handler.codec.http.HttpMethod;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import javax.servlet.FilterConfig;
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.util.Enumeration;
|
||||||
import java.util.concurrent.CountDownLatch;
|
import java.util.concurrent.CountDownLatch;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.atomic.AtomicLong;
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
@ -193,4 +198,58 @@ public class JettyQosTest extends BaseJettyTest
|
||||||
// check that fast requests finished quickly
|
// check that fast requests finished quickly
|
||||||
Assert.assertTrue(fastElapsed.get() / fastCount.get() < 500);
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue