Skip to content

Commit 36b4fe4

Browse files
fix deadlock
1 parent 0078768 commit 36b4fe4

File tree

1 file changed

+63
-61
lines changed
  • src/main/java/org/zeroBzeroT/anarchyqueue

1 file changed

+63
-61
lines changed

src/main/java/org/zeroBzeroT/anarchyqueue/Queue.java

Lines changed: 63 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -57,75 +57,77 @@ public void onServerConnectedEvent(ServerConnectedEvent e) {
5757
public void process() {
5858
if (!processSemaphore.tryAcquire()) return;
5959

60-
// check queue server reachability
61-
final RegisteredServer serverQueue;
62-
6360
try {
64-
serverQueue = getServer(Config.serverQueue);
65-
} catch (ServerNotReachableException e) {
66-
log.warn(e.getMessage());
67-
return;
68-
}
61+
// check queue server reachability
62+
final RegisteredServer serverQueue;
63+
64+
try {
65+
serverQueue = getServer(Config.serverQueue);
66+
} catch (ServerNotReachableException e) {
67+
log.warn(e.getMessage());
68+
return;
69+
}
6970

70-
// skip if no players queued
71-
if (queuedPlayers.isEmpty())
72-
return;
71+
// skip if no players queued
72+
if (queuedPlayers.isEmpty())
73+
return;
74+
75+
// check the main server reachability
76+
final RegisteredServer serverMain;
77+
78+
try {
79+
serverMain = getServer(Config.serverMain);
80+
} catch (ServerNotReachableException e) {
81+
if (Instant.now().getEpochSecond() % 10 == 0) {
82+
serverQueue.getPlayersConnected().forEach(queuedPlayer ->
83+
queuedPlayer.sendMessage(Identity.nil(), Component.text(
84+
Config.messageOffline
85+
)));
86+
}
87+
return;
88+
}
7389

74-
// check the main server reachability
75-
final RegisteredServer serverMain;
90+
// check main server full
91+
boolean full = serverMain.getPlayersConnected().size() >= Config.maxPlayers;
7692

77-
try {
78-
serverMain = getServer(Config.serverMain);
79-
} catch (ServerNotReachableException e) {
93+
// send info every 10 seconds
8094
if (Instant.now().getEpochSecond() % 10 == 0) {
81-
serverQueue.getPlayersConnected().forEach(queuedPlayer ->
82-
queuedPlayer.sendMessage(Identity.nil(), Component.text(
83-
Config.messageOffline
84-
)));
95+
sendInfo(serverQueue, full);
8596
}
86-
return;
87-
}
88-
89-
// check main server full
90-
boolean full = serverMain.getPlayersConnected().size() >= Config.maxPlayers;
9197

92-
// send info every 10 seconds
93-
if (Instant.now().getEpochSecond() % 10 == 0) {
94-
sendInfo(serverQueue, full);
95-
}
96-
97-
if (full)
98-
return;
99-
100-
QueuedPlayer currPlayer = queuedPlayers.getFirst();
101-
102-
//wait till delay has passed
103-
if (currPlayer.joinTime() + Config.joinDelay > System.currentTimeMillis())
104-
return;
105-
106-
// connect next player
107-
UUID uuid = currPlayer.player().getUniqueId();
108-
109-
log.info("Processing " + uuid.toString());
110-
111-
// lookup player from queue server and ping to be safe the player is connected
112-
serverQueue.getPlayersConnected().stream()
113-
.filter(p -> p.getUniqueId().equals(uuid))
114-
.findAny().ifPresentOrElse(p -> {
115-
p.sendMessage(Identity.nil(), Component.text(Config.messageConnecting));
116-
try {
117-
if (p.createConnectionRequest(serverMain).connect().get().isSuccessful()) queuedPlayers.removeFirst();
118-
} catch (InterruptedException | ExecutionException e) {
119-
log.error("Unable to connect " + p.getUsername() + "(" + p.getUniqueId().toString() + ") to " + Config.serverMain + ": " + e.getMessage());
98+
if (full)
99+
return;
100+
101+
QueuedPlayer currPlayer = queuedPlayers.getFirst();
102+
103+
//wait till delay has passed
104+
if (currPlayer.joinTime() + Config.joinDelay > System.currentTimeMillis())
105+
return;
106+
107+
// connect next player
108+
UUID uuid = currPlayer.player().getUniqueId();
109+
110+
log.info("Processing " + uuid.toString());
111+
112+
// lookup player from queue server and ping to be safe the player is connected
113+
serverQueue.getPlayersConnected().stream()
114+
.filter(p -> p.getUniqueId().equals(uuid))
115+
.findAny().ifPresentOrElse(p -> {
116+
p.sendMessage(Identity.nil(), Component.text(Config.messageConnecting));
117+
try {
118+
if (p.createConnectionRequest(serverMain).connect().get().isSuccessful()) queuedPlayers.removeFirst();
119+
} catch (InterruptedException | ExecutionException e) {
120+
log.error("Unable to connect " + p.getUsername() + "(" + p.getUniqueId().toString() + ") to " + Config.serverMain + ": " + e.getMessage());
121+
}
122+
},
123+
() -> {
124+
log.error("Unable to connect " + currPlayer.player().getUsername() + "(" + currPlayer.player().getUniqueId().toString() + ") to " + Config.serverMain + ": player is not connected to " + serverQueue.getServerInfo().getName());
125+
queuedPlayers.removeFirst();
120126
}
121-
},
122-
() -> {
123-
log.error("Unable to connect " + currPlayer.player().getUsername() + "(" + currPlayer.player().getUniqueId().toString() + ") to " + Config.serverMain + ": player is not connected to " + serverQueue.getServerInfo().getName());
124-
queuedPlayers.removeFirst();
125-
}
126-
);
127-
128-
processSemaphore.release();
127+
);
128+
} finally {
129+
processSemaphore.release();
130+
}
129131
}
130132

131133
private void sendInfo(RegisteredServer serverQueue, boolean full) {

0 commit comments

Comments
 (0)