Skip to content
This repository was archived by the owner on Mar 7, 2026. It is now read-only.

Commit 923073f

Browse files
authored
Merge pull request #16 from hyperxpro/1.6.4
Upgrade Dependencies and use Epoll UDP GRO
2 parents af87dc8 + 034c378 commit 923073f

7 files changed

Lines changed: 24 additions & 44 deletions

File tree

pom.xml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@
1616
<maven.compiler.target>11</maven.compiler.target>
1717

1818
<!-- Version Management -->
19-
<netty>4.1.58.Final</netty>
20-
<guava>30.1-jre</guava>
19+
<netty>4.1.63.Final</netty>
20+
<guava>30.1.1-jre</guava>
2121
<commons_cli>1.4</commons_cli>
2222
<log4j2>2.13.3</log4j2>
2323
<junit>5.6.2</junit>
2424
</properties>
2525

2626
<dependencies>
27-
2827
<!-- https://mvnrepository.com/artifact/io.netty/netty-handler -->
2928
<dependency>
3029
<groupId>io.netty</groupId>
@@ -75,10 +74,8 @@
7574
<version>${junit}</version>
7675
<scope>test</scope>
7776
</dependency>
78-
7977
</dependencies>
8078

81-
8279
<build>
8380
<plugins>
8481
<plugin>

src/main/java/com/aayushatharva/sourcecenginequerycacher/Handler.java

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,22 @@
1414

1515
import java.util.Arrays;
1616
import java.util.Random;
17+
import java.util.SplittableRandom;
1718

1819
@ChannelHandler.Sharable
1920
final class Handler extends SimpleChannelInboundHandler<DatagramPacket> {
2021

2122
private static final Logger logger = LogManager.getLogger(Handler.class);
23+
private static final SplittableRandom RANDOM = new SplittableRandom();
2224

2325
protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket datagramPacket) {
2426

2527
if (Config.Stats_PPS) {
2628
Stats.PPS.incrementAndGet();
27-
logger.atDebug().log("Incrementing PPS count by 1 Packet");
2829
}
2930

3031
if (Config.Stats_bPS) {
3132
Stats.BPS.addAndGet(datagramPacket.content().readableBytes());
32-
logger.atDebug().log("Incrementing bPS count by {} Bytes", datagramPacket.content().readableBytes());
3333
}
3434

3535
/*
@@ -49,17 +49,7 @@ protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket datagramPa
4949
* A2S_Player = 9 Bytes
5050
*/
5151
if (datagramPacket.content().readableBytes() == 25 || datagramPacket.content().readableBytes() == 9) {
52-
53-
// Log at Debug
54-
logger.atDebug().log("Received Packet of Length {} bytes from {}:{}",
55-
datagramPacket.content().readableBytes(),
56-
datagramPacket.sender().getAddress().getHostAddress(), datagramPacket.sender().getPort());
57-
5852
if (ByteBufUtil.equals(Packets.A2S_INFO_REQUEST, datagramPacket.content())) {
59-
// Log the Packet
60-
logger.atDebug().log("Sending A2S_INFO Packet to {}:{}",
61-
datagramPacket.sender().getAddress().getHostAddress(), datagramPacket.sender().getPort());
62-
6353
ctx.writeAndFlush(new DatagramPacket(CacheHub.A2S_INFO.retainedDuplicate(), datagramPacket.sender()));
6454
return;
6555
} else if (ByteBufUtil.equals(Packets.A2S_PLAYER_REQUEST_HEADER, datagramPacket.content().slice(0, 5))) {
@@ -86,15 +76,11 @@ protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket datagramPa
8676
private void sendA2SPlayerChallenge(ChannelHandlerContext ctx, DatagramPacket datagramPacket) {
8777
// Generate Random Data of 4 Bytes
8878
byte[] challenge = new byte[4];
89-
new Random(4L).nextBytes(challenge);
79+
RANDOM.nextBytes(challenge);
9080

9181
// Add Challenge to Cache
9282
CacheHub.CHALLENGE_CACHE.put(toHexString(challenge), datagramPacket.sender().getAddress().getHostAddress());
9383

94-
// Log at Debug
95-
logger.debug("Sending A2S_Challenge Player Packet to {}:{}", datagramPacket.sender().getAddress().getHostAddress(),
96-
datagramPacket.sender().getPort());
97-
9884
// Send A2S PLAYER CHALLENGE Packet
9985
ByteBuf byteBuf = ctx.alloc().buffer();
10086
byteBuf.writeBytes(Packets.A2S_PLAYER_CHALLENGE_RESPONSE.retainedDuplicate());
@@ -113,19 +99,16 @@ private void sendA2SPlayerResponse(ChannelHandlerContext ctx, DatagramPacket dat
11399

114100
// Match Client Current IP Address against Cache Stored Client IP Address
115101
if (ipAddressOfClient.equals(datagramPacket.sender().getAddress().getHostAddress())) {
116-
logger.atDebug().log("Sending A2S_PLAYER Packet to {}:{}",
117-
datagramPacket.sender().getAddress().getHostAddress(), datagramPacket.sender().getPort());
118-
119102
ctx.writeAndFlush(new DatagramPacket(CacheHub.A2S_PLAYER.retainedDuplicate(), datagramPacket.sender()));
120103
}
121104
} else {
122-
logger.atDebug().log("Invalid Challenge Code received from {}:{} [REQUEST DROPPED]",
105+
logger.debug("Invalid Challenge Code received from {}:{} [REQUEST DROPPED]",
123106
datagramPacket.sender().getAddress().getHostAddress(), datagramPacket.sender().getPort());
124107
}
125108
}
126109

127110
private void dropLog(DatagramPacket datagramPacket) {
128-
logger.atDebug().log("Dropping Packet of Length {} bytes from {}:{}", datagramPacket.content().readableBytes(),
111+
logger.debug("Dropping Packet of Length {} bytes from {}:{}", datagramPacket.content().readableBytes(),
129112
datagramPacket.sender().getAddress().getHostAddress(), datagramPacket.sender().getPort());
130113
}
131114

src/main/java/com/aayushatharva/sourcecenginequerycacher/Main.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import io.netty.channel.ChannelOption;
1616
import io.netty.channel.EventLoopGroup;
1717
import io.netty.channel.epoll.Epoll;
18+
import io.netty.channel.epoll.EpollChannelOption;
1819
import io.netty.channel.epoll.EpollDatagramChannel;
1920
import io.netty.channel.epoll.EpollEventLoopGroup;
2021
import io.netty.channel.socket.InternetProtocolFamily;
@@ -64,13 +65,14 @@ public static void main(String[] args) {
6465
.option(ChannelOption.SO_RCVBUF, Config.ReceiveBufferSize)
6566
.option(ChannelOption.RCVBUF_ALLOCATOR, new AdaptiveRecvByteBufAllocator())
6667
.option(UnixChannelOption.SO_REUSEPORT, true)
68+
.option(EpollChannelOption.UDP_GRO, true) // Enable UDP GRO
6769
.handler(new Handler());
6870

6971
for (int i = 0; i < Config.Threads; i++) {
7072
// Bind and Start Server
7173
ChannelFuture channelFuture = bootstrap.bind(Config.LocalServer.getAddress(), Config.LocalServer.getPort()).addListener((ChannelFutureListener) future -> {
7274
if (future.isSuccess()) {
73-
logger.atInfo().log("Server Started on Address: {}:{}",
75+
logger.info("Server Started on Address: {}:{}",
7476
((InetSocketAddress) future.channel().localAddress()).getAddress().getHostAddress(),
7577
((InetSocketAddress) future.channel().localAddress()).getPort());
7678
} else {

src/main/java/com/aayushatharva/sourcecenginequerycacher/Stats.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,29 @@ final class Stats extends Thread {
2121
@Override
2222
public void run() {
2323

24-
logger.atInfo().log("Starting Stats, PPS Enabled: " + Config.Stats_PPS + ", bPS Enabled: " + Config.Stats_bPS);
24+
logger.info("Starting Stats, PPS Enabled: " + Config.Stats_PPS + ", bPS Enabled: " + Config.Stats_bPS);
2525

2626
while (keepRunning) {
2727

28+
String timestamp = getTimestamp();
29+
2830
if (Config.Stats_PPS && Config.Stats_bPS) {
29-
System.out.print("[" + getTimestamp() + "] [STATS] PPS: " + PPS.getAndSet(0L));
30-
System.out.println(" | bPS: " + calculateBps());
31+
System.out.print("[" + timestamp + "] [STATS] p/s: " + PPS.getAndSet(0L));
32+
System.out.println(" | b/s: " + calculateBps());
3133
} else {
3234
if (Config.Stats_PPS) {
33-
System.out.println("[" + getTimestamp() + "] [STATS] PPS: " + PPS.getAndSet(0L) + " | bPS: 0");
35+
System.out.println("[" + timestamp + "] [STATS] p/s: " + PPS.getAndSet(0L) + " | b/s: 0");
3436
}
3537

3638
if (Config.Stats_bPS) {
37-
System.out.println("[" + getTimestamp() + "] [STATS] PPS: 0 | bPS: " + calculateBps());
39+
System.out.println("[" + timestamp + "] [STATS] p/s: 0 | b/s: " + calculateBps());
3840
}
3941
}
4042

4143
try {
4244
sleep(1000L);
4345
} catch (InterruptedException e) {
44-
logger.atError().withThrowable(e).log("Error at Stats During Interval Sleep");
46+
logger.error("Error at Stats During Interval Sleep", e);
4547
return;
4648
}
4749

@@ -65,7 +67,7 @@ private String getTimestamp() {
6567
}
6668

6769
public void shutdown() {
68-
this.interrupt();
70+
interrupt();
6971
keepRunning = false;
7072
}
7173
}

src/main/java/com/aayushatharva/sourcecenginequerycacher/gameserver/a2sinfo/InfoClient.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ public InfoClient(String name) {
2222

2323
@SuppressWarnings("BusyWait")
2424
public void run() {
25-
2625
try {
27-
2826
Bootstrap bootstrap = new Bootstrap()
2927
.group(Main.eventLoopGroup)
3028
.channelFactory(EpollDatagramChannel::new)

src/main/java/com/aayushatharva/sourcecenginequerycacher/gameserver/a2sinfo/InfoHandler.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ final class InfoHandler extends SimpleChannelInboundHandler<DatagramPacket> {
1414
@Override
1515
protected void channelRead0(ChannelHandlerContext channelHandlerContext, DatagramPacket datagramPacket) {
1616
// Set new Packet Data
17-
CacheHub.A2S_INFO.clear();
18-
CacheHub.A2S_INFO.writeBytes(datagramPacket.content());
17+
CacheHub.A2S_INFO.clear().writeBytes(datagramPacket.content());
1918

2019
logger.debug("New A2SInfo Update Cached Successfully");
2120
}

src/main/java/com/aayushatharva/sourcecenginequerycacher/gameserver/a2splayer/PlayerHandler.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,14 @@ protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket datagramPa
2222
.writeBytes(Packets.A2S_PLAYER_REQUEST_HEADER.retainedDuplicate())
2323
.writeBytes(datagramPacket.content().slice(5, 4));
2424

25-
ctx.channel().writeAndFlush(responseBuf);
25+
ctx.writeAndFlush(responseBuf);
2626
} else if (ByteBufUtil.equals(Packets.A2S_PLAYER_RESPONSE_HEADER, datagramPacket.content().slice(0, 5))) {
2727
// Set new Packet Data
28-
CacheHub.A2S_PLAYER.clear();
29-
CacheHub.A2S_PLAYER.writeBytes(datagramPacket.content());
28+
CacheHub.A2S_PLAYER.clear().writeBytes(datagramPacket.content());
3029

31-
logger.atDebug().log("New A2SPlayer Update Cached Successfully");
30+
logger.debug("New A2SPlayer Update Cached Successfully");
3231
} else {
33-
logger.atError().log("Received unsupported A2S Player Response from Game Server: {}", ByteBufUtil.hexDump(datagramPacket.content()));
32+
logger.error("Received unsupported A2S Player Response from Game Server: {}", ByteBufUtil.hexDump(datagramPacket.content()));
3433
}
3534
}
3635
}

0 commit comments

Comments
 (0)