Prevent save task overlaps (#1588)

This commit is contained in:
Gabriele C 2020-11-27 19:21:39 +01:00 committed by GitHub
parent 232d9097cf
commit b74eeb95d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 2 deletions

View File

@ -203,8 +203,16 @@ public class BentoBox extends JavaPlugin {
// Save islands & players data every X minutes
Bukkit.getScheduler().runTaskTimer(instance, () -> {
playersManager.saveAll(true);
islandsManager.saveAll(true);
if (!playersManager.isSaveTaskRunning()) {
playersManager.saveAll(true);
} else {
getLogger().warning("Tried to start a player data save task while the previous auto save was still running!");
}
if (!islandsManager.isSaveTaskRunning()) {
islandsManager.saveAll(true);
} else {
getLogger().warning("Tried to start a island data save task while the previous auto save was still running!");
}
}, getSettings().getDatabaseBackupPeriod() * 20 * 60L, getSettings().getDatabaseBackupPeriod() * 20 * 60L);
// Make sure all flag listeners are registered.

View File

@ -88,6 +88,8 @@ public class IslandsManager {
@NonNull
private List<String> deletedIslands;
private boolean isSaveTaskRunning;
/**
* Islands Manager
* @param plugin - plugin
@ -1209,6 +1211,10 @@ public class IslandsManager {
});
}
public boolean isSaveTaskRunning() {
return isSaveTaskRunning;
}
/**
* Save the all the islands to the database
*/
@ -1232,6 +1238,8 @@ public class IslandsManager {
return;
}
isSaveTaskRunning = true;
Queue<Island> queue = new LinkedList<>(islandCache.getIslands());
new BukkitRunnable() {
@Override
@ -1239,6 +1247,7 @@ public class IslandsManager {
for (int i = 0; i < plugin.getSettings().getMaxSavedIslandsPerTick(); i++) {
Island island = queue.poll();
if (island == null) {
isSaveTaskRunning = false;
cancel();
return;
}

View File

@ -25,6 +25,8 @@ public class PlayersManager {
private Map<UUID, Players> playerCache;
private Set<UUID> inTeleport;
private boolean isSaveTaskRunning;
/**
* Provides a memory cache of online player information
* This is the one-stop-shop of player info
@ -59,6 +61,10 @@ public class PlayersManager {
handler.loadObjects().forEach(p -> playerCache.put(p.getPlayerUUID(), p));
}
public boolean isSaveTaskRunning() {
return isSaveTaskRunning;
}
/**
* Save all players
*/
@ -82,6 +88,7 @@ public class PlayersManager {
return;
}
isSaveTaskRunning = true;
Queue<Players> queue = new LinkedList<>(playerCache.values());
new BukkitRunnable() {
@Override
@ -89,6 +96,7 @@ public class PlayersManager {
for (int i = 0; i < plugin.getSettings().getMaxSavedPlayersPerTick(); i++) {
Players player = queue.poll();
if (player == null) {
isSaveTaskRunning = false;
cancel();
return;
}