Skip to content

Commit 629806c

Browse files
authored
Merge pull request #1429 from nats-io/write-timeout-tuning
Ensure write timeout is not less than 100 nanoseconds
2 parents e55c9f6 + 8ec6dc9 commit 629806c

File tree

3 files changed

+15
-14
lines changed

3 files changed

+15
-14
lines changed

src/main/java/io/nats/client/Options.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ public class Options {
125125
@Deprecated
126126
public static final long MINIMUM_SOCKET_WRITE_TIMEOUT_GT_CONNECTION_TIMEOUT = 100;
127127

128+
/**
129+
* This is set to 100 nanos to ensure that the scheduled task can execute
130+
*/
131+
public static final long MINIMUM_SOCKET_WRITE_TIMEOUT_NANOS = 100;
132+
128133
/**
129134
* @deprecated No longer enforcing a minimum
130135
*/
@@ -1955,8 +1960,8 @@ else if (useDefaultTls) {
19551960
socketReadTimeoutMillis = 0; // just for consistency. The connection compares to gt 0
19561961
}
19571962

1958-
if (socketWriteTimeout != null && socketWriteTimeout.toMillis() < 1) {
1959-
socketWriteTimeout = null;
1963+
if (socketWriteTimeout != null && socketWriteTimeout.toNanos() < MINIMUM_SOCKET_WRITE_TIMEOUT_NANOS) {
1964+
throw new IllegalArgumentException("Socket Write Timeout cannot be less than " + MINIMUM_SOCKET_WRITE_TIMEOUT_NANOS + " nanoseconds.");
19601965
}
19611966

19621967
if (socketSoLinger < 0) {

src/main/java/io/nats/client/impl/SocketDataPortWithWriteTimeout.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.jspecify.annotations.NonNull;
2222

2323
import java.io.IOException;
24+
import java.util.concurrent.TimeUnit;
2425
import java.util.concurrent.atomic.AtomicLong;
2526

2627
/**
@@ -30,7 +31,7 @@
3031
public class SocketDataPortWithWriteTimeout extends SocketDataPort {
3132

3233
private long writeTimeoutNanos;
33-
private long delayPeriodMillis;
34+
private long delayPeriodNanos;
3435
private ScheduledTask writeWatchTask;
3536
private final AtomicLong writeMustBeDoneBy;
3637

@@ -41,21 +42,16 @@ public SocketDataPortWithWriteTimeout() {
4142
@Override
4243
public void afterConstruct(Options options) {
4344
super.afterConstruct(options);
44-
long writeTimeoutMillis;
45-
if (options.getSocketWriteTimeout() == null) {
46-
writeTimeoutMillis = Options.DEFAULT_SOCKET_WRITE_TIMEOUT.toMillis();
47-
}
48-
else {
49-
writeTimeoutMillis = options.getSocketWriteTimeout().toMillis();
50-
}
51-
delayPeriodMillis = writeTimeoutMillis * 51 / 100;
52-
writeTimeoutNanos = writeTimeoutMillis * 1_000_000;
45+
writeTimeoutNanos = options.getSocketWriteTimeout() == null
46+
? Options.DEFAULT_SOCKET_WRITE_TIMEOUT.toNanos()
47+
: options.getSocketWriteTimeout().toNanos();
48+
delayPeriodNanos = writeTimeoutNanos * 51 / 100;
5349
}
5450

5551
@Override
5652
public void connect(@NonNull NatsConnection conn, @NonNull NatsUri nuri, long timeoutNanos) throws IOException {
5753
super.connect(conn, nuri, timeoutNanos);
58-
writeWatchTask = new ScheduledTask(conn.getScheduledExecutor(), delayPeriodMillis,
54+
writeWatchTask = new ScheduledTask(conn.getScheduledExecutor(), delayPeriodNanos, TimeUnit.NANOSECONDS,
5955
() -> {
6056
// if now is after when it was supposed to be done by
6157
if (NatsSystemClock.nanoTime() > writeMustBeDoneBy.get()) {

src/main/java/io/nats/client/support/ScheduledTask.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public ScheduledTask(String id, ScheduledExecutorService ses, long initialDelay,
6767
this.initialDelayNanos = unit.toNanos(initialDelay);
6868
this.periodNanos = unit.toNanos(period);
6969
scheduledFutureRef = new AtomicReference<>(
70-
ses.scheduleAtFixedRate(this, initialDelay, period, unit));
70+
ses.scheduleAtFixedRate(this, initialDelayNanos, periodNanos, TimeUnit.NANOSECONDS));
7171
}
7272

7373
public long getInitialDelayNanos() {

0 commit comments

Comments
 (0)