Skip to content

Commit d240e73

Browse files
committed
Make TCP option generic for the new TcpConfig.
Motivation: TcpConfig holds the same specialized TCP option than TCPSSLOptions. Some of them are OS specific. Changes: Make the TCP option a generic TcpOption constant like class.
1 parent aa8ba34 commit d240e73

9 files changed

Lines changed: 212 additions & 178 deletions

File tree

vertx-core/src/main/java/examples/CoreExamples.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ public void configureBSDOptions(Vertx vertx, boolean reusePort) {
522522

523523
// Available on BSD
524524
tcpConfig
525-
.setReusePort(reusePort);
525+
.setSoReusePort(reusePort);
526526

527527
vertx.createHttpServer(config);
528528
}

vertx-core/src/main/java/io/vertx/core/impl/transports/EpollTransport.java

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,18 @@
1818
import io.netty.channel.socket.DatagramChannel;
1919
import io.netty.channel.socket.InternetProtocolFamily;
2020
import io.netty.channel.unix.DomainSocketAddress;
21+
import io.netty.channel.unix.UnixChannelOption;
2122
import io.vertx.core.datagram.DatagramSocketOptions;
2223
import io.vertx.core.net.TcpConfig;
24+
import io.vertx.core.net.TcpOption;
2325
import io.vertx.core.net.impl.SocketAddressImpl;
2426
import io.vertx.core.spi.transport.Transport;
2527

2628
import java.net.SocketAddress;
2729

30+
import static io.vertx.core.impl.transports.NioTransport.configChildOption;
31+
import static io.vertx.core.impl.transports.NioTransport.configOption;
32+
2833
/**
2934
* @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
3035
*/
@@ -42,7 +47,7 @@ public static int getPendingFastOpenRequestsThreshold() {
4247
}
4348

4449
/**
45-
* Set the number of of pending TFO connections in SYN-RCVD state for TCP_FASTOPEN
50+
* Set the number of pending TFO connections in SYN-RCVD state for TCP_FASTOPEN
4651
* <p/>
4752
* If this value goes over a certain limit the server disables all TFO connections.
4853
*/
@@ -126,29 +131,25 @@ public void configure(DatagramChannel channel, DatagramSocketOptions options) {
126131
}
127132

