package org.simantics.acorn.backup;
-import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import org.simantics.backup.IBackupProvider;
import org.simantics.db.server.ProCoreException;
import org.simantics.utils.FileUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
/**
* @author Jani
*/
public class AcornBackupProvider implements IBackupProvider {
+ private static final Logger LOGGER = LoggerFactory.getLogger(AcornBackupProvider.class);
+
private static final String IDENTIFIER = "AcornBackupProvider";
private long trId = -1;
private final Semaphore lock = new Semaphore(1);
public AcornBackupProvider() {
this.client = AcornSessionManagerImpl.getInstance().getClient();
}
-
- private static Path getAcornMetadataFile(Path dbFolder) {
+
+ public static Path getAcornMetadataFile(Path dbFolder) {
return dbFolder.getParent().resolve(IDENTIFIER);
}
-
+
@Override
public void lock() throws BackupException {
try {
throw new IllegalStateException(this + " backup provider is already locked");
trId = client.askWriteTransaction(-1).getTransactionId();
} catch (ProCoreException e) {
- e.printStackTrace();
+ LOGGER.error("Failed to lock backup provider", e);
}
}
boolean releaseLock = true;
try {
lock.acquire();
-
- client.makeSnapshot(true);
-
- Path dbDir = client.getDbFolder();
- int newestFolder = client.clusters.mainState.headDir - 1;
- int latestFolder = -2;
- Path AcornMetadataFile = getAcornMetadataFile(dbDir);
- if (Files.exists(AcornMetadataFile)) {
- try (BufferedReader br = Files.newBufferedReader(AcornMetadataFile)) {
- latestFolder = Integer.parseInt( br.readLine() );
- }
- }
-
- AcornBackupRunnable r = new AcornBackupRunnable(
- lock, targetPath, revision, dbDir, latestFolder, newestFolder);
- new Thread(r, "Acorn backup thread").start();
-
- releaseLock = false;
- return r;
+ Future<BackupException> r = client.getBackupRunnable(lock, targetPath, revision);
+ releaseLock = false;
+ return r;
} catch (InterruptedException e) {
releaseLock = false;
throw new BackupException("Failed to lock Acorn for backup.", e);
if (dbRoot != restorePath) {
FileUtils.deleteAll(dbRoot.toFile());
Files.move(restorePath, dbRoot);
- }
+ }
} catch (IOException e) {
- e.printStackTrace();
+ LOGGER.error("Failed to restore database revision {} from backup {}", revision, fromPath.toString(), e);
}
}
return FileVisitResult.CONTINUE;
} else if (dir.getParent().getFileName().toString().equals(IDENTIFIER)) {
Path targetPath = toPath.resolve(dirName);
- if (!Files.exists(targetPath)) {
- Files.createDirectory(targetPath);
- }
+ Files.createDirectories(targetPath);
return FileVisitResult.CONTINUE;
} else if (dirName.toString().length() == 1 && Character.isDigit(dirName.toString().charAt(0))) {
int dirNameInt = Integer.parseInt(dirName.toString());
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if (file.getFileName().toString().endsWith(".tar.gz"))
return FileVisitResult.CONTINUE;
- System.out.println("Restore " + file + " to " + toPath.resolve(currentSubFolder.relativize(file)));
+ if (LOGGER.isTraceEnabled())
+ LOGGER.trace("Restore " + file + " to " + toPath.resolve(currentSubFolder.relativize(file)));
Files.copy(file, toPath.resolve(currentSubFolder.relativize(file)), StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
}
- private static class AcornBackupRunnable implements Runnable, Future<BackupException> {
+ public static class AcornBackupRunnable implements Runnable, Future<BackupException> {
private final Semaphore lock;
private final Path targetPath;
private void doBackup() throws IOException {
Path target = targetPath.resolve(String.valueOf(revision)).resolve(IDENTIFIER);
- if (!Files.exists(target))
- Files.createDirectories(target);
+ Files.createDirectories(target);
Files.walkFileTree(baseDir,
new BackupCopyVisitor(baseDir, target));
}
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
- Path dirName = dir.getFileName();
- if (dirName.equals(fromPath)) {
+ if (dir.equals(fromPath)) {
Path targetPath = toPath.resolve(fromPath.relativize(dir));
- if (!Files.exists(targetPath)) {
- Files.createDirectory(targetPath);
- }
+ Files.createDirectories(targetPath);
return FileVisitResult.CONTINUE;
} else {
- int dirNameInt = Integer.parseInt(dirName.toString());
- if (latestFolder < dirNameInt && dirNameInt <= newestFolder) {
- Path targetPath = toPath.resolve(fromPath
- .relativize(dir));
- if (!Files.exists(targetPath)) {
- Files.createDirectory(targetPath);
+ try {
+ int dirNameInt = Integer.parseInt(dir.getFileName().toString());
+ if (latestFolder < dirNameInt && dirNameInt <= newestFolder) {
+ Path targetPath = toPath.resolve(fromPath.relativize(dir));
+ Files.createDirectories(targetPath);
+ return FileVisitResult.CONTINUE;
}
- return FileVisitResult.CONTINUE;
+ } catch (NumberFormatException e) {
}
return FileVisitResult.SKIP_SUBTREE;
}
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
- System.out.println("Backup " + file + " to "
- + toPath.resolve(fromPath.relativize(file)));
+ if (LOGGER.isTraceEnabled())
+ LOGGER.trace("Backup " + file + " to " + toPath.resolve(fromPath.relativize(file)));
Files.copy(file, toPath.resolve(fromPath.relativize(file)),
StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;