SteamWar/BungeeCore
Archiviert
13
2

Cyclic port running to reduce failing server starts #255

Zusammengeführt
Lixfel hat 1 Commits von cyclicPorts nach master 2021-10-09 15:45:01 +02:00 zusammengeführt

Datei anzeigen

@ -29,7 +29,9 @@ import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.io.File;
import java.net.InetSocketAddress;
import java.time.format.DateTimeFormatter;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
public class SubserverSystem {
private SubserverSystem(){}
@ -39,14 +41,9 @@ public class SubserverSystem {
private static final String SERVER_PATH = BACKBONE + "server/";
private static final String EVENT_PATH = BACKBONE + "event/";
private static final int FIRST_ARENA_PORT;
static {
if(BungeeCore.EVENT_MODE)
FIRST_ARENA_PORT = 6000;
else
FIRST_ARENA_PORT = 2500;
}
private static final boolean MAIN_SERVER = ProxyServer.getInstance().getConfig().getListeners().stream().anyMatch(info -> ((InetSocketAddress) info.getSocketAddress()).getPort() == 25565);
private static final Portrange bauPorts = MAIN_SERVER ? new Portrange(10100, 20000) : new Portrange(2100, 2200);
YoyoNow markierte diese Unterhaltung als gelöst
Review

Warum 10100?

Warum 10100?
Review

Weil im 10000-10100 Teamspeak 3 Ports aufmacht

Weil im 10000-10100 Teamspeak 3 Ports aufmacht
private static final Portrange arenaPorts = MAIN_SERVER ? new Portrange(3000, 3100) : (BungeeCore.EVENT_MODE ? new Portrange(4000, 5000) : bauPorts);
/**
* This function starts every arena (even test- and eventarenas).
@ -88,13 +85,13 @@ public class SubserverSystem {
public static synchronized Subserver startArena(ArenaMode modus, String map, int eventFightID, int checkSchemID, int prepareSchemID, String serverName, String mapName, UUID player1, UUID player2, boolean ranked){
//Generate missing parameters
Node node = eventFightID > 0 ? Node.local : Node.getNode();
int port = freePort(FIRST_ARENA_PORT);
int port = arenaPorts.freePort();
if(serverName == null){
if(ranked)
serverName = "Ranked" + (port - FIRST_ARENA_PORT);
serverName = "Ranked" + (port - arenaPorts.start);
Review

Ich weiß nicht was ich davon halten soll, dass immer hochgezählt wird dann, ginge das anders?

Ich weiß nicht was ich davon halten soll, dass immer hochgezählt wird dann, ginge das anders?
Review

Leider nicht ohne größeren Aufwand, deshalb der Arenenportraum auch auf 100 beschränkt, dass es keine größere Arena als 99 gibt.

Leider nicht ohne größeren Aufwand, deshalb der Arenenportraum auch auf 100 beschränkt, dass es keine größere Arena als 99 gibt.
Review

Hast du nich durch das Set die info?

Hast du nich durch das Set die info?
Review

Bzw. kannst diese berechnen?

Bzw. kannst diese berechnen?
Review

Nein, die dynamische Menge der startenden und willkürlich stoppenden Arenen macht das nicht trivial.

Nein, die dynamische Menge der startenden und willkürlich stoppenden Arenen macht das nicht trivial.
Review

Ich würde trotzdem dies gerne haben, wäre mir wichtig und wäre damit auch dann keine disruption für den Spieler, der plötzlich 99 und dann 0 sieht.

Ich würde trotzdem dies gerne haben, wäre mir wichtig und wäre damit auch dann keine disruption für den Spieler, der plötzlich 99 und dann 0 sieht.
Review

Wobei sich die Spieler schon jetzt kaum um die Nummern scheren. Ich habe leider auch derzeit keine Idee, wie man (mit sinnvollem Ressourcenaufwand ohne durchgehen durch alle laufenden Server mit Überprüfung deren Servernamen) einen Unique Servernamen beibehält und dabei die Zahlen kleinbehält. Ich denke, dass es alle User herzlich wenig interessiert.

Wobei sich die Spieler schon jetzt kaum um die Nummern scheren. Ich habe leider auch derzeit keine Idee, wie man (mit sinnvollem Ressourcenaufwand ohne durchgehen durch alle laufenden Server mit Überprüfung deren Servernamen) einen Unique Servernamen beibehält und dabei die Zahlen kleinbehält. Ich denke, dass es alle User herzlich wenig interessiert.
else
serverName = modus.getDisplayName() + (port - FIRST_ARENA_PORT);
serverName = modus.getDisplayName() + (port - arenaPorts.start);
}
if(mapName == null)
mapName = serverName;
@ -159,7 +156,7 @@ public class SubserverSystem {
SteamwarUser user = SteamwarUser.get(owner);
File directory = new File(SERVER_PATH, serverName);
Node node = Node.getNode();
int port = freePort(4000);
int port = bauPorts.freePort();
new Bauserver(user.getUserName() + "s Bau", owner, port, node.startServer(
serverJar, directory, worldDir, worldName, port, xmx, "logPath=" + worldName
@ -213,21 +210,40 @@ public class SubserverSystem {
Node.local.execute("cp", "-r", sourcePath, targetPath);
}
private static int freePort(int start){
synchronized (Subserver.getServerList()){
int port = start;
boolean isFree = false;
while(!isFree){
port++;
isFree = true;
for(Subserver server : Subserver.getServerList()){
if(((InetSocketAddress)server.getServer().getSocketAddress()).getPort() == port){
isFree = false;
break;
private static class Portrange {
private final int start;
private final int end;
private int current;
private Portrange(int start, int end) {
this.start = start;
this.end = end;
current = start;
}
private void increment() {
current++;
if(current == end)
current = start;
}
private synchronized int freePort() {
Set<Integer> usedPorts;
synchronized (Subserver.getServerList()) {
usedPorts = Subserver.getServerList().stream().map(server -> ((InetSocketAddress) server.getServer().getSocketAddress()).getPort()).collect(Collectors.toSet());
}
return port;
while(usedPorts.contains(current)) {
increment();
}
int result = current;
increment();
return result;
}
}
}