Skip to content

Commit a450c82

Browse files
committed
improving network module
1 parent 7146c61 commit a450c82

File tree

9 files changed

+44
-27
lines changed

9 files changed

+44
-27
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ repositories {
1414
}
1515
1616
ext {
17-
rlibVersion = "10.0.alpha"
17+
rlibVersion = "10.0.alpha3"
1818
}
1919
2020
dependencies {

rlib-network/src/loadTest/java/javasabr/rlib/network/StringNetworkLoadTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import javasabr.rlib.network.client.ClientNetwork;
2020
import javasabr.rlib.network.impl.DefaultBufferAllocator;
2121
import javasabr.rlib.network.impl.StringDataConnection;
22-
import javasabr.rlib.network.impl.StringDataSslConnection;
2322
import javasabr.rlib.network.packet.impl.StringReadableNetworkPacket;
2423
import javasabr.rlib.network.packet.impl.StringWritableNetworkPacket;
2524
import javasabr.rlib.network.server.ServerNetwork;

rlib-network/src/loadTest/java/javasabr/rlib/network/StringSslNetworkLoadTest.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@
1919
import javasabr.rlib.network.ServerNetworkConfig.SimpleServerNetworkConfig;
2020
import javasabr.rlib.network.client.ClientNetwork;
2121
import javasabr.rlib.network.impl.DefaultBufferAllocator;
22-
import javasabr.rlib.network.impl.StringDataConnection;
2322
import javasabr.rlib.network.impl.StringDataSslConnection;
24-
import javasabr.rlib.network.packet.impl.AbstractSslNetworkPacketReader;
25-
import javasabr.rlib.network.packet.impl.AbstractSslNetworkPacketWriter;
2623
import javasabr.rlib.network.packet.impl.StringReadableNetworkPacket;
2724
import javasabr.rlib.network.packet.impl.StringWritableNetworkPacket;
2825
import javasabr.rlib.network.server.ServerNetwork;

rlib-network/src/main/java/javasabr/rlib/network/BufferAllocator.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package javasabr.rlib.network;
22

33
import java.nio.ByteBuffer;
4-
import org.jspecify.annotations.Nullable;
54

65
/**
76
* The interface to implement a buffer allocator for network things.

rlib-network/src/main/java/javasabr/rlib/network/NetworkConfig.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@ default int retryDelayInMs() {
8383
return 1000;
8484
}
8585

86+
/**
87+
* Gets a max allowed empty reads from socket channel before closing a connection.
88+
*/
89+
default int maxEmptyReadsBeforeClose() {
90+
return 3;
91+
}
92+
8693
default ByteOrder byteOrder() {
8794
return ByteOrder.BIG_ENDIAN;
8895
}

rlib-network/src/main/java/javasabr/rlib/network/impl/StringDataSslConnection.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import javasabr.rlib.network.BufferAllocator;
55
import javasabr.rlib.network.Network;
66
import javasabr.rlib.network.packet.impl.StringReadableNetworkPacket;
7-
import javasabr.rlib.network.packet.impl.StringWritableNetworkPacket;
87
import javax.net.ssl.SSLContext;
98

109
/**

rlib-network/src/main/java/javasabr/rlib/network/packet/impl/AbstractNetworkPacketReader.java

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
import java.nio.ByteBuffer;
66
import java.nio.channels.AsynchronousCloseException;
77
import java.nio.channels.AsynchronousSocketChannel;
8+
import java.nio.channels.ClosedChannelException;
89
import java.nio.channels.CompletionHandler;
910
import java.nio.channels.InterruptedByTimeoutException;
10-
import java.util.concurrent.CompletableFuture;
1111
import java.util.concurrent.TimeUnit;
1212
import java.util.concurrent.atomic.AtomicBoolean;
13+
import java.util.concurrent.atomic.AtomicInteger;
1314
import java.util.function.Consumer;
1415
import javasabr.rlib.common.util.BufferUtils;
1516
import javasabr.rlib.network.BufferAllocator;
16-
import javasabr.rlib.network.Connection;
1717
import javasabr.rlib.network.Network;
1818
import javasabr.rlib.network.NetworkConfig;
1919
import javasabr.rlib.network.UnsafeConnection;
@@ -55,6 +55,7 @@ public void failed(Throwable exc, ByteBuffer readingBuffer) {
5555
};
5656

5757
final AtomicBoolean reading = new AtomicBoolean(false);
58+
final AtomicInteger emptyReadsCounter = new AtomicInteger(0);
5859

5960
final C connection;
6061
final AsynchronousSocketChannel socketChannel;
@@ -117,8 +118,9 @@ protected void startReadImpl() {
117118
socketChannel.read(buffer, buffer, readChannelHandler);
118119
} catch (RuntimeException ex) {
119120
log.error(ex);
120-
reading.compareAndSet(true, false);
121-
retryReadLater();
121+
if (reading.compareAndSet(true, false)) {
122+
retryReadLater();
123+
}
122124
}
123125
}
124126

@@ -392,20 +394,11 @@ protected void freeTempBigBuffers() {
392394
protected void handleReceivedData(int receivedBytes, ByteBuffer readingBuffer) {
393395
updateActivityFunction.run();
394396
if (receivedBytes == -1) {
395-
log.debug(remoteAddress(), "[%s] Received empty bytes from channel"::formatted);
396-
if (connection.closed()) {
397-
reading.compareAndSet(true, false);
398-
return;
399-
} else if (!socketChannel.isOpen()) {
400-
connection.close();
401-
return;
402-
}
403-
if (reading.compareAndSet(false, true)) {
404-
retryReadLater();
405-
}
397+
handleEmptyReadFromChannel();
406398
} else {
407399
log.debug(remoteAddress(), receivedBytes, "[%s] Received [%s] bytes from channel"::formatted);
408400
readingBuffer.flip();
401+
emptyReadsCounter.set(0);
409402
try {
410403
readPackets(readingBuffer);
411404
} catch (Exception e) {
@@ -415,6 +408,31 @@ protected void handleReceivedData(int receivedBytes, ByteBuffer readingBuffer) {
415408
}
416409
}
417410

411+
protected void handleEmptyReadFromChannel() {
412+
log.debug(remoteAddress(), "[%s] Received empty bytes from channel"::formatted);
413+
414+
if (connection.closed()) {
415+
reading.compareAndSet(true, false);
416+
return;
417+
} else if (!socketChannel.isOpen()) {
418+
connection.close();
419+
return;
420+
}
421+
422+
NetworkConfig config = connection
423+
.network()
424+
.config();
425+
426+
if (emptyReadsCounter.incrementAndGet() > config.maxEmptyReadsBeforeClose()) {
427+
connection.close();
428+
return;
429+
}
430+
431+
if (reading.compareAndSet(true, false)) {
432+
retryReadLater();
433+
}
434+
}
435+
418436
/**
419437
* Handles the exception during receiving data from the channel.
420438
*
@@ -424,12 +442,14 @@ protected void handleReceivedData(int receivedBytes, ByteBuffer readingBuffer) {
424442
protected void handleFailedReceiving(Throwable exception, ByteBuffer readingBuffer) {
425443
if (exception instanceof InterruptedByTimeoutException) {
426444
if (reading.compareAndSet(true, false)) {
427-
startRead();
445+
retryReadLater();
428446
}
429447
return;
430448
}
431449
if (exception instanceof AsynchronousCloseException) {
432450
log.info(remoteAddress(), "[%s] Connection was closed"::formatted);
451+
} else if (exception instanceof ClosedChannelException) {
452+
log.info(remoteAddress(), "[%s] Connection was closed"::formatted);
433453
} else {
434454
log.error(exception);
435455
connection.close();

rlib-network/src/main/java/javasabr/rlib/network/packet/impl/AbstractReusableWritableNetworkPacket.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import javasabr.rlib.common.util.ClassUtils;
1010
import javasabr.rlib.network.Connection;
1111
import javasabr.rlib.network.packet.ReusableWritablePacket;
12-
import javasabr.rlib.network.packet.WritableNetworkPacket;
1312
import javasabr.rlib.reusable.pool.Pool;
1413
import javasabr.rlib.reusable.pool.PoolFactory;
1514
import lombok.AccessLevel;

rlib-network/src/main/java/javasabr/rlib/network/packet/impl/IdBasedNetworkPacketWriter.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
import java.nio.channels.AsynchronousSocketChannel;
55
import java.util.function.Consumer;
66
import java.util.function.Supplier;
7-
import javasabr.rlib.common.function.NotNullBiConsumer;
8-
import javasabr.rlib.common.function.NotNullConsumer;
9-
import javasabr.rlib.common.function.NullableSupplier;
107
import javasabr.rlib.functions.ObjBoolConsumer;
118
import javasabr.rlib.network.BufferAllocator;
129
import javasabr.rlib.network.Connection;

0 commit comments

Comments
 (0)