Correctly queue edits

Synchronising on the LocalSession ends up being dangerous as it's a craftbukkit thread, leading to blocking issues if something goes wrong in an edit, made worse by the fact craftbukkit threads like to interfere with each other sometimes, and also cause OOMs and hanging when there are too many of them.
This commit is contained in:
dordsor21 2020-10-08 10:53:57 +01:00 committed by MattBDev
parent d10a5cc5fa
commit cf0ff72524
4 changed files with 10 additions and 11 deletions

View File

@ -79,8 +79,8 @@ public abstract class AbstractPlayerActor implements Actor, Player, Cloneable {
private final Map<String, Object> meta;
// Queue for async tasks
private AtomicInteger runningCount = new AtomicInteger();
private AsyncNotifyQueue asyncNotifyQueue = new AsyncNotifyQueue(
private final AtomicInteger runningCount = new AtomicInteger();
private final AsyncNotifyQueue asyncNotifyQueue = new AsyncNotifyQueue(
(thread, throwable) -> {
while (throwable.getCause() != null) {
throwable = throwable.getCause();

View File

@ -189,11 +189,11 @@ public interface Actor extends Identifiable, SessionOwner, Subject, MapMetadatab
*/
default boolean confirm() {
InterruptableCondition confirm = deleteMeta("cmdConfirm");
if (confirm != null) {
confirm.signal();;
return true;
if (confirm == null) {
return false;
}
return false;
queueAction(confirm::signal);
return true;
}
/**

View File

@ -652,13 +652,12 @@ public final class PlatformCommandManager {
} else {
actor.decline();
}
LocalSession session = worldEdit.getSessionManager().get(actor);
synchronized (session) {
actor.runAction(() -> {
SessionKey key = actor.getSessionKey();
if (key.isActive()) {
PlatformCommandManager.this.handleCommandOnCurrentThread(event);
}
}
}, false, true);
}, Fawe.isMainThread());
}

View File

@ -437,7 +437,7 @@ public class PlatformManager {
Tool tool = session.getTool(player);
if (tool instanceof DoubleActionTraceTool && tool.canUse(player)) {
player.runAsyncIfFree(() -> reset((DoubleActionTraceTool) tool).actSecondary(queryCapability(Capability.WORLD_EDITING),
getConfiguration(), player, session));
getConfiguration(), player, session));
event.setCancelled(true);
return;
}
@ -450,7 +450,7 @@ public class PlatformManager {
if (tool instanceof TraceTool && tool.canUse(player)) {
//todo this needs to be fixed so the event is canceled after actPrimary is used and returns true
player.runAction(() -> reset((TraceTool) tool).actPrimary(queryCapability(Capability.WORLD_EDITING),
getConfiguration(), player, session), false, true);
getConfiguration(), player, session), false, true);
event.setCancelled(true);
return;
}