Attempted fix for locks not properly releasing
This commit is contained in:
parent
8825f4b3cc
commit
54ee7dab93
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user