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.io.File;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
public class SubserverSystem { public class SubserverSystem {
private SubserverSystem(){} private SubserverSystem(){}
@ -39,14 +41,9 @@ public class SubserverSystem {
private static final String SERVER_PATH = BACKBONE + "server/"; private static final String SERVER_PATH = BACKBONE + "server/";
private static final String EVENT_PATH = BACKBONE + "event/"; private static final String EVENT_PATH = BACKBONE + "event/";
private static final int FIRST_ARENA_PORT; 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
static { private static final Portrange arenaPorts = MAIN_SERVER ? new Portrange(3000, 3100) : (BungeeCore.EVENT_MODE ? new Portrange(4000, 5000) : bauPorts);
if(BungeeCore.EVENT_MODE)
FIRST_ARENA_PORT = 6000;
else
FIRST_ARENA_PORT = 2500;
}
/** /**
* This function starts every arena (even test- and eventarenas). * 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){ 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 //Generate missing parameters
Node node = eventFightID > 0 ? Node.local : Node.getNode(); Node node = eventFightID > 0 ? Node.local : Node.getNode();
int port = freePort(FIRST_ARENA_PORT); int port = arenaPorts.freePort();
if(serverName == null){ if(serverName == null){
if(ranked) 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 else
serverName = modus.getDisplayName() + (port - FIRST_ARENA_PORT); serverName = modus.getDisplayName() + (port - arenaPorts.start);
} }
if(mapName == null) if(mapName == null)
mapName = serverName; mapName = serverName;
@ -159,7 +156,7 @@ public class SubserverSystem {
SteamwarUser user = SteamwarUser.get(owner); SteamwarUser user = SteamwarUser.get(owner);
File directory = new File(SERVER_PATH, serverName); File directory = new File(SERVER_PATH, serverName);
Node node = Node.getNode(); Node node = Node.getNode();
int port = freePort(4000); int port = bauPorts.freePort();
new Bauserver(user.getUserName() + "s Bau", owner, port, node.startServer( new Bauserver(user.getUserName() + "s Bau", owner, port, node.startServer(
serverJar, directory, worldDir, worldName, port, xmx, "logPath=" + worldName serverJar, directory, worldDir, worldName, port, xmx, "logPath=" + worldName
@ -213,21 +210,40 @@ public class SubserverSystem {
Node.local.execute("cp", "-r", sourcePath, targetPath); Node.local.execute("cp", "-r", sourcePath, targetPath);
} }
private static int freePort(int start){
synchronized (Subserver.getServerList()){ private static class Portrange {
int port = start;
boolean isFree = false; private final int start;
while(!isFree){ private final int end;
port++; private int current;
isFree = true;
for(Subserver server : Subserver.getServerList()){ private Portrange(int start, int end) {
if(((InetSocketAddress)server.getServer().getSocketAddress()).getPort() == port){ this.start = start;
isFree = false; this.end = end;
break; 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;
} }
} }
} }