128133
@Override
129-
public void configure(TcpConfig options, boolean domainSocket, ServerBootstrap bootstrap) {
134+
public void configure(TcpConfig config, boolean domainSocket, ServerBootstrap bootstrap) {
130135
if (!domainSocket) {
131-
bootstrap.option(EpollChannelOption.SO_REUSEPORT, options.isReusePort());
132-
if (options.isTcpFastOpen()) {
133-
bootstrap.option(ChannelOption.TCP_FASTOPEN, options.isTcpFastOpen() ? pendingFastOpenRequestsThreshold : 0);
134-
}
135-
bootstrap.childOption(EpollChannelOption.TCP_USER_TIMEOUT, options.getTcpUserTimeout());
136-
bootstrap.childOption(EpollChannelOption.TCP_QUICKACK, options.isTcpQuickAck());
137-
bootstrap.childOption(EpollChannelOption.TCP_CORK, options.isTcpCork());
136+
bootstrap.option(UnixChannelOption.SO_REUSEPORT, config.isSoReusePort());
137+
configOption(bootstrap, config, TcpOption.FASTOPEN, EpollChannelOption.TCP_FASTOPEN);
138+
configChildOption(bootstrap, config, TcpOption.USER_TIMEOUT, EpollChannelOption.TCP_USER_TIMEOUT);
139+
configChildOption(bootstrap, config, TcpOption.QUICKACK, EpollChannelOption.TCP_QUICKACK);
140+
configChildOption(bootstrap, config, TcpOption.CORK, EpollChannelOption.TCP_CORK);
138141
}
139-
Transport.super.configure(options, domainSocket, bootstrap);
142+
Transport.super.configure(config, domainSocket, bootstrap);
140143
}
141144

142145
@Override
143-
public void configure(TcpConfig options, boolean domainSocket, Bootstrap bootstrap) {
146+
public void configure(TcpConfig config, boolean domainSocket, Bootstrap bootstrap) {
144147
if (!domainSocket) {
145-
if (options.isTcpFastOpen()) {
146-
bootstrap.option(ChannelOption.TCP_FASTOPEN_CONNECT, options.isTcpFastOpen());
147-
}
148-
bootstrap.option(EpollChannelOption.TCP_USER_TIMEOUT, options.getTcpUserTimeout());
149-
bootstrap.option(EpollChannelOption.TCP_QUICKACK, options.isTcpQuickAck());
150-
bootstrap.option(EpollChannelOption.TCP_CORK, options.isTcpCork());
148+
NioTransport.configOption(bootstrap, config, TcpOption.FASTOPEN_CONNECT, EpollChannelOption.TCP_FASTOPEN_CONNECT);
149+
NioTransport.configOption(bootstrap, config, TcpOption.USER_TIMEOUT, EpollChannelOption.TCP_USER_TIMEOUT);
150+
NioTransport.configOption(bootstrap, config, TcpOption.QUICKACK, EpollChannelOption.TCP_QUICKACK);
151+
NioTransport.configOption(bootstrap, config, TcpOption.CORK, EpollChannelOption.TCP_CORK);
151152
}
152-
Transport.super.configure(options, domainSocket, bootstrap);
153+
Transport.super.configure(config, domainSocket, bootstrap);
153154
}
154155
}

vertx-core/src/main/java/io/vertx/core/impl/transports/IoUringTransport.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,15 @@
1919
import io.netty.channel.uring.*;
2020
import io.vertx.core.datagram.DatagramSocketOptions;
2121
import io.vertx.core.net.TcpConfig;
22+
import io.vertx.core.net.TcpOption;
2223
import io.vertx.core.net.impl.SocketAddressImpl;
2324
import io.vertx.core.spi.transport.Transport;
2425

2526
import java.net.SocketAddress;
2627

28+
import static io.vertx.core.impl.transports.NioTransport.configChildOption;
29+
import static io.vertx.core.impl.transports.NioTransport.configOption;
30+
2731
/**
2832
* @author <a href="mailto:julien@julienviet.com">Julien Viet</a>
2933
*/
@@ -129,31 +133,27 @@ public void configure(DatagramChannel channel, DatagramSocketOptions options) {
129133
}
130134

131135
@Override
132-
public void configure(TcpConfig options, boolean domainSocket, ServerBootstrap bootstrap) {
136+
public void configure(TcpConfig config, boolean domainSocket, ServerBootstrap bootstrap) {
133137
if (domainSocket) {
134138
throw new IllegalArgumentException();
135139
}
136-
bootstrap.option(IoUringChannelOption.SO_REUSEPORT, options.isReusePort());
137-
if (options.isTcpFastOpen()) {
138-
bootstrap.option(IoUringChannelOption.TCP_FASTOPEN, options.isTcpFastOpen() ? pendingFastOpenRequestsThreshold : 0);
139-
}
140-
bootstrap.childOption(IoUringChannelOption.TCP_USER_TIMEOUT, options.getTcpUserTimeout());
141-
bootstrap.childOption(IoUringChannelOption.TCP_QUICKACK, options.isTcpQuickAck());
142-
bootstrap.childOption(IoUringChannelOption.TCP_CORK, options.isTcpCork());
143-
Transport.super.configure(options, false, bootstrap);
140+
bootstrap.option(IoUringChannelOption.SO_REUSEPORT, config.isSoReusePort());
141+
configOption(bootstrap, config, TcpOption.FASTOPEN, IoUringChannelOption.TCP_FASTOPEN);
142+
configChildOption(bootstrap, config, TcpOption.USER_TIMEOUT, IoUringChannelOption.TCP_USER_TIMEOUT);
143+
configChildOption(bootstrap, config, TcpOption.QUICKACK, IoUringChannelOption.TCP_QUICKACK);
144+
configChildOption(bootstrap, config, TcpOption.CORK, IoUringChannelOption.TCP_CORK);
145+
Transport.super.configure(config, false, bootstrap);
144146
}
145147

146148
@Override
147-
public void configure(TcpConfig options, boolean domainSocket, Bootstrap bootstrap) {
149+
public void configure(TcpConfig config, boolean domainSocket, Bootstrap bootstrap) {
148150
if (domainSocket) {
149151
throw new IllegalArgumentException();
150152
}
151-
if (options.isTcpFastOpen()) {
152-
bootstrap.option(IoUringChannelOption.TCP_FASTOPEN_CONNECT, options.isTcpFastOpen());
153-
}
154-
bootstrap.option(IoUringChannelOption.TCP_USER_TIMEOUT, options.getTcpUserTimeout());
155-
bootstrap.option(IoUringChannelOption.TCP_QUICKACK, options.isTcpQuickAck());
156-
bootstrap.option(IoUringChannelOption.TCP_CORK, options.isTcpCork());
157-
Transport.super.configure(options, false, bootstrap);
153+
NioTransport.configOption(bootstrap, config, TcpOption.FASTOPEN_CONNECT, IoUringChannelOption.TCP_FASTOPEN_CONNECT);
154+
NioTransport.configOption(bootstrap, config, TcpOption.USER_TIMEOUT, IoUringChannelOption.TCP_USER_TIMEOUT);
155+
NioTransport.configOption(bootstrap, config, TcpOption.QUICKACK, IoUringChannelOption.TCP_QUICKACK);
156+
NioTransport.configOption(bootstrap, config, TcpOption.CORK, IoUringChannelOption.TCP_CORK);
157+
Transport.super.configure(config, false, bootstrap);
158158
}
159159
}

vertx-core/src/main/java/io/vertx/core/impl/transports/KQueueTransport.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,11 @@ public ChannelFactory<? extends ServerChannel> serverChannelFactory(boolean doma
9898
}
9999

100100
@Override
101-
public void configure(TcpConfig options, boolean domainSocket, ServerBootstrap bootstrap) {
101+
public void configure(TcpConfig config, boolean domainSocket, ServerBootstrap bootstrap) {
102102
if (!domainSocket) {
103-
bootstrap.option(KQueueChannelOption.SO_REUSEPORT, options.isReusePort());
103+
bootstrap.option(KQueueChannelOption.SO_REUSEPORT, config.isSoReusePort());
104104
}
105-
Transport.super.configure(options, domainSocket, bootstrap);
105+
Transport.super.configure(config, domainSocket, bootstrap);
106106
}
107107

108108
@Override

vertx-core/src/main/java/io/vertx/core/impl/transports/NioTransport.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,21 @@
1010
*/
1111
package io.vertx.core.impl.transports;
1212

13-
import io.netty.channel.Channel;
14-
import io.netty.channel.ChannelFactory;
15-
import io.netty.channel.IoHandlerFactory;
16-
import io.netty.channel.ServerChannel;
13+
import io.netty.bootstrap.AbstractBootstrap;
14+
import io.netty.bootstrap.ServerBootstrap;
15+
import io.netty.channel.*;
1716
import io.netty.channel.nio.NioIoHandler;
1817
import io.netty.channel.socket.DatagramChannel;
1918
import io.netty.channel.socket.InternetProtocolFamily;
2019
import io.netty.channel.socket.nio.*;
20+
import io.vertx.core.net.TcpConfig;
21+
import io.vertx.core.net.TcpOption;
2122
import io.vertx.core.spi.transport.Transport;
2223

2324
import java.net.SocketAddress;
2425

2526
public class NioTransport implements Transport {
27+
2628
/**
2729
* The NIO transport, always there.
2830
*/
@@ -96,4 +98,18 @@ public ChannelFactory<? extends ServerChannel> serverChannelFactory(boolean doma
9698
}
9799
return NioServerSocketChannel::new;
98100
}
101+
102+
public static <T> void configOption(AbstractBootstrap<?, ?> bootstrap, TcpConfig config, TcpOption<T> tcpOption, ChannelOption<T> channelOption) {
103+
T value = config.getOption(tcpOption);
104+
if (value != null) {
105+
bootstrap.option(channelOption, value);
106+
}
107+
}
108+
109+
public static <T> void configChildOption(ServerBootstrap bootstrap, TcpConfig config, TcpOption<T> tcpOption, ChannelOption<T> channelOption) {
110+
T value = config.getOption(tcpOption);
111+
if (value != null) {
112+
bootstrap.childOption(channelOption, value);
113+
}
114+
}
99115
}

vertx-core/src/main/java/io/vertx/core/net/TCPSSLOptions.java

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.vertx.codegen.annotations.GenIgnore;
1616
import io.vertx.codegen.json.annotations.JsonGen;
1717
import io.vertx.core.buffer.Buffer;
18+
import io.vertx.core.impl.transports.EpollTransport;
1819
import io.vertx.core.json.JsonObject;
1920

2021
import java.util.*;
@@ -224,6 +225,11 @@ private void init() {
224225
sslOptions = null;
225226
}
226227

228+
private <T> T getOrDefaultOption(TcpOption<T> option) {
229+
T value = transportOptions.getOption(option);
230+
return value != null ? value : option.defaultValue;
231+
}
232+
227233
protected SSLOptions getOrCreateSSLOptions() {
228234
if (sslOptions == null) {
229235
sslOptions = createSSLOptions();
@@ -307,20 +313,20 @@ public TCPSSLOptions setTrafficClass(int trafficClass) {
307313

308314
@Override
309315
public boolean isReusePort() {
310-
return transportOptions.isReusePort();
316+
return transportOptions.isSoReusePort();
311317
}
312318

313319
@Override
314320
public TCPSSLOptions setReusePort(boolean reusePort) {
315-
transportOptions.setReusePort(reusePort);
321+
transportOptions.setSoReusePort(reusePort);
316322
return this;
317323
}
318324

319325
/**
320326
* @return TCP no delay enabled ?
321327
*/
322328
public boolean isTcpNoDelay() {
323-
return transportOptions.isTcpNoDelay();
329+
return getOrDefaultOption(TcpOption.NODELAY);
324330
}
325331

326332
/**
@@ -330,15 +336,15 @@ public boolean isTcpNoDelay() {
330336
* @return a reference to this, so the API can be used fluently
331337
*/
332338
public TCPSSLOptions setTcpNoDelay(boolean tcpNoDelay) {
333-
transportOptions.setTcpNoDelay(tcpNoDelay);
339+
transportOptions.setOption(TcpOption.NODELAY, tcpNoDelay);
334340
return this;
335341
}
336342

337343
/**
338344
* @return is TCP keep alive enabled?
339345
*/
340346
public boolean isTcpKeepAlive() {
341-
return transportOptions.isTcpKeepAlive();
347+
return transportOptions.isSoKeepAlive();
342348
}
343349

344350
/**
@@ -348,7 +354,7 @@ public boolean isTcpKeepAlive() {
348354
* @return a reference to this, so the API can be used fluently
349355
*/
350356
public TCPSSLOptions setTcpKeepAlive(boolean tcpKeepAlive) {
351-
transportOptions.setTcpKeepAlive(tcpKeepAlive);
357+
transportOptions.setSoKeepAlive(tcpKeepAlive);
352358
return this;
353359
}
354360

@@ -681,7 +687,12 @@ public TCPSSLOptions removeEnabledSecureTransportProtocol(String protocol) {
681687
* @return wether {@code TCP_FASTOPEN} option is enabled
682688
*/
683689
public boolean isTcpFastOpen() {
684-
return transportOptions.isTcpFastOpen();
690+
if (this instanceof ClientOptionsBase) {
691+
return getOrDefaultOption(TcpOption.FASTOPEN_CONNECT);
692+
} else {
693+
Integer value = transportOptions.getOption(TcpOption.FASTOPEN);
694+
return value != null && value > 0;
695+
}
685696
}
686697

687698
/**
@@ -690,15 +701,23 @@ public boolean isTcpFastOpen() {
690701
* @param tcpFastOpen the fast open value
691702
*/
692703
public TCPSSLOptions setTcpFastOpen(boolean tcpFastOpen) {
693-
transportOptions.setTcpFastOpen(tcpFastOpen);
704+
if (this instanceof ClientOptionsBase) {
705+
transportOptions.setOption(TcpOption.FASTOPEN_CONNECT, tcpFastOpen);
706+
} else {
707+
if (tcpFastOpen) {
708+
transportOptions.setOption(TcpOption.FASTOPEN, EpollTransport.getPendingFastOpenRequestsThreshold());
709+
} else {
710+
transportOptions.setOption(TcpOption.FASTOPEN, null);
711+
}
712+
}
694713
return this;
695714
}
696715

697716
/**
698717
* @return wether {@code TCP_CORK} option is enabled
699718
*/
700719
public boolean isTcpCork() {
701-
return transportOptions.isTcpCork();
720+
return getOrDefaultOption(TcpOption.CORK);
702721
}
703722

704723
/**
@@ -707,15 +726,15 @@ public boolean isTcpCork() {
707726
* @param tcpCork the cork value
708727
*/
709728
public TCPSSLOptions setTcpCork(boolean tcpCork) {
710-
transportOptions.setTcpCork(tcpCork);
729+
transportOptions.setOption(TcpOption.CORK, tcpCork);
711730
return this;
712731
}
713732

714733
/**
715734
* @return wether {@code TCP_QUICKACK} option is enabled
716735
*/
717736
public boolean isTcpQuickAck() {
718-
return transportOptions.isTcpQuickAck();
737+
return getOrDefaultOption(TcpOption.QUICKACK);
719738
}
720739

721740
/**
@@ -724,7 +743,7 @@ public boolean isTcpQuickAck() {
724743
* @param tcpQuickAck the quick ack value
725744
*/
726745
public TCPSSLOptions setTcpQuickAck(boolean tcpQuickAck) {
727-
transportOptions.setTcpQuickAck(tcpQuickAck);
746+
transportOptions.setOption(TcpOption.QUICKACK, tcpQuickAck);
728747
return this;
729748
}
730749

@@ -733,7 +752,7 @@ public TCPSSLOptions setTcpQuickAck(boolean tcpQuickAck) {
733752
* @return the {@code TCP_USER_TIMEOUT} value
734753
*/
735754
public int getTcpUserTimeout() {
736-
return transportOptions.getTcpUserTimeout();
755+
return getOrDefaultOption(TcpOption.USER_TIMEOUT);
737756
}
738757

739758
/**
@@ -742,7 +761,7 @@ public int getTcpUserTimeout() {
742761
* @param tcpUserTimeout the tcp user timeout value
743762
*/
744763
public TCPSSLOptions setTcpUserTimeout(int tcpUserTimeout) {
745-
transportOptions.setTcpUserTimeout(tcpUserTimeout);
764+
transportOptions.setOption(TcpOption.USER_TIMEOUT, tcpUserTimeout);
746765
return this;
747766
}
748767

0 commit comments

Comments
 (0)