Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move PlayerProfile saving off the main thread #4119

Merged
merged 2 commits into from
Feb 7, 2024
Merged
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 @@ -8,7 +8,6 @@
import java.util.Set;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.stream.IntStream;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
Expand All @@ -35,6 +34,8 @@
import io.github.thebusybiscuit.slimefun4.api.researches.Research;
import io.github.thebusybiscuit.slimefun4.core.attributes.ProtectionType;
import io.github.thebusybiscuit.slimefun4.core.attributes.ProtectiveArmor;
import io.github.thebusybiscuit.slimefun4.core.debug.Debug;
import io.github.thebusybiscuit.slimefun4.core.debug.TestCase;
import io.github.thebusybiscuit.slimefun4.core.guide.GuideHistory;
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;
import io.github.thebusybiscuit.slimefun4.implementation.items.armor.SlimefunArmorPiece;
Expand Down Expand Up @@ -237,13 +238,15 @@ public void removeWaypoint(@Nonnull Waypoint waypoint) {
* The profile can then be removed from RAM.
*/
public final void markForDeletion() {
Debug.log(TestCase.PLAYER_PROFILE_DATA, "Marking {} ({}) profile for deletion", name, ownerId);
markedForDeletion = true;
}

/**
* Call this method if this Profile has unsaved changes.
*/
public final void markDirty() {
Debug.log(TestCase.PLAYER_PROFILE_DATA, "Marking {} ({}) profile as dirty", name, ownerId);
dirty = true;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem;
import io.github.thebusybiscuit.slimefun4.api.researches.Research;
import io.github.thebusybiscuit.slimefun4.core.debug.TestCase;
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;

class SlimefunTabCompleter implements TabCompleter {
Expand All @@ -33,6 +34,13 @@ public SlimefunTabCompleter(@Nonnull SlimefunCommand command) {
public List<String> onTabComplete(CommandSender sender, Command cmd, String label, String[] args) {
if (args.length == 1) {
return createReturnList(command.getSubCommandNames(), args[0]);
} else if (args.length == 2) {
if (args[0].equalsIgnoreCase("debug")) {
return createReturnList(TestCase.VALUES_LIST, args[1]);
} else {
// Returning null will make it fallback to the default arguments (all online players)
return null;
}
} else if (args.length == 3) {
if (args[0].equalsIgnoreCase("give")) {
return createReturnList(getSlimefunItems(), args[2]);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package io.github.thebusybiscuit.slimefun4.core.debug;

import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import javax.annotation.Nonnull;
Expand All @@ -17,7 +19,15 @@ public enum TestCase {
* being checked and why it is comparing IDs or meta.
* This is helpful for us to check into why input nodes are taking a while for servers.
*/
CARGO_INPUT_TESTING;
CARGO_INPUT_TESTING,

/**
* Debug information regarding player profile loading, saving and handling.
* This is an area we're currently changing quite a bit and this will help ensure we're doing it safely
*/
PLAYER_PROFILE_DATA;

public static final List<String> VALUES_LIST = Arrays.stream(values()).map(TestCase::toString).toList();

TestCase() {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
import org.bukkit.entity.Player;

import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
import io.github.thebusybiscuit.slimefun4.core.debug.Debug;
import io.github.thebusybiscuit.slimefun4.core.debug.TestCase;
import io.github.thebusybiscuit.slimefun4.implementation.Slimefun;

import me.mrCookieSlime.Slimefun.api.BlockStorage;
Expand All @@ -39,9 +41,8 @@ public class AutoSavingService {
public void start(@Nonnull Slimefun plugin, int interval) {
this.interval = interval;

plugin.getServer().getScheduler().runTaskTimer(plugin, this::saveAllPlayers, 2000L, interval * 60L * 20L);
plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, this::saveAllPlayers, 2000L, interval * 60L * 20L);
plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, this::saveAllBlocks, 2000L, interval * 60L * 20L);

}

/**
Expand All @@ -52,16 +53,30 @@ private void saveAllPlayers() {
Iterator<PlayerProfile> iterator = PlayerProfile.iterator();
int players = 0;

Debug.log(TestCase.PLAYER_PROFILE_DATA, "Saving all players data");

while (iterator.hasNext()) {
PlayerProfile profile = iterator.next();

if (profile.isDirty()) {
players++;
profile.save();

Debug.log(TestCase.PLAYER_PROFILE_DATA, "Saved data for {} ({})",
profile.getPlayer() != null ? profile.getPlayer().getName() : "Unknown", profile.getUUID()
);
}

if (profile.isMarkedForDeletion()) {
// Remove the PlayerProfile from memory if the player has left the server (marked from removal)
// and they're still not on the server
// At this point, we've already saved their profile so we can safely remove it
// without worry for having a data sync issue (e.g. data is changed but then we try to re-load older data)
if (profile.isMarkedForDeletion() && profile.getPlayer() == null) {
iterator.remove();

Debug.log(TestCase.PLAYER_PROFILE_DATA, "Removed data from memory for {}",
profile.getUUID()
);
}
}

Expand Down
Loading