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

Commit 5707852

Browse files
author
Tarek
committed
try to fix finally the screen system OutOfMemory bug and include the Tsunami screen system
1 parent d4a865c commit 5707852

File tree

10 files changed

+115
-59
lines changed

10 files changed

+115
-59
lines changed

Jenkinsfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ pipeline {
1515
}
1616
stage('Version') {
1717
steps {
18-
sh 'mvn versions:set -DnewVersion=2.1.14.1'
18+
sh 'mvn versions:set -DnewVersion=2.1.14.2'
1919
}
2020
}
2121
stage('Compile') {

cloudnet-core/src/main/java/de/dytanic/cloudnetcore/network/NetworkManager.java

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import de.dytanic.cloudnet.lib.player.OfflinePlayer;
1515
import de.dytanic.cloudnet.lib.player.PlayerCommandExecution;
1616
import de.dytanic.cloudnet.lib.player.PlayerConnection;
17+
import de.dytanic.cloudnet.lib.scheduler.TaskScheduler;
1718
import de.dytanic.cloudnet.lib.server.ServerGroup;
1819
import de.dytanic.cloudnet.lib.server.ServerGroupMode;
1920
import de.dytanic.cloudnet.lib.server.SimpleServerGroup;
@@ -45,7 +46,6 @@
4546
import java.util.Collection;
4647
import java.util.LinkedList;
4748
import java.util.UUID;
48-
import java.util.concurrent.ExecutorService;
4949

5050
/**
5151
* Created by Tareko on 19.07.2017.
@@ -56,7 +56,6 @@ public final class NetworkManager {
5656
private java.util.Map<UUID, CloudPlayer> waitingPlayers = NetworkUtils.newConcurrentHashMap();
5757
private java.util.Map<UUID, CloudPlayer> onlinePlayers = NetworkUtils.newConcurrentHashMap();
5858
private Document moduleProperties = new Document();
59-
private ExecutorService executorService = java.util.concurrent.Executors.newFixedThreadPool(4);
6059

6160
private MessageConfig messageConfig;
6261

@@ -353,24 +352,28 @@ public boolean accept(INetworkComponent networkComponent)
353352

354353
public NetworkManager sendAll(Packet packet, ChannelFilter filter)
355354
{
356-
this.executorService.submit(() -> {
357-
for (Wrapper cn : CloudNet.getInstance().getWrappers().values())
355+
TaskScheduler.runtimeScheduler().schedule(new Runnable() {
356+
@Override
357+
public void run()
358358
{
359-
if (cn.getChannel() != null && filter.accept(cn))
360-
cn.sendPacket(packet);
359+
for (Wrapper cn : CloudNet.getInstance().getWrappers().values())
360+
{
361+
if (cn.getChannel() != null && filter.accept(cn))
362+
cn.sendPacket(packet);
361363

362-
for (ProxyServer proxyServer : cn.getProxys().values())
363-
if (proxyServer.getChannel() != null && filter.accept(proxyServer))
364-
proxyServer.sendPacket(packet);
364+
for (ProxyServer proxyServer : cn.getProxys().values())
365+
if (proxyServer.getChannel() != null && filter.accept(proxyServer))
366+
proxyServer.sendPacket(packet);
365367

366-
for (MinecraftServer minecraftServer : cn.getServers().values())
367-
if (minecraftServer.getChannel() != null && filter.accept(minecraftServer))
368-
minecraftServer.sendPacket(packet);
368+
for (MinecraftServer minecraftServer : cn.getServers().values())
369+
if (minecraftServer.getChannel() != null && filter.accept(minecraftServer))
370+
minecraftServer.sendPacket(packet);
369371

370-
for (CloudServer cloudServer : cn.getCloudServers().values())
371-
if (cloudServer.getChannel() != null && filter.accept(cloudServer))
372-
cloudServer.sendPacket(packet);
372+
for (CloudServer cloudServer : cn.getCloudServers().values())
373+
if (cloudServer.getChannel() != null && filter.accept(cloudServer))
374+
cloudServer.sendPacket(packet);
373375

376+
}
374377
}
375378
});
376379
return this;

cloudnet-core/src/main/java/de/dytanic/cloudnetcore/serverlog/ServerLogManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public void appendScreenData(Collection<ScreenInfo> screenInfos)
6262
{
6363
this.screenInfos.getS(key).addAll(screenInfos);
6464

65-
while (this.screenInfos.getS(key).size() > 64)
65+
while (this.screenInfos.getS(key).size() >= 64)
6666
this.screenInfos.getS(key).poll();
6767
}
6868
}

cloudnet-wrapper/src/main/java/de/dytanic/cloudnetwrapper/handlers/ReadConsoleLogHandler.java

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,20 @@
11
package de.dytanic.cloudnetwrapper.handlers;
22

3-
import de.dytanic.cloudnet.lib.server.screen.ScreenInfo;
43
import de.dytanic.cloudnetwrapper.CloudNetWrapper;
5-
import de.dytanic.cloudnetwrapper.network.packet.out.PacketOutSendScreenLine;
4+
import de.dytanic.cloudnetwrapper.screen.AbstractScreenService;
65
import de.dytanic.cloudnetwrapper.server.BungeeCord;
76
import de.dytanic.cloudnetwrapper.server.CloudGameServer;
87
import de.dytanic.cloudnetwrapper.server.GameServer;
9-
import de.dytanic.cloudnetwrapper.server.process.ServerDispatcher;
108

119
import java.io.InputStream;
1210
import java.nio.charset.StandardCharsets;
13-
import java.util.Collections;
1411

1512
public final class ReadConsoleLogHandler implements IWrapperHandler {
1613

1714
private final StringBuffer stringBuffer = new StringBuffer();
1815

1916
private final byte[] buffer = new byte[1024];
2017

21-
private int len;
22-
2318
@Override
2419
public void run(CloudNetWrapper obj)
2520
{
@@ -36,32 +31,36 @@ public void run(CloudNetWrapper obj)
3631
readConsoleLog(gameServer);
3732
}
3833

39-
private synchronized void readConsoleLog(ServerDispatcher server)
34+
private synchronized void readConsoleLog(AbstractScreenService server)
4035
{
4136
if (server.getInstance().isAlive() && server.getInstance().getInputStream() != null)
4237
{
43-
try
44-
{
38+
readStream(server, server.getInstance().getInputStream());
39+
readStream(server, server.getInstance().getErrorStream());
40+
}
41+
}
4542

46-
InputStream inputStream = server.getInstance().getInputStream();
43+
private synchronized void readStream(AbstractScreenService screenService, InputStream inputStream)
44+
{
45+
try
46+
{
47+
int len;
48+
while (inputStream.available() > 0 && (len = inputStream.read(buffer, 0, buffer.length)) != -1)
49+
stringBuffer.append(new String(buffer, 0, len, StandardCharsets.UTF_8));
50+
51+
String stringText = stringBuffer.toString();
52+
if (!stringText.contains("\n") && !stringText.contains("\r")) return;
4753

48-
while (inputStream.available() > 0 && (len = inputStream.read(buffer, 0, buffer.length)) != -1)
49-
stringBuffer.append(new String(buffer, 0, len, StandardCharsets.UTF_8));
54+
for (String input : stringText.split("\r"))
55+
for (String text : input.split("\n"))
56+
if (!text.trim().isEmpty())
57+
screenService.addCachedItem(text);
5058

51-
for (String input : stringBuffer.toString().split("\r"))
52-
for (String text : input.split("\n"))
53-
if (!text.trim().isEmpty())
54-
{
55-
CloudNetWrapper.getInstance().getNetworkConnection()
56-
.sendPacket(new PacketOutSendScreenLine(Collections.singletonList(new ScreenInfo(server.getServiceId(), input))));
57-
}
59+
stringBuffer.setLength(0);
5860

59-
} catch (Exception ignored)
60-
{
61-
} finally
62-
{
63-
stringBuffer.setLength(0);
64-
}
61+
} catch (Exception ignored)
62+
{
63+
stringBuffer.setLength(0);
6564
}
6665
}
6766

cloudnet-wrapper/src/main/java/de/dytanic/cloudnetwrapper/network/packet/in/PacketInScreen.java

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,41 +4,47 @@
44

55
package de.dytanic.cloudnetwrapper.network.packet.in;
66

7+
import com.google.gson.reflect.TypeToken;
8+
import de.dytanic.cloudnet.lib.DefaultType;
79
import de.dytanic.cloudnet.lib.network.protocol.packet.PacketInHandler;
810
import de.dytanic.cloudnet.lib.network.protocol.packet.PacketSender;
11+
import de.dytanic.cloudnet.lib.server.info.ProxyInfo;
12+
import de.dytanic.cloudnet.lib.server.info.ServerInfo;
913
import de.dytanic.cloudnet.lib.utility.document.Document;
14+
import de.dytanic.cloudnetwrapper.CloudNetWrapper;
15+
import de.dytanic.cloudnetwrapper.server.BungeeCord;
16+
import de.dytanic.cloudnetwrapper.server.GameServer;
1017

1118
public final class PacketInScreen extends PacketInHandler {
1219

1320
@Override
1421
public void handleInput(Document data, PacketSender packetSender)
1522
{
16-
/*
1723
if (data.getObject("type", DefaultType.class) != DefaultType.BUNGEE_CORD)
1824
{
1925
ServerInfo server = data.getObject("serverInfo", new TypeToken<ServerInfo>() {
2026
}.getType());
2127
if (CloudNetWrapper.getInstance().getServers().containsKey(server.getServiceId().getServerId()))
2228
{
2329
GameServer gameServer = CloudNetWrapper.getInstance().getServers().get(server.getServiceId().getServerId());
30+
2431
if (data.getBoolean("enable"))
25-
CloudNetWrapper.getInstance().getScreenProvider().putScreenRequest(gameServer);
32+
gameServer.enableScreenSystem();
2633
else
27-
CloudNetWrapper.getInstance().getScreenProvider().cancel(gameServer);
34+
gameServer.disableScreenSystem();
2835
}
2936
} else
3037
{
3138
ProxyInfo server = data.getObject("proxyInfo", new TypeToken<ProxyInfo>() {
3239
}.getType());
3340
if (CloudNetWrapper.getInstance().getProxys().containsKey(server.getServiceId().getServerId()))
3441
{
35-
BungeeCord gameServer = CloudNetWrapper.getInstance().getProxys().get(server.getServiceId().getServerId());
42+
BungeeCord bungee = CloudNetWrapper.getInstance().getProxys().get(server.getServiceId().getServerId());
3643
if (data.getBoolean("enable"))
37-
CloudNetWrapper.getInstance().getScreenProvider().putScreenRequest(gameServer);
38-
else if (CloudNetWrapper.getInstance().getScreenProvider().contains(gameServer))
39-
CloudNetWrapper.getInstance().getScreenProvider().cancel(gameServer);
44+
bungee.enableScreenSystem();
45+
else
46+
bungee.disableScreenSystem();
4047
}
4148
}
42-
*/
4349
}
4450
}
Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,49 @@
11
package de.dytanic.cloudnetwrapper.screen;
22

