Added toString method to CompressionStatus, version bump to 3.0.0-a, few small tweaks

2.x
Szum123321 2022-11-27 13:58:45 +01:00
parent afe9c8d051
commit c040d05bd8
6 changed files with 53 additions and 27 deletions

View File

@ -6,7 +6,7 @@ yarn_mappings=1.19.2+build.28
loader_version=0.14.10 loader_version=0.14.10
#Fabric api #Fabric api
fabric_version=0.64.0+1.19.2 fabric_version=0.67.1+1.19.2
#Cloth Config #Cloth Config
cloth_version=8.2.88 cloth_version=8.2.88
@ -21,6 +21,6 @@ lazydfu_version=v0.1.3
pgzip_commit_hash=af5f5c297e735f3f2df7aa4eb0e19a5810b8aff6 pgzip_commit_hash=af5f5c297e735f3f2df7aa4eb0e19a5810b8aff6
# Mod Properties # Mod Properties
mod_version = 2.5.0 mod_version = 3.0.0-a
maven_group = net.szum123321 maven_group = net.szum123321
archives_base_name = textile_backup archives_base_name = textile_backup

View File

@ -63,7 +63,7 @@ public class TextileBackup implements ModInitializer {
Globals.INSTANCE.updateTMPFSFlag(server); Globals.INSTANCE.updateTMPFSFlag(server);
}); });
//Wait 60s for already submited backups to finish. After that kill the bastards and run the one last if required //Wait 60s for already submitted backups to finish. After that kill the bastards and run the one last if required
ServerLifecycleEvents.SERVER_STOPPED.register(server -> { ServerLifecycleEvents.SERVER_STOPPED.register(server -> {
Globals.INSTANCE.shutdownQueueExecutor(60000); Globals.INSTANCE.shutdownQueueExecutor(60000);

View File

@ -22,11 +22,14 @@ import java.io.*;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map; import java.util.Map;
public record CompressionStatus(long treeHash, LocalDateTime date, long startTimestamp, long finishTimestamp, Map<Path, Exception> brokenFiles) implements Serializable { public record CompressionStatus(long treeHash, LocalDateTime date, long startTimestamp, long finishTimestamp, Map<Path, Exception> brokenFiles) implements Serializable {
public static final String DATA_FILENAME = "textile_status.data"; public static final String DATA_FILENAME = "textile_status.data";
public boolean isValid(long decompressedHash) { return true; } public boolean isValid(long decompressedHash) {
return decompressedHash == treeHash;
}
public static CompressionStatus readFromFile(Path folder) throws IOException, ClassNotFoundException { public static CompressionStatus readFromFile(Path folder) throws IOException, ClassNotFoundException {
try(InputStream i = Files.newInputStream(folder.resolve(DATA_FILENAME)); try(InputStream i = Files.newInputStream(folder.resolve(DATA_FILENAME));
@ -43,4 +46,31 @@ public record CompressionStatus(long treeHash, LocalDateTime date, long startTim
} }
} }
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Hash: ")
.append(treeHash)
.append(", Date: ")
.append(date.format(DateTimeFormatter.ISO_DATE_TIME))
.append(", start time stamp: ").append(startTimestamp)
.append(", finish time stamp: ").append(finishTimestamp);
builder.append(", broken files: ");
if(brokenFiles.isEmpty()) builder.append("[]");
else {
builder.append("[\n");
for(Path i: brokenFiles.keySet()) {
builder.append(i.toString())
.append(":");
ByteArrayOutputStream o = new ByteArrayOutputStream();
brokenFiles.get(i).printStackTrace(new PrintStream(o));
builder.append(o).append("\n");
}
builder.append("]");
}
return builder.toString();
}
} }

View File

@ -25,6 +25,6 @@ import java.io.IOException;
*/ */
public class NoSpaceLeftOnDeviceException extends IOException { public class NoSpaceLeftOnDeviceException extends IOException {
public NoSpaceLeftOnDeviceException(Throwable cause) { public NoSpaceLeftOnDeviceException(Throwable cause) {
super(cause); super("The underlying filesystem has ran out of available space.\nSee: https://github.com/Szum123321/textile_backup/wiki/ZIP-Problems", cause);
} }
} }

View File

@ -51,11 +51,10 @@ public class MakeBackupRunnable implements Callable<Void> {
public MakeBackupRunnable(BackupContext context) { public MakeBackupRunnable(BackupContext context) {
this.context = context; this.context = context;
} }
@Override @Override
public Void call() throws IOException, ExecutionException, InterruptedException { public Void call() throws IOException, ExecutionException, InterruptedException {
Path outFile = Utilities Path outFile = Utilities.getBackupRootPath(Utilities.getLevelName(context.server())).resolve(getFileName());
.getBackupRootPath(Utilities.getLevelName(context.server()))
.resolve(getFileName());
log.trace("Outfile is: {}", outFile); log.trace("Outfile is: {}", outFile);
@ -77,11 +76,9 @@ public class MakeBackupRunnable implements Callable<Void> {
int coreCount; int coreCount;
if(config.get().compressionCoreCountLimit <= 0) { if (config.get().compressionCoreCountLimit <= 0) coreCount = Runtime.getRuntime().availableProcessors();
coreCount = Runtime.getRuntime().availableProcessors(); else
} else {
coreCount = Math.min(config.get().compressionCoreCountLimit, Runtime.getRuntime().availableProcessors()); coreCount = Math.min(config.get().compressionCoreCountLimit, Runtime.getRuntime().availableProcessors());
}
log.trace("Running compression on {} threads. Available cores: {}", coreCount, Runtime.getRuntime().availableProcessors()); log.trace("Running compression on {} threads. Available cores: {}", coreCount, Runtime.getRuntime().availableProcessors());
@ -107,11 +104,8 @@ public class MakeBackupRunnable implements Callable<Void> {
Globals.INSTANCE.getQueueExecutor().submit(new Cleanup(context.commandSource(), Utilities.getLevelName(context.server()))); Globals.INSTANCE.getQueueExecutor().submit(new Cleanup(context.commandSource(), Utilities.getLevelName(context.server())));
if(config.get().broadcastBackupDone) { if (config.get().broadcastBackupDone) {
Utilities.notifyPlayers( Utilities.notifyPlayers(context.server(), "Done!");
context.server(),
"Done!"
);
} else { } else {
log.sendInfoAL(context, "Done!"); log.sendInfoAL(context, "Done!");
} }
@ -119,7 +113,7 @@ public class MakeBackupRunnable implements Callable<Void> {
//ExecutorService swallows exception, so I need to catch everything //ExecutorService swallows exception, so I need to catch everything
log.error("An exception occurred when trying to create new backup file!", e); log.error("An exception occurred when trying to create new backup file!", e);
if(ConfigHelper.INSTANCE.get().errorErrorHandlingMode.isStrict()) { if (ConfigHelper.INSTANCE.get().errorErrorHandlingMode.isStrict()) {
try { try {
Files.delete(outFile); Files.delete(outFile);
} catch (IOException ex) { } catch (IOException ex) {
@ -127,7 +121,7 @@ public class MakeBackupRunnable implements Callable<Void> {
} }
} }
if(context.initiator() == ActionInitiator.Player) if (context.initiator() == ActionInitiator.Player)
log.sendError(context, "An exception occurred when trying to create new backup file!"); log.sendError(context, "An exception occurred when trying to create new backup file!");
throw e; throw e;
@ -139,9 +133,7 @@ public class MakeBackupRunnable implements Callable<Void> {
return null; return null;
} }
private String getFileName(){ private String getFileName() {
return Utilities.getDateTimeFormatter().format(context.startDate()) + return Utilities.getDateTimeFormatter().format(context.startDate()) + (context.comment() != null ? "#" + context.comment().replaceAll("[\\\\/:*?\"<>|#]", "") : "") + config.get().format.getCompleteString();
(context.comment() != null ? "#" + context.comment().replaceAll("[\\\\/:*?\"<>|#]", "") : "") +
config.get().format.getCompleteString();
} }
} }

View File

@ -55,7 +55,8 @@ public class RestoreBackupRunnable implements Runnable {
ctx.server().stop(false); ctx.server().stop(false);
Path worldFile = Utilities.getWorldFolder(ctx.server()), tmp; Path worldFile = Utilities.getWorldFolder(ctx.server()),
tmp;
try { try {
tmp = Files.createTempDirectory( tmp = Files.createTempDirectory(
@ -99,8 +100,11 @@ public class RestoreBackupRunnable implements Runnable {
//locks until the backup is finished //locks until the backup is finished
waitForShutdown.get(); waitForShutdown.get();
if(status.isValid(hash) || !config.get().errorErrorHandlingMode.verify()) { log.info("Status: {}", status);
if(status.isValid(hash)) log.info("Backup valid. Restoring");
boolean valid = status.isValid(hash);
if(valid || !config.get().errorErrorHandlingMode.verify()) {
if(valid) log.info("Backup valid. Restoring");
else log.info("Backup is damaged, but verification is disabled. Restoring"); else log.info("Backup is damaged, but verification is disabled. Restoring");
Utilities.deleteDirectory(worldFile); Utilities.deleteDirectory(worldFile);
@ -116,7 +120,7 @@ public class RestoreBackupRunnable implements Runnable {
} catch (ExecutionException | InterruptedException | ClassNotFoundException | IOException e) { } catch (ExecutionException | InterruptedException | ClassNotFoundException | IOException e) {
log.error("An exception occurred while trying to restore a backup!", e); log.error("An exception occurred while trying to restore a backup!", e);
} finally { } finally {
//Regardless of what happended, we shiuld still clean up //Regardless of what happened, we should still clean up
if(Files.exists(tmp)) { if(Files.exists(tmp)) {
try { try {
Utilities.deleteDirectory(tmp); Utilities.deleteDirectory(tmp);