private void renameMergeFolder() throws IOException { Path directoryForUnfinishedFiles = storagePathProvider.getUnfinishedSaveTransactionPath(); Path directoryForFinishedFiles = storagePathProvider.getUnmergedChangesPath(); try { Files.move(directoryForUnfinishedFiles, directoryForFinishedFiles, StandardCopyOption.ATOMIC_MOVE); } catch (AtomicMoveNotSupportedException e) { logger.warn("Atomic rename of merge folder was not possible, doing it non atomically..."); Files.move(directoryForUnfinishedFiles, directoryForFinishedFiles); } }
@Override public void checkAndRepairSaveIfNecessary() throws IOException { saveTransactionHelper.cleanupSaveTransactionDirectory(); if (Files.exists(getStoragePathProvider().getUnmergedChangesPath())) { saveTransactionHelper.mergeChanges(); } }
final Path sourceDirectory = storagePathProvider.getUnmergedChangesPath(); final Path targetDirectory = storagePathProvider.getStoragePathDirectory();
@Override public void run() { if (isReplay()) { return; } try { if (Files.exists(storagePathProvider.getUnmergedChangesPath())) { // should not happen, as initialization should clean it up throw new IOException("Save rand while there were unmerged changes"); } saveTransactionHelper.cleanupSaveTransactionDirectory(); applyDeltaToPrivateEntityManager(); prepareChunksPlayersAndGlobalStore(); createPreviewImagesFolder(); createSaveTransactionDirectory(); writePlayerStores(); writeGlobalStore(); writeChunkStores(); saveGameManifest(); perpareChangesForMerge(); mergeChanges(); result = SaveTransactionResult.createSuccessResult(); logger.info("Save game finished"); saveRecordingData(); } catch (IOException | RuntimeException t) { logger.error("Save game creation failed", t); result = SaveTransactionResult.createFailureResult(t); } }