Fix config reload not removing deleted servers (#1882)
* Fix config reload not removing deleted servers When reloading velocity.toml, unregister servers that were removed from the config and evacuate any connected players to fallback servers. * Requested PR fixes * Make Expected ConnectedPlayer exceptions more detailed
This commit is contained in:
@@ -488,23 +488,46 @@ public class VelocityServer implements ProxyServer, ForwardingAudience {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Re-register servers. If a server is being replaced, make sure to note what players need to
|
// Re-register servers. If a server is being replaced or removed, make sure to note what
|
||||||
// move back to a fallback server.
|
// players need to move back to a fallback server.
|
||||||
Collection<ConnectedPlayer> evacuate = new ArrayList<>();
|
Collection<ConnectedPlayer> evacuate = new ArrayList<>();
|
||||||
|
for (Map.Entry<String, String> entry : configuration.getServers().entrySet()) {
|
||||||
|
if (newConfiguration.getServers().keySet().stream()
|
||||||
|
.anyMatch(name -> name.equalsIgnoreCase(entry.getKey()))) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegisteredServer rs = servers.getServer(entry.getKey()).orElse(null);
|
||||||
|
if (rs == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Player player : rs.getPlayersConnected()) {
|
||||||
|
if (!(player instanceof ConnectedPlayer)) {
|
||||||
|
throw new IllegalStateException("Expected ConnectedPlayer for player " + player
|
||||||
|
+ " on server " + rs.getServerInfo().getName() + ", got "
|
||||||
|
+ player.getClass().getName());
|
||||||
|
}
|
||||||
|
evacuate.add((ConnectedPlayer) player);
|
||||||
|
}
|
||||||
|
servers.unregister(rs.getServerInfo());
|
||||||
|
}
|
||||||
|
|
||||||
for (Map.Entry<String, String> entry : newConfiguration.getServers().entrySet()) {
|
for (Map.Entry<String, String> entry : newConfiguration.getServers().entrySet()) {
|
||||||
ServerInfo newInfo = new ServerInfo(entry.getKey(), AddressUtil.parseAddress(entry.getValue()));
|
ServerInfo newInfo = new ServerInfo(entry.getKey(), AddressUtil.parseAddress(entry.getValue()));
|
||||||
Optional<RegisteredServer> rs = servers.getServer(entry.getKey());
|
RegisteredServer rs = servers.getServer(entry.getKey()).orElse(null);
|
||||||
if (rs.isEmpty()) {
|
if (rs == null) {
|
||||||
servers.register(newInfo);
|
servers.register(newInfo);
|
||||||
} else if (!rs.get().getServerInfo().equals(newInfo)) {
|
} else if (!rs.getServerInfo().equals(newInfo)) {
|
||||||
for (Player player : rs.get().getPlayersConnected()) {
|
for (Player player : rs.getPlayersConnected()) {
|
||||||
if (!(player instanceof ConnectedPlayer)) {
|
if (!(player instanceof ConnectedPlayer)) {
|
||||||
throw new IllegalStateException("ConnectedPlayer not found for player " + player
|
throw new IllegalStateException("Expected ConnectedPlayer for player " + player
|
||||||
+ " in server " + rs.get().getServerInfo().getName());
|
+ " on server " + rs.getServerInfo().getName() + ", got "
|
||||||
|
+ player.getClass().getName());
|
||||||
}
|
}
|
||||||
evacuate.add((ConnectedPlayer) player);
|
evacuate.add((ConnectedPlayer) player);
|
||||||
}
|
}
|
||||||
servers.unregister(rs.get().getServerInfo());
|
servers.unregister(rs.getServerInfo());
|
||||||
servers.register(newInfo);
|
servers.register(newInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user