Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,6 @@ private void loadAdapter() {
@Override
public void onDisable() {
WorldEdit worldEdit = WorldEdit.getInstance();
worldEdit.getSessionManager().unload();
if (platform != null) {
worldEdit.getEventBus().post(new PlatformUnreadyEvent(platform));
worldEdit.getPlatformManager().unregister(platform);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.sk89q.worldedit.event.platform.CommandEvent;
import com.sk89q.worldedit.event.platform.ConfigurationLoadEvent;
import com.sk89q.worldedit.event.platform.PlatformReadyEvent;
import com.sk89q.worldedit.event.platform.PlatformUnreadyEvent;
import com.sk89q.worldedit.event.platform.PlatformsRegisteredEvent;
import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.ParserContext;
Expand Down Expand Up @@ -212,7 +213,7 @@ public void onStarted() {

public void onStopped() {
WorldEdit worldEdit = WorldEdit.getInstance();
worldEdit.getSessionManager().unload();
worldEdit.getEventBus().post(new PlatformUnreadyEvent(platform));
worldEdit.getPlatformManager().unregister(platform);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -245,8 +245,6 @@ protected void serverStarted(MinecraftServer server) {
}

protected void serverStopping() {
WorldEdit worldEdit = WorldEdit.getInstance();
worldEdit.getSessionManager().unload();
WorldEdit.getInstance().getEventBus().post(new PlatformUnreadyEvent(platform));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import com.sk89q.worldedit.command.ToolUtilCommands
import com.sk89q.worldedit.command.UtilityCommands
import com.sk89q.worldedit.command.util.PermissionCondition
import com.sk89q.worldedit.event.platform.PlatformReadyEvent
import com.sk89q.worldedit.event.platform.PlatformUnreadyEvent
import com.sk89q.worldedit.event.platform.PlatformsRegisteredEvent
import com.sk89q.worldedit.internal.command.CommandUtil
import com.sk89q.worldedit.util.formatting.text.TextComponent
Expand Down Expand Up @@ -337,9 +338,9 @@ Other Permissions
*/
@JvmStatic
fun main(args: Array<String>) {
val plat = DocumentationPlatform()
WorldEdit.getInstance().platformManager.register(plat)
try {
val plat = DocumentationPlatform()
WorldEdit.getInstance().platformManager.register(plat)
WorldEdit.getInstance().eventBus.post(PlatformReadyEvent(plat))
WorldEdit.getInstance().eventBus.post(PlatformsRegisteredEvent())
val printer = DocumentationPrinter()
Expand All @@ -348,7 +349,7 @@ Other Permissions
writeOutput("commands.rst", printer.cmdOutput.toString())
writeOutput("permissions.rst", printer.permsOutput.toString())
} finally {
WorldEdit.getInstance().sessionManager.unload()
WorldEdit.getInstance().eventBus.post(PlatformUnreadyEvent(plat))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,6 @@ public final class WorldEdit {
private final PlatformManager platformManager = new PlatformManager(this);
@Deprecated
private final EditSessionFactory editSessionFactory = new EditSessionFactory.EditSessionFactoryImpl();
private final SessionManager sessions = new SessionManager(this);
private final Supervisor supervisor = new SimpleSupervisor();
private final AssetLoaders assetLoaders = new AssetLoaders(this);
private final SchematicsManager schematicsManager = new SchematicsManager(this);
Expand Down Expand Up @@ -237,7 +236,7 @@ public PatternFactory getPatternFactory() {
* @return the session manager
*/
public SessionManager getSessionManager() {
return sessions;
return platformManager.getSessionManager();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import com.sk89q.worldedit.event.platform.PlatformsRegisteredEvent;
import com.sk89q.worldedit.event.platform.PlayerInputEvent;
import com.sk89q.worldedit.internal.util.LogManagerCompat;
import com.sk89q.worldedit.session.SessionManager;
import com.sk89q.worldedit.session.request.Request;
import com.sk89q.worldedit.util.HandSide;
import com.sk89q.worldedit.util.Location;
Expand Down Expand Up @@ -79,6 +80,7 @@ public class PlatformManager {
private final WorldEdit worldEdit;
private final PlatformCommandManager platformCommandManager;
private final SimpleLifecycled<ListeningExecutorService> executorService;
private final SimpleLifecycled<SessionManager> sessionManager;
private final Map<Platform, Boolean> platforms = Maps.newHashMap();
private final ImmutableMap<Capability, SimpleLifecycled<Platform>> preferences = Stream.of(Capability.values())
.collect(Maps.toImmutableEnumMap(
Expand All @@ -100,6 +102,7 @@ public PlatformManager(WorldEdit worldEdit) {
this.worldEdit = worldEdit;
this.platformCommandManager = new PlatformCommandManager(worldEdit, this);
this.executorService = SimpleLifecycled.invalid();
this.sessionManager = SimpleLifecycled.invalid();

// Register this instance for events
worldEdit.getEventBus().register(this);
Expand Down Expand Up @@ -342,6 +345,19 @@ private static ListeningExecutorService createExecutor() {
0, 1, 20, "WorldEdit Task Executor - %s"));
}

/**
* Get the session manager.
*
* @return the session manager
*/
public SessionManager getSessionManager() {
return sessionManager.valueOrThrow();
}

private static SessionManager createSessionManager() {
return new SessionManager(WorldEdit.getInstance());
}

/**
* Get the current configuration.
*
Expand Down Expand Up @@ -406,6 +422,9 @@ public void handleNewPlatformReady(PlatformReadyEvent event) {
if (!executorService.isValid()) {
executorService.newValue(createExecutor());
}
if (!sessionManager.isValid()) {
sessionManager.newValue(createSessionManager());
}
}

/**
Expand All @@ -420,6 +439,8 @@ public void handleNewPlatformUnready(PlatformUnreadyEvent event) {
if (!platforms.containsValue(true)) {
executorService.value().ifPresent(ListeningExecutorService::shutdownNow);
executorService.invalidate();
sessionManager.value().ifPresent(SessionManager::unload);
sessionManager.invalidate();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
import com.sk89q.worldedit.session.storage.JsonFileSessionStore;
import com.sk89q.worldedit.session.storage.SessionStore;
import com.sk89q.worldedit.session.storage.VoidStore;
import com.sk89q.worldedit.util.concurrency.EvenMoreExecutors;
import com.sk89q.worldedit.util.eventbus.Subscribe;
import com.sk89q.worldedit.world.gamemode.GameModes;
import com.sk89q.worldedit.world.item.ItemType;
Expand All @@ -50,12 +49,13 @@
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Timer;
import java.util.TimerTask;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;

import static com.google.common.base.Preconditions.checkNotNull;
Expand All @@ -71,13 +71,13 @@ public class SessionManager {

public static int EXPIRATION_GRACE = 10 * 60 * 1000;
private static final int FLUSH_PERIOD = 1000 * 30;
private static final ExecutorService executorService = EvenMoreExecutors.newBoundedCachedThreadPool(
0, 1, 5, "WorldEdit Session Saver - %s"
);
private static final Logger LOGGER = LogManagerCompat.getLogger();
private static final Set<String> warnedInvalidTool = Collections.newSetFromMap(new ConcurrentHashMap<>());

private final Timer timer = new Timer("WorldEdit Session Manager");
private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(
1,
Thread.ofVirtual().name("WorldEdit Session Manager").factory()
);
private final WorldEdit worldEdit;
private final Map<UUID, SessionHolder> sessions = new HashMap<>();
private SessionStore store = new VoidStore();
Expand All @@ -93,7 +93,7 @@ public SessionManager(WorldEdit worldEdit) {
this.worldEdit = worldEdit;

worldEdit.getEventBus().register(this);
timer.schedule(new SessionTracker(), FLUSH_PERIOD, FLUSH_PERIOD);
var _ = executorService.scheduleAtFixedRate(new SessionTracker(), FLUSH_PERIOD, FLUSH_PERIOD, TimeUnit.MILLISECONDS);
}

/**
Expand Down Expand Up @@ -307,11 +307,21 @@ public synchronized void remove(SessionOwner owner) {
}

/**
* Called to unload this session manager.
* Called to unload this session manager permanently.
*/
public synchronized void unload() {
public void unload() {
clear();
timer.cancel();
executorService.shutdown();
try {
if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
var tasks = executorService.shutdownNow();
WorldEdit.logger.error("Session manager is taking too long to exit. List of active tasks: ({})\n{}",
tasks.size(),
tasks.stream().map(run -> run.getClass() + ": " + run + "\n"));
}
} catch (InterruptedException e) {
WorldEdit.logger.error("Interrupted while waiting for session manager to shutdown", e);
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,6 @@ public void serverStarted(StartedEngineEvent<Server> event) {
@Listener
public void serverStopping(StoppingEngineEvent<Server> event) {
WorldEdit worldEdit = WorldEdit.getInstance();
worldEdit.getSessionManager().unload();
WorldEdit.getInstance().getEventBus().post(new PlatformUnreadyEvent(platform));
}

Expand Down