diff --git a/.gitignore b/.gitignore index 2746325db830dc88ab781f979292cf09f20e41a1..03fc2c78d2c0dea0dbf8498a235e46893304b422 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ creeperDb* *.log release.properties aethermud-graph.json +aethermud-graph.json* diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java index 2602ead4d4c1d354dee7f9e52d17a9f66103bf3e..92a97b8583815fd8b3636b71466fbe034d15407a 100644 --- a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java +++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java @@ -29,15 +29,23 @@ import org.apache.log4j.Logger; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.io.IoCore; +import java.io.File; +import java.io.FileFilter; import java.io.IOException; import java.lang.reflect.InvocationTargetException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.*; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.stream.Collectors; +import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; + //TODO : multiple instances of this class could create conflicts in the DB public class GraphDbAetherMudStorage extends AbstractIdleService implements AetherMudStorage { + private static final int MAX_BACKUPS = 5; private static final Logger LOGGER = Logger.getLogger(GraphDbAetherMudStorage.class); private final WrappedFramedGraph<Graph> framedGraph; private final String graphDbFile; @@ -80,7 +88,40 @@ public class GraphDbAetherMudStorage extends AbstractIdleService implements Aeth } - public void persist() { + public synchronized void persist() { + try { + Path defaultFilePath = Paths.get(this.graphDbFile); + if( Files.exists(defaultFilePath) ) + Files.move(defaultFilePath, Paths.get(this.graphDbFile + new Date().getTime()), REPLACE_EXISTING); + } catch (IOException e) { + //do nothing, it probably doesnt exist + } + + //remove all but the last 20 backedup files + NavigableSet<File> orderedFiles = new TreeSet<>(new Comparator<File>() { + @Override + public int compare(File file, File t1) { + if( file.lastModified() > t1.lastModified() ) + return 1; + else if( file.lastModified() < t1.lastModified() ) + return -1; + else + return 0; + } + }); + File folder = new File("."); + orderedFiles.addAll(Arrays.asList(folder.listFiles(new FileFilter() { + @Override + public boolean accept(File file) { + return file.getName().contains(graphDbFile); + } + }))); + while(orderedFiles.size() > MAX_BACKUPS) { + File currentFile = orderedFiles.first(); + orderedFiles.remove(currentFile); + currentFile.delete(); + } + try { this.framedGraph.getBaseGraph().io(IoCore.graphson()).writeGraph(this.graphDbFile); } catch (IOException e) {