Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,12 @@ public int getOrder() {
public void customize(ConfigurableJettyWebServerFactory factory) {
ServerProperties properties = this.serverProperties;
ServerProperties.Jetty jettyProperties = properties.getJetty();
ServerProperties.Jetty.Threads threadProperties = jettyProperties.getThreads();
factory.setUseForwardHeaders(getOrDeduceUseForwardHeaders());
factory.setThreadPool(determineThreadPool(jettyProperties));
factory.setThreadPool(determineThreadPool(jettyProperties.getThreads()));
PropertyMapper propertyMapper = PropertyMapper.get();
propertyMapper.from(jettyProperties::getAcceptors).whenNonNull().to(factory::setAcceptors);
propertyMapper.from(jettyProperties::getSelectors).whenNonNull().to(factory::setSelectors);
propertyMapper.from(threadProperties::getAcceptors).whenNonNull().to(factory::setAcceptors);
propertyMapper.from(threadProperties::getSelectors).whenNonNull().to(factory::setSelectors);
propertyMapper.from(properties::getMaxHttpHeaderSize).whenNonNull().asInt(DataSize::toBytes)
.when(this::isPositive).to((maxHttpHeaderSize) -> factory
.addServerCustomizers(new MaxHttpHeaderSizeCustomizer(maxHttpHeaderSize)));
Expand Down Expand Up @@ -141,12 +142,12 @@ else if (handler instanceof HandlerCollection) {
});
}

private ThreadPool determineThreadPool(ServerProperties.Jetty properties) {
BlockingQueue<Runnable> queue = determineBlockingQueue(properties.getMaxQueueCapacity());
int maxThreadCount = (properties.getMaxThreads() > 0) ? properties.getMaxThreads() : 200;
int minThreadCount = (properties.getMinThreads() > 0) ? properties.getMinThreads() : 8;
int threadIdleTimeout = (properties.getThreadIdleTimeout() != null)
? (int) properties.getThreadIdleTimeout().toMillis() : 60000;
private ThreadPool determineThreadPool(ServerProperties.Jetty.Threads threadProperties) {
BlockingQueue<Runnable> queue = determineBlockingQueue(threadProperties.getMaxQueueCapacity());
int maxThreadCount = (threadProperties.getMax() > 0) ? threadProperties.getMax() : 200;
int minThreadCount = (threadProperties.getMin() > 0) ? threadProperties.getMin() : 8;
int threadIdleTimeout = (threadProperties.getIdleTimeout() != null)
? (int) threadProperties.getIdleTimeout().toMillis() : 60000;
return new QueuedThreadPool(maxThreadCount, minThreadCount, threadIdleTimeout, queue);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,14 +79,15 @@ public int getOrder() {
public void customize(ConfigurableTomcatWebServerFactory factory) {
ServerProperties properties = this.serverProperties;
ServerProperties.Tomcat tomcatProperties = properties.getTomcat();
ServerProperties.Tomcat.Threads threadProperties = tomcatProperties.getThreads();
PropertyMapper propertyMapper = PropertyMapper.get();
propertyMapper.from(tomcatProperties::getBasedir).whenNonNull().to(factory::setBaseDirectory);
propertyMapper.from(tomcatProperties::getBackgroundProcessorDelay).whenNonNull().as(Duration::getSeconds)
.as(Long::intValue).to(factory::setBackgroundProcessorDelay);
customizeRemoteIpValve(factory);
propertyMapper.from(tomcatProperties::getMaxThreads).when(this::isPositive)
.to((maxThreads) -> customizeMaxThreads(factory, tomcatProperties.getMaxThreads()));
propertyMapper.from(tomcatProperties::getMinSpareThreads).when(this::isPositive)
propertyMapper.from(threadProperties::getMax).when(this::isPositive)
.to((maxThreads) -> customizeMaxThreads(factory, threadProperties.getMax()));
propertyMapper.from(threadProperties::getMinSpare).when(this::isPositive)
.to((minSpareThreads) -> customizeMinThreads(factory, minSpareThreads));
propertyMapper.from(this.serverProperties.getMaxHttpHeaderSize()).whenNonNull().asInt(DataSize::toBytes)
.when(this::isPositive)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,10 @@ public void customize(ConfigurableUndertowWebServerFactory factory) {
private void mapUndertowProperties(ConfigurableUndertowWebServerFactory factory, FactoryOptions options) {
PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull();
Undertow properties = this.serverProperties.getUndertow();
ServerProperties.Undertow.Threads threadProperties = properties.getThreads();
map.from(properties::getBufferSize).whenNonNull().asInt(DataSize::toBytes).to(factory::setBufferSize);
map.from(properties::getIoThreads).to(factory::setIoThreads);
map.from(properties::getWorkerThreads).to(factory::setWorkerThreads);
map.from(threadProperties::getIo).to(factory::setIoThreads);
map.from(threadProperties::getWorker).to(factory::setWorkerThreads);
map.from(properties::getDirectBuffers).to(factory::setUseDirectBuffers);
map.from(properties::getMaxHttpPostSize).as(DataSize::toBytes).when(this::isPositive)
.to(options.server(UndertowOptions.MAX_ENTITY_SIZE));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import java.net.InetAddress;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Expand Down Expand Up @@ -75,6 +76,7 @@
* @author Andrew McGhie
* @author HaiTao Zhang
* @author Rafiullah Hamedy
* @author Chris Bono
*/
class ServerPropertiesTests {

Expand Down Expand Up @@ -207,40 +209,132 @@ void testCustomizeHeaderSizeUseBytesByDefault() {
assertThat(this.properties.getMaxHttpHeaderSize()).isEqualTo(DataSize.ofKilobytes(1));
}

@Test
void testCustomizeTomcatMaxThreads() {
bind("server.tomcat.threads.max", "10");
assertThat(this.properties.getTomcat().getThreads().getMax()).isEqualTo(10);
}

@Deprecated
@Test
void testCustomizeTomcatMaxThreadsDeprecated() {
bind("server.tomcat.maxThreads", "10");
assertThat(this.properties.getTomcat().getMaxThreads()).isEqualTo(10);
// Verify they are locked on same backing props to avoid further downstream
// deprecated testing
assertThat(this.properties.getTomcat().getThreads().getMax()).isEqualTo(10);
}

@Test
void testCustomizeTomcatMinSpareThreads() {
bind("server.tomcat.threads.min-spare", "10");
assertThat(this.properties.getTomcat().getThreads().getMinSpare()).isEqualTo(10);
}

@Deprecated
@Test
void testCustomizeTomcatMinSpareThreadsDeprecated() {
bind("server.tomcat.min-spare-threads", "10");
assertThat(this.properties.getTomcat().getMinSpareThreads()).isEqualTo(10);
// Verify they are locked on same backing props to avoid further downstream
// deprecated testing
assertThat(this.properties.getTomcat().getThreads().getMinSpare()).isEqualTo(10);
}

@Test
void testCustomizeJettyAcceptors() {
bind("server.jetty.threads.acceptors", "10");
assertThat(this.properties.getJetty().getThreads().getAcceptors()).isEqualTo(10);
}

@Deprecated
@Test
void testCustomizeJettyAcceptorsDeprecated() {
bind("server.jetty.acceptors", "10");
assertThat(this.properties.getJetty().getAcceptors()).isEqualTo(10);
// Verify they are locked on same backing props to avoid further downstream
// deprecated testing
assertThat(this.properties.getJetty().getThreads().getAcceptors()).isEqualTo(10);
}

@Test
void testCustomizeJettySelectors() {
bind("server.jetty.threads.selectors", "10");
assertThat(this.properties.getJetty().getThreads().getSelectors()).isEqualTo(10);
}

@Deprecated
@Test
void testCustomizeJettySelectorsDeprecated() {
bind("server.jetty.selectors", "10");
assertThat(this.properties.getJetty().getSelectors()).isEqualTo(10);
// Verify they are locked on same backing props to avoid further downstream
// deprecated testing
assertThat(this.properties.getJetty().getThreads().getSelectors()).isEqualTo(10);
}

@Test
void testCustomizeJettyMaxThreads() {
bind("server.jetty.max-threads", "10");
bind("server.jetty.threads.max", "10");
assertThat(this.properties.getJetty().getThreads().getMax()).isEqualTo(10);
}

@Deprecated
@Test
void testCustomizeJettyMaxThreadsDeprecated() {
bind("server.jetty.maxThreads", "10");
assertThat(this.properties.getJetty().getMaxThreads()).isEqualTo(10);
// Verify they are locked on same backing props to avoid further downstream
// deprecated testing
assertThat(this.properties.getJetty().getThreads().getMax()).isEqualTo(10);
}

@Test
void testCustomizeJettyMinThreads() {
bind("server.jetty.min-threads", "10");
bind("server.jetty.threads.min", "10");
assertThat(this.properties.getJetty().getThreads().getMin()).isEqualTo(10);
}

@Deprecated
@Test
void testCustomizeJettyMinThreadsDeprecated() {
bind("server.jetty.minThreads", "10");
assertThat(this.properties.getJetty().getMinThreads()).isEqualTo(10);
// Verify they are locked on same backing props to avoid further downstream
// deprecated testing
assertThat(this.properties.getJetty().getThreads().getMin()).isEqualTo(10);
}

@Test
void testCustomizeJettyIdleTimeout() {
bind("server.jetty.threads.idle-timeout", "10s");
assertThat(this.properties.getJetty().getThreads().getIdleTimeout()).isEqualTo(Duration.ofSeconds(10));
}

@Deprecated
@Test
void testCustomizeJettyIdleTimeoutDeprecated() {
bind("server.jetty.thread-idle-timeout", "10s");
assertThat(this.properties.getJetty().getThreadIdleTimeout()).hasSeconds(10);
assertThat(this.properties.getJetty().getThreadIdleTimeout()).isEqualTo(Duration.ofSeconds(10));
// Verify they are locked on same backing props to avoid further downstream
// deprecated testing
assertThat(this.properties.getJetty().getThreads().getIdleTimeout()).hasSeconds(10);
}

@Test
void testCustomizeJettyMaxQueueCapacity() {
bind("server.jetty.threads.max-queue-capacity", "5150");
assertThat(this.properties.getJetty().getThreads().getMaxQueueCapacity()).isEqualTo(5150);
}

@Deprecated
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Has this been released anywhere yet? If not, I can remove it - just let me know.

@Test
void testCustomizeJettyMaxQueueCapacityDeprecated() {
bind("server.jetty.max-queue-capacity", "5150");
assertThat(this.properties.getJetty().getMaxQueueCapacity()).isEqualTo(5150);
// Verify they are locked on same backing props to avoid further downstream
// deprecated testing
assertThat(this.properties.getJetty().getThreads().getMaxQueueCapacity()).isEqualTo(5150);
}

@Test
Expand All @@ -257,6 +351,38 @@ void testCustomizeUndertowSocketOption() {
"true");
}

@Test
void testCustomizeUndertowIoThreads() {
bind("server.undertow.threads.io", "4");
assertThat(this.properties.getUndertow().getThreads().getIo()).isEqualTo(4);
}

@Deprecated
@Test
void testCustomizeUndertowIoThreadsDeprecated() {
bind("server.undertow.ioThreads", "4");
assertThat(this.properties.getUndertow().getIoThreads()).isEqualTo(4);
// Verify they are locked on same backing props to avoid further downstream
// deprecated testing
assertThat(this.properties.getUndertow().getThreads().getIo()).isEqualTo(4);
}

@Test
void testCustomizeUndertowWorkerThreads() {
bind("server.undertow.threads.worker", "10");
assertThat(this.properties.getUndertow().getThreads().getWorker()).isEqualTo(10);
}

@Deprecated
@Test
void testCustomizeUndertowWorkerThreadsDeprecated() {
bind("server.undertow.workerThreads", "10");
assertThat(this.properties.getUndertow().getWorkerThreads()).isEqualTo(10);
// Verify they are locked on same backing props to avoid further downstream
// deprecated testing
assertThat(this.properties.getUndertow().getThreads().getWorker()).isEqualTo(10);
}

@Test
void testCustomizeJettyAccessLog() {
Map<String, String> map = new HashMap<>();
Expand Down Expand Up @@ -295,12 +421,12 @@ void tomcatMaxConnectionsMatchesProtocolDefault() throws Exception {

@Test
void tomcatMaxThreadsMatchesProtocolDefault() throws Exception {
assertThat(this.properties.getTomcat().getMaxThreads()).isEqualTo(getDefaultProtocol().getMaxThreads());
assertThat(this.properties.getTomcat().getThreads().getMax()).isEqualTo(getDefaultProtocol().getMaxThreads());
}

@Test
void tomcatMinSpareThreadsMatchesProtocolDefault() throws Exception {
assertThat(this.properties.getTomcat().getMinSpareThreads())
assertThat(this.properties.getTomcat().getThreads().getMinSpare())
.isEqualTo(getDefaultProtocol().getMinSpareThreads());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -345,8 +345,8 @@ void errorReportValveIsConfiguredToNotReportStackTraces() {

@Test
void testCustomizeMinSpareThreads() {
bind("server.tomcat.min-spare-threads=10");
assertThat(this.serverProperties.getTomcat().getMinSpareThreads()).isEqualTo(10);
bind("server.tomcat.threads.min-spare=10");
assertThat(this.serverProperties.getTomcat().getThreads().getMinSpare()).isEqualTo(10);
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,22 @@ void customMaxCookies() {
assertThat(boundServerOption(UndertowOptions.MAX_COOKIES)).isEqualTo(4);
}

@Test
void customizeIoThreads() {
bind("server.undertow.threads.io=4");
ConfigurableUndertowWebServerFactory factory = mock(ConfigurableUndertowWebServerFactory.class);
this.customizer.customize(factory);
verify(factory).setIoThreads(4);
}

@Test
void customizeWorkerThreads() {
bind("server.undertow.threads.worker=10");
ConfigurableUndertowWebServerFactory factory = mock(ConfigurableUndertowWebServerFactory.class);
this.customizer.customize(factory);
verify(factory).setWorkerThreads(10);
}

@Test
void allowEncodedSlashes() {
bind("server.undertow.allow-encoded-slash=true");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,9 +137,9 @@ void customizeServletDisplayName() {
@Test
void testCustomizeTomcatMinSpareThreads() {
Map<String, String> map = new HashMap<>();
map.put("server.tomcat.min-spare-threads", "10");
map.put("server.tomcat.threads.min-spare", "10");
bindProperties(map);
assertThat(this.properties.getTomcat().getMinSpareThreads()).isEqualTo(10);
assertThat(this.properties.getTomcat().getThreads().getMinSpare()).isEqualTo(10);
}

@Test
Expand Down