Attempted fix for locks not properly releasing

This commit is contained in:
Teriuihi 2022-08-28 18:42:50 +02:00
parent 8825f4b3cc
commit 54ee7dab93
2 changed files with 19 additions and 11 deletions

View File

@ -52,18 +52,20 @@ public class EventListener {
} }
public void clearServer(int hashCode) { public void clearServer(int hashCode) {
channelLockMap.forEach((identifier, value) -> { channelLockMap.keySet().forEach(key -> {
HashSet<Lock> temp = new HashSet<>(); HashSet<Lock> temp = new HashSet<>();
for (Lock lock : value) { HashSet<Lock> locks = channelLockMap.get(key);
for (Lock lock : locks) {
if (lock.getServerHash() == hashCode) if (lock.getServerHash() == hashCode)
temp.add(lock); temp.add(lock);
} }
for (Lock lock : temp) { for (Lock lock : temp) {
value.remove(lock); locks.remove(lock);
queueNextLock(value, lock, identifier); queueNextLock(locks, lock, key);
if (Config.DEBUG) if (Config.DEBUG)
Logger.info("Clearing % from % due to clear server being called for the server that lock is on", lock.getData(), identifier.getId()); Logger.info("Clearing % from % due to clear server being called for the server that lock is on", lock.getData(), key.getId());
} }
channelLockMap.put(key, locks);
}); });
} }
@ -72,7 +74,9 @@ public class EventListener {
for (ChannelIdentifier plugin : map.keySet()) { for (ChannelIdentifier plugin : map.keySet()) {
stringBuilder stringBuilder
.append(plugin) .append(plugin)
.append("\n") .append(": ")
.append(map.get(plugin).size())
.append(" entries\n")
.append( .append(
map.get(plugin) map.get(plugin)
.stream() .stream()
@ -204,9 +208,9 @@ public class EventListener {
out.writeBoolean(true); out.writeBoolean(true);
out.writeUTF(lock.getData()); out.writeUTF(lock.getData());
lockSet.remove(lock); lockSet.remove(lock);
queueNextLock(lockSet, lock, identifier);
channelLockMap.put(identifier, lockSet); channelLockMap.put(identifier, lockSet);
serverConnection.sendPluginMessage(identifier, out.toByteArray()); serverConnection.sendPluginMessage(identifier, out.toByteArray());
queueNextLock(lockSet, lock, identifier);
return; return;
} }
@ -270,17 +274,19 @@ public class EventListener {
if (!queuedLocks.containsKey(identifier)) if (!queuedLocks.containsKey(identifier))
return; return;
HashSet<Lock> queuedLockSet = queuedLocks.get(identifier); HashSet<Lock> queuedLockSet = queuedLocks.get(identifier);
Optional<Lock> optionalQueuedLock = queuedLockSet.stream().filter(l -> l.compareTo(lock) == 0).findFirst(); Optional<Lock> optionalQueuedLock = queuedLockSet.stream().filter(l -> l.getData().equals(lock.getData())).findFirst();
if (optionalQueuedLock.isEmpty()) if (optionalQueuedLock.isEmpty())
return; return;
Lock queuedLock = optionalQueuedLock.get(); Lock queuedLock = optionalQueuedLock.get();
queuedLockSet.remove(lock); queuedLockSet.remove(queuedLock);
queuedLocks.put(identifier, queuedLockSet);
Optional<RegisteredServer> optionalRegisteredServer = DataLock.getServer().getAllServers().stream() Optional<RegisteredServer> optionalRegisteredServer = DataLock.getServer().getAllServers().stream()
.filter(registeredServer -> registeredServer.getServerInfo().hashCode() == queuedLock.getServerHash()) .filter(registeredServer -> registeredServer.getServerInfo().hashCode() == queuedLock.getServerHash())
.findAny(); .findAny();
if (optionalRegisteredServer.isEmpty()) { if (optionalRegisteredServer.isEmpty()) {
Logger.warn("Removing queued lock [%] due to being unable to find a server where that lock could be active", queuedLock.getData()); Logger.warn("Removing queued lock [%] due to being unable to find a server where that lock could be active", queuedLock.getData());
queueNextLock(lockSet, lock, identifier);
return; return;
} }
RegisteredServer registeredServer = optionalRegisteredServer.get(); RegisteredServer registeredServer = optionalRegisteredServer.get();

View File

@ -6,6 +6,7 @@ import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.RegisteredServer;
import com.velocitypowered.api.proxy.server.ServerInfo; import com.velocitypowered.api.proxy.server.ServerInfo;
import java.util.Collection;
import java.util.Optional; import java.util.Optional;
public class PlayerListener { public class PlayerListener {
@ -14,14 +15,15 @@ public class PlayerListener {
void onPlayerConnect(ServerConnectedEvent event) { void onPlayerConnect(ServerConnectedEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
ServerInfo serverInfo = event.getServer().getServerInfo(); ServerInfo serverInfo = event.getServer().getServerInfo();
if (event.getServer().getPlayersConnected().stream().filter(p -> p.equals(player)).findAny().isEmpty()) Collection<Player> playersConnected = event.getServer().getPlayersConnected();
if (playersConnected.isEmpty() || playersConnected.size() == 1 && playersConnected.contains(player))
EventListener.getInstance().clearServer(serverInfo.hashCode()); EventListener.getInstance().clearServer(serverInfo.hashCode());
Optional<RegisteredServer> previousServer = event.getPreviousServer(); Optional<RegisteredServer> previousServer = event.getPreviousServer();
if (previousServer.isEmpty()) if (previousServer.isEmpty())
return; return;
serverInfo = previousServer.get().getServerInfo(); serverInfo = previousServer.get().getServerInfo();
if (event.getServer().getPlayersConnected().stream().filter(p -> p.equals(player)).findAny().isEmpty()) if (playersConnected.isEmpty() || playersConnected.size() == 1 && playersConnected.contains(player))
EventListener.getInstance().clearServer(serverInfo.hashCode()); EventListener.getInstance().clearServer(serverInfo.hashCode());
} }