Cyclic port running to reduce failing server starts #255
@ -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
|
||||
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);
|
||||
YoyoNow
hat
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?
Lixfel
hat
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.
YoyoNow
hat
Hast du nich durch das Set die info? Hast du nich durch das Set die info?
YoyoNow
hat
Bzw. kannst diese berechnen? Bzw. kannst diese berechnen?
Lixfel
hat
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.
YoyoNow
hat
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.
Lixfel
hat
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Warum 10100?
Weil im 10000-10100 Teamspeak 3 Ports aufmacht