3-
public class AbstractScreenService {
4-
}
3+
import de.dytanic.cloudnet.lib.server.screen.ScreenInfo;
4+
import de.dytanic.cloudnetwrapper.CloudNetWrapper;
5+
import de.dytanic.cloudnetwrapper.network.packet.out.PacketOutSendScreenLine;
6+
import lombok.Getter;
7+
8+
import java.util.Collections;
9+
import java.util.Queue;
10+
import java.util.concurrent.ConcurrentLinkedQueue;
11+
12+
public abstract class AbstractScreenService implements Screenable {
13+
14+
@Getter
15+
protected final Queue<String> cachedLogMessages = new ConcurrentLinkedQueue<>();
16+
17+
@Getter
18+
protected volatile boolean screenSystemEnabled;
19+
20+
public void addCachedItem(String text)
21+
{
22+
if (text == null) return;
23+
24+
while (cachedLogMessages.size() >= 64)
25+
cachedLogMessages.poll();
26+
27+
cachedLogMessages.offer(text);
28+
29+
if (this.screenSystemEnabled) this.sendScreenLine0(text);
30+
}
31+
32+
public void enableScreenSystem()
33+
{
34+
for (String text : this.cachedLogMessages)
35+
this.sendScreenLine0(text);
36+
37+
this.screenSystemEnabled = true;
38+
}
39+
40+
public void disableScreenSystem()
41+
{
42+
this.screenSystemEnabled = false;
43+
}
44+
45+
private void sendScreenLine0(String text)
46+
{
47+
CloudNetWrapper.getInstance().getNetworkConnection().sendPacket(new PacketOutSendScreenLine(Collections.singletonList(new ScreenInfo(getServiceId(), text))));
48+
}
49+
}

cloudnet-wrapper/src/main/java/de/dytanic/cloudnetwrapper/server/BungeeCord.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import de.dytanic.cloudnetwrapper.CloudNetWrapper;
2424
import de.dytanic.cloudnetwrapper.network.packet.out.PacketOutAddProxy;
2525
import de.dytanic.cloudnetwrapper.network.packet.out.PacketOutRemoveProxy;
26+
import de.dytanic.cloudnetwrapper.screen.AbstractScreenService;
2627
import de.dytanic.cloudnetwrapper.server.process.ServerDispatcher;
2728
import de.dytanic.cloudnetwrapper.util.FileUtility;
2829
import lombok.EqualsAndHashCode;
@@ -39,9 +40,9 @@
3940
import java.nio.file.Paths;
4041
import java.util.LinkedList;
4142

42-
@EqualsAndHashCode
4343
@Getter
44-
public class BungeeCord implements ServerDispatcher {
44+
@EqualsAndHashCode(callSuper = false)
45+
public class BungeeCord extends AbstractScreenService implements ServerDispatcher {
4546

4647
private ProxyProcessMeta proxyProcessMeta;
4748

cloudnet-wrapper/src/main/java/de/dytanic/cloudnetwrapper/server/CloudGameServer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import de.dytanic.cloudnetwrapper.CloudNetWrapper;
1919
import de.dytanic.cloudnetwrapper.network.packet.out.PacketOutAddCloudServer;
2020
import de.dytanic.cloudnetwrapper.network.packet.out.PacketOutRemoveCloudServer;
21+
import de.dytanic.cloudnetwrapper.screen.AbstractScreenService;
2122
import de.dytanic.cloudnetwrapper.server.process.ServerDispatcher;
2223
import de.dytanic.cloudnetwrapper.util.FileUtility;
2324
import de.dytanic.cloudnetwrapper.util.MasterTemplateDeploy;
@@ -44,9 +45,9 @@
4445
/**
4546
* Created by Tareko on 17.10.2017.
4647
*/
47-
@EqualsAndHashCode
4848
@Getter
49-
public class CloudGameServer implements ServerDispatcher {
49+
@EqualsAndHashCode(callSuper = false)
50+
public class CloudGameServer extends AbstractScreenService implements ServerDispatcher {
5051

5152
private CloudServerMeta cloudServerMeta;
5253

cloudnet-wrapper/src/main/java/de/dytanic/cloudnetwrapper/server/GameServer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import de.dytanic.cloudnetwrapper.CloudNetWrapper;
2525
import de.dytanic.cloudnetwrapper.network.packet.out.PacketOutAddServer;
2626
import de.dytanic.cloudnetwrapper.network.packet.out.PacketOutRemoveServer;
27+
import de.dytanic.cloudnetwrapper.screen.AbstractScreenService;
2728
import de.dytanic.cloudnetwrapper.server.process.ServerDispatcher;
2829
import de.dytanic.cloudnetwrapper.server.process.ServerProcess;
2930
import de.dytanic.cloudnetwrapper.util.FileUtility;
@@ -44,9 +45,9 @@
4445
import java.util.Enumeration;
4546
import java.util.Properties;
4647

47-
@EqualsAndHashCode
4848
@Getter
49-
public class GameServer implements ServerDispatcher {
49+
@EqualsAndHashCode(callSuper = false)
50+
public class GameServer extends AbstractScreenService implements ServerDispatcher {
5051

5152
private ServerProcess serverProcess;
5253

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<maven.compiler.target>1.8</maven.compiler.target>
1919
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
2020
<project.build.targetEncoding>UTF-8</project.build.targetEncoding>
21-
<service.version>2.1.14.1</service.version>
21+
<service.version>2.1.14.2</service.version>
2222
<service.type>RELEASE</service.type>
2323
<!-- Dependencies -->
2424
<dependency.lombok.version>1.18.4</dependency.lombok.version>

0 commit comments

Comments
 (0)