From 1a94e89558ca642efaf1578425ac7ff492077da6 Mon Sep 17 00:00:00 2001 From: drtshock Date: Thu, 6 Aug 2015 17:41:37 -0500 Subject: [PATCH] Initial async saving on auto save and force save. --- .../java/com/massivecraft/factions/Board.java | 2 ++ .../com/massivecraft/factions/FPlayers.java | 2 ++ .../com/massivecraft/factions/Factions.java | 2 ++ .../java/com/massivecraft/factions/P.java | 2 +- .../massivecraft/factions/cmd/CmdSaveAll.java | 6 ++-- .../factions/zcore/persist/SaveTask.java | 6 ++-- .../zcore/persist/json/JSONBoard.java | 31 ++++++++++++++----- .../zcore/persist/json/JSONFPlayers.java | 18 +++++++++-- .../zcore/persist/json/JSONFactions.java | 17 ++++++++-- 9 files changed, 68 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/massivecraft/factions/Board.java b/src/main/java/com/massivecraft/factions/Board.java index 1ae9fb17..8f27f783 100644 --- a/src/main/java/com/massivecraft/factions/Board.java +++ b/src/main/java/com/massivecraft/factions/Board.java @@ -80,5 +80,7 @@ public abstract class Board { public abstract boolean forceSave(); + public abstract boolean forceSave(boolean sync); + public abstract boolean load(); } diff --git a/src/main/java/com/massivecraft/factions/FPlayers.java b/src/main/java/com/massivecraft/factions/FPlayers.java index 5acad6f9..bd4912ed 100644 --- a/src/main/java/com/massivecraft/factions/FPlayers.java +++ b/src/main/java/com/massivecraft/factions/FPlayers.java @@ -31,6 +31,8 @@ public abstract class FPlayers { public abstract void forceSave(); + public abstract void forceSave(boolean sync); + public abstract FPlayer getByOfflinePlayer(OfflinePlayer player); public abstract FPlayer getById(String string); diff --git a/src/main/java/com/massivecraft/factions/Factions.java b/src/main/java/com/massivecraft/factions/Factions.java index 8fc468ad..05e49121 100644 --- a/src/main/java/com/massivecraft/factions/Factions.java +++ b/src/main/java/com/massivecraft/factions/Factions.java @@ -37,6 +37,8 @@ public abstract class Factions { public abstract void forceSave(); + public abstract void forceSave(boolean sync); + public static Factions getInstance() { return instance; } diff --git a/src/main/java/com/massivecraft/factions/P.java b/src/main/java/com/massivecraft/factions/P.java index b2f0df47..aae8688e 100644 --- a/src/main/java/com/massivecraft/factions/P.java +++ b/src/main/java/com/massivecraft/factions/P.java @@ -166,7 +166,7 @@ public class P extends MPlugin { @Override public void postAutoSave() { - Board.getInstance().forceSave(); + //Board.getInstance().forceSave(); Not sure why this was there as it's called after the board is already saved. Conf.save(); } diff --git a/src/main/java/com/massivecraft/factions/cmd/CmdSaveAll.java b/src/main/java/com/massivecraft/factions/cmd/CmdSaveAll.java index 5469cd74..6465daf1 100644 --- a/src/main/java/com/massivecraft/factions/cmd/CmdSaveAll.java +++ b/src/main/java/com/massivecraft/factions/cmd/CmdSaveAll.java @@ -28,9 +28,9 @@ public class CmdSaveAll extends FCommand { @Override public void perform() { - FPlayers.getInstance().forceSave(); - Factions.getInstance().forceSave(); - Board.getInstance().forceSave(); + FPlayers.getInstance().forceSave(false); + Factions.getInstance().forceSave(false); + Board.getInstance().forceSave(false); Conf.save(); msg(TL.COMMAND_SAVEALL_SUCCESS); } diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/SaveTask.java b/src/main/java/com/massivecraft/factions/zcore/persist/SaveTask.java index fd0e573b..232c9d21 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/SaveTask.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/SaveTask.java @@ -21,9 +21,9 @@ public class SaveTask implements Runnable { } running = true; p.preAutoSave(); - Factions.getInstance().forceSave(); - FPlayers.getInstance().forceSave(); - Board.getInstance().forceSave(); + Factions.getInstance().forceSave(false); + FPlayers.getInstance().forceSave(false); + Board.getInstance().forceSave(false); p.postAutoSave(); running = false; } diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONBoard.java b/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONBoard.java index c2dc05c4..512686ff 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONBoard.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONBoard.java @@ -6,6 +6,7 @@ import com.massivecraft.factions.FLocation; import com.massivecraft.factions.P; import com.massivecraft.factions.zcore.persist.MemoryBoard; import com.massivecraft.factions.zcore.util.DiscUtil; +import org.bukkit.Bukkit; import java.io.File; import java.lang.reflect.Type; @@ -63,14 +64,30 @@ public class JSONBoard extends MemoryBoard { } public boolean forceSave() { - //Factions.log("Saving board to disk"); + return forceSave(true); + } - try { - DiscUtil.write(file, P.p.gson.toJson(dumpAsSaveFormat())); - } catch (Exception e) { - e.printStackTrace(); - P.p.log("Failed to save the board to disk."); - return false; + public boolean forceSave(boolean sync) { + if (sync) { + try { + DiscUtil.write(file, P.p.gson.toJson(dumpAsSaveFormat())); + } catch (Exception e) { + e.printStackTrace(); + P.p.log("Failed to save the board to disk."); + return false; + } + } else { + Bukkit.getScheduler().runTaskAsynchronously(P.p, new Runnable() { + @Override + public void run() { + try { + DiscUtil.write(file, P.p.gson.toJson(dumpAsSaveFormat())); + } catch (Exception e) { + e.printStackTrace(); + P.p.log("Failed to save the board to disk."); + } + } + }); } return true; diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONFPlayers.java b/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONFPlayers.java index 3c9c642f..af5e3148 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONFPlayers.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONFPlayers.java @@ -51,13 +51,27 @@ public class JSONFPlayers extends MemoryFPlayers { } public void forceSave() { - Map entitiesThatShouldBeSaved = new HashMap(); + forceSave(true); + } + + public void forceSave(boolean sync) { + final Map entitiesThatShouldBeSaved = new HashMap(); for (FPlayer entity : this.fPlayers.values()) { if (((MemoryFPlayer) entity).shouldBeSaved()) { entitiesThatShouldBeSaved.put(entity.getId(), (JSONFPlayer) entity); } } - this.saveCore(this.file, entitiesThatShouldBeSaved); + + if (sync) { + saveCore(file, entitiesThatShouldBeSaved); + } else { + Bukkit.getScheduler().runTaskAsynchronously(P.p, new Runnable() { + @Override + public void run() { + saveCore(file, entitiesThatShouldBeSaved); + } + }); + } } private boolean saveCore(File target, Map data) { diff --git a/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONFactions.java b/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONFactions.java index 52b58231..f450122d 100644 --- a/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONFactions.java +++ b/src/main/java/com/massivecraft/factions/zcore/persist/json/JSONFactions.java @@ -53,12 +53,25 @@ public class JSONFactions extends MemoryFactions { } public void forceSave() { - Map entitiesThatShouldBeSaved = new HashMap(); + forceSave(true); + } + + public void forceSave(boolean sync) { + final Map entitiesThatShouldBeSaved = new HashMap(); for (Faction entity : this.factions.values()) { entitiesThatShouldBeSaved.put(entity.getId(), (JSONFaction) entity); } - this.saveCore(this.file, entitiesThatShouldBeSaved); + if (sync) { + saveCore(file, entitiesThatShouldBeSaved); + } else { + Bukkit.getScheduler().runTaskAsynchronously(P.p, new Runnable() { + @Override + public void run() { + saveCore(file, entitiesThatShouldBeSaved); + } + }); + } } private boolean saveCore(File target, Map entities) {