Skip to content

Commit c3fd050

Browse files
semaphore replaced by reentrant lock, removed lock being removed twice and lock aquiring before try blocks
1 parent 1924266 commit c3fd050

File tree

2 files changed

+47
-50
lines changed

2 files changed

+47
-50
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
plugin_version=3.0.6-INDEV
1+
plugin_version=3.0.7-INDEV
22
velocity_api_version=3.3.0-SNAPSHOT
33
minecraft_version=1.20.6

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

Lines changed: 46 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import java.time.Instant;
1515
import java.util.*;
1616
import java.util.concurrent.ExecutionException;
17-
import java.util.concurrent.Semaphore;
17+
import java.util.concurrent.locks.ReentrantLock;
1818

1919
import static org.zeroBzeroT.anarchyqueue.Components.mm;
2020

@@ -28,7 +28,7 @@ public class Queue {
2828

2929
private final ProxyServer proxyServer;
3030

31-
private final Semaphore mutex = new Semaphore(1);
31+
private final ReentrantLock lock = new ReentrantLock();
3232

3333
private final Deque<Player> playerQueue;
3434

@@ -79,14 +79,14 @@ public void onServerConnected(ServerConnectedEvent event) {
7979
return;
8080

8181
// Add Player to queue
82+
lock.lock();
8283
try {
83-
mutex.acquire();
8484
playerQueue.add(event.getPlayer());
8585
log.info(mm("<white>" + event.getPlayer().getUsername() + "<dark_aqua> was added to the <light_purple>queue<dark_aqua>. Queue count is " + playerQueue.size() + "."));
86-
} catch (InterruptedException e1) {
87-
e1.printStackTrace();
86+
} catch (Exception e) {
87+
log.error(e.getMessage());
8888
} finally {
89-
mutex.release();
89+
lock.unlock();
9090
}
9191
}
9292

@@ -97,16 +97,16 @@ public void onServerConnected(ServerConnectedEvent event) {
9797
public void onKickedFromServer(KickedFromServerEvent event) {
9898
if (event.getServer().getServerInfo().getName().equals(Config.target)) {
9999
// kick from target server
100+
lock.lock();
100101
try {
101-
mutex.acquire();
102102
Player player = event.getPlayer();
103103
Component reason = event.getServerKickReason().isPresent() ? event.getServerKickReason().get() : mm("Kicked without a reason.");
104104

105105
KickOrRequeue(player, reason);
106-
} catch (InterruptedException e1) {
107-
e1.printStackTrace();
106+
} catch (Exception e) {
107+
log.error(e.getMessage());
108108
} finally {
109-
mutex.release();
109+
lock.unlock();
110110
}
111111
}
112112
}
@@ -168,9 +168,8 @@ public void flushQueue() {
168168
// TODO: full notification
169169
return;
170170

171+
lock.lock();
171172
try {
172-
mutex.acquire();
173-
174173
Player currPlayer = null;
175174

176175
// try to find the first player that got not kicked recently
@@ -183,46 +182,44 @@ public void flushQueue() {
183182
}
184183

185184
// no player to connect to the main server
186-
if (currPlayer == null) {
187-
mutex.release();
188-
return;
189-
}
190-
191-
// connect next player
192-
UUID uuid = currPlayer.getUniqueId();
193-
Player finalCurrPlayer = currPlayer;
194-
195-
serverQueue.getPlayersConnected().stream()
196-
.filter(p -> p.getUniqueId().equals(uuid))
197-
.findAny().ifPresentOrElse(p -> {
198-
p.sendMessage(mm(Config.messageConnecting));
199-
try {
200-
var conReq = p.createConnectionRequest(serverMain).connect().get();
201-
202-
if (conReq.isSuccessful()) {
203-
playerQueue.removeFirst();
204-
// Clear the title
205-
if (Config.sendTitle) {
206-
sendTitle(finalCurrPlayer, mm(" "), mm(" "), 0, 0, 0);
185+
if (currPlayer != null) {
186+
187+
// connect next player
188+
UUID uuid = currPlayer.getUniqueId();
189+
Player finalCurrPlayer = currPlayer;
190+
191+
serverQueue.getPlayersConnected().stream()
192+
.filter(p -> p.getUniqueId().equals(uuid))
193+
.findAny().ifPresentOrElse(p -> {
194+
p.sendMessage(mm(Config.messageConnecting));
195+
try {
196+
var conReq = p.createConnectionRequest(serverMain).connect().get();
197+
198+
if (conReq.isSuccessful()) {
199+
playerQueue.removeFirst();
200+
// Clear the title
201+
if (Config.sendTitle) {
202+
sendTitle(finalCurrPlayer, mm(" "), mm(" "), 0, 0, 0);
203+
}
204+
log.info(mm("<white>" + p.getUsername() + "<dark_aqua> connected to server <aqua>" + serverMain.getServerInfo().getName() + "<dark_aqua>. Queue count is " + serverQueue.getPlayersConnected().size() + ". Main count is " + (serverMain.getPlayersConnected().size()) + " of " + Config.maxPlayers + "."));
205+
} else {
206+
var reason = conReq.getReasonComponent().isPresent() ? conReq.getReasonComponent().get() : mm("Connection to the main server failed.");
207+
KickOrRequeue(finalCurrPlayer, reason);
207208
}
208-
log.info(mm("<white>" + p.getUsername() + "<dark_aqua> connected to server <aqua>" + serverMain.getServerInfo().getName() + "<dark_aqua>. Queue count is " + serverQueue.getPlayersConnected().size() + ". Main count is " + (serverMain.getPlayersConnected().size()) + " of " + Config.maxPlayers + "."));
209-
} else {
210-
var reason = conReq.getReasonComponent().isPresent() ? conReq.getReasonComponent().get() : mm("Connection to the main server failed.");
211-
KickOrRequeue(finalCurrPlayer, reason);
209+
} catch (InterruptedException | ExecutionException e) {
210+
log.error(mm("<white>" + p.getUsername() + "s<red> connection to server <aqua>" + Config.target + "<red> failed with an exception: " + e.getMessage()));
211+
// server down?
212+
kickedPlayers.put(finalCurrPlayer, Instant.now().getEpochSecond());
212213
}
213-
} catch (InterruptedException | ExecutionException e) {
214-
log.error(mm("<white>" + p.getUsername() + "s<red> connection to server <aqua>" + Config.target + "<red> failed with an exception: " + e.getMessage()));
215-
// server down?
216-
kickedPlayers.put(finalCurrPlayer, Instant.now().getEpochSecond());
217-
}
218-
},
219-
// player is in the queue, but not connected to the queue server
220-
playerQueue::removeFirst
221-
);
222-
} catch (InterruptedException e) {
223-
e.printStackTrace();
214+
},
215+
// player is in the queue, but not connected to the queue server
216+
playerQueue::removeFirst
217+
);
218+
}
219+
} catch (Exception e) {
220+
log.error(e.getMessage());
224221
} finally {
225-
mutex.release();
222+
lock.unlock();
226223
}
227224
}
228225

0 commit comments

Comments
 (0)