summaryrefslogtreecommitdiff
path: root/src/main/java/com/keuin/kbackupfabric/util/PostProgressRestoreThread.java
diff options
context:
space:
mode:
authorKeuin <[email protected]>2020-04-23 10:45:28 +0800
committerkeuin <[email protected]>2020-04-23 10:45:28 +0800
commitb2d161cee43b9b1af04416486d6df82621b03ae3 (patch)
treee102ea567d7e7f0f7a90acd16b34ac147ed9338e /src/main/java/com/keuin/kbackupfabric/util/PostProgressRestoreThread.java
parentb582ad31ed8d44aa60b2eab22b2d927519297eeb (diff)
Version 1.0.0-dev1.0.0-dev
TODO: Optimize ZipUtil
Diffstat (limited to 'src/main/java/com/keuin/kbackupfabric/util/PostProgressRestoreThread.java')
-rw-r--r--src/main/java/com/keuin/kbackupfabric/util/PostProgressRestoreThread.java71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/main/java/com/keuin/kbackupfabric/util/PostProgressRestoreThread.java b/src/main/java/com/keuin/kbackupfabric/util/PostProgressRestoreThread.java
new file mode 100644
index 0000000..8427a2c
--- /dev/null
+++ b/src/main/java/com/keuin/kbackupfabric/util/PostProgressRestoreThread.java
@@ -0,0 +1,71 @@
+package com.keuin.kbackupfabric.util;
+
+import java.io.File;
+import java.io.IOException;
+
+import static com.keuin.kbackupfabric.util.IO.*;
+import static org.apache.commons.io.FileUtils.forceDelete;
+
+/**
+ * This thread wait the server to be stopped (must invoke stop out of this thread),
+ * then delete current level, and restore our backup.
+ */
+public class PostProgressRestoreThread implements Runnable {
+ private final Thread serverThread;
+ private final String backupFilePath;
+ private final String levelDirectory;
+
+ public PostProgressRestoreThread(Thread serverThread, String backupFilePath, String levelDirectory) {
+ this.serverThread = serverThread;
+ this.backupFilePath = backupFilePath;
+ this.levelDirectory = levelDirectory;
+ }
+
+ @Override
+ public void run() {
+ try {
+ // Wait server thread die
+ debug("Waiting server thread stopping ...");
+ while (serverThread.isAlive()) {
+ try {
+ serverThread.join();
+ } catch (InterruptedException ignored) {
+ }
+ }
+
+ debug("Waiting ...");
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException ignored) {
+ }
+ // Delete old level
+ debug("Server stopped. Deleting old level ...");
+ File levelDirFile = new File(levelDirectory);
+
+ int failedCounter = 0;
+ final int MAX_RETRY_TIMES = 20;
+ while (failedCounter < MAX_RETRY_TIMES) {
+ System.gc();
+ if (!levelDirFile.delete() && levelDirFile.exists()) {
+ System.gc();
+ forceDelete(levelDirFile); // Try to force delete.
+ }
+ if (levelDirFile.exists())
+ ++failedCounter;
+ else
+ break;
+ }
+ if (levelDirFile.exists()) {
+ error(String.format("Cannot restore: failed to delete old level %s .", levelDirFile.getName()));
+ return;
+ }
+
+ // Decompress archive
+ debug("Decompressing archived level");
+ ZipUtil.unzip(backupFilePath, levelDirectory, false);
+ info("Restore complete! Please restart the server manually.");
+ } catch (SecurityException | IOException | ZipUtilException e) {
+ error("An exception occurred while restoring: " + e.getMessage());
+ }
+ }
+}