X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.acorn%2Fsrc%2Forg%2Fsimantics%2Facorn%2Finternal%2FAcornDatabase.java;h=a423fbdbe23b815871688fb17cb2c6fb165550f7;hb=33b349001037197a526a49e5820f0317dc74d934;hp=1025cc6a5dac0a2e6d5b940b1ad0d17ba971fa00;hpb=f9b0a9c48dd040142414f8d3e7ac43b502d3e203;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/AcornDatabase.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/AcornDatabase.java index 1025cc6a5..a423fbdbe 100644 --- a/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/AcornDatabase.java +++ b/bundles/org.simantics.acorn/src/org/simantics/acorn/internal/AcornDatabase.java @@ -18,19 +18,23 @@ import org.simantics.acorn.GraphClientImpl2; import org.simantics.db.Database; import org.simantics.db.DatabaseUserAgent; import org.simantics.db.ServiceLocator; -import org.simantics.db.common.utils.Logger; -import org.simantics.db.exception.SDBException; import org.simantics.db.server.DatabaseStartException; import org.simantics.db.server.ProCoreException; -import org.simantics.db.server.internal.InternalException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * @author Tuukka Lehtonen */ public class AcornDatabase implements Database { + private static final Logger LOGGER = LoggerFactory.getLogger(AcornDatabase.class); + + private static final String LOCK_FILE_NAME = "lock"; + private final Path folder; - + private final Path lockFile; + private GraphClientImpl2 currentClient; private DatabaseUserAgent userAgent; @@ -43,6 +47,7 @@ public class AcornDatabase implements Database { public AcornDatabase(Path folder) { this.folder = folder; + this.lockFile = folder.resolve(LOCK_FILE_NAME); } @Override @@ -90,7 +95,7 @@ public class AcornDatabase implements Database { try (DirectoryStream folderStream = Files.newDirectoryStream(path)) { return !folderStream.iterator().hasNext(); } catch (IOException e) { - Logger.defaultLogError("Failed to open folder stream. folder=" + path, e); + LOGGER.error("Failed to open folder stream. folder=" + path, e); return false; } } @@ -110,22 +115,19 @@ public class AcornDatabase implements Database { } @Override - public void start() throws ProCoreException { - Path lockFile = folder.resolve("lock"); + public synchronized void start() throws ProCoreException { try { - if (!Files.exists(lockFile)) - Files.createFile(lockFile); - raLockFile = new RandomAccessFile(lockFile.toFile(), "rw"); lock = raLockFile.getChannel().tryLock(); if (lock == null) { + safeLoggingClose(raLockFile, lockFile); throw new ProCoreException("The database in folder " + folder.toAbsolutePath() + " is already in use!"); } - isRunning = true; - } catch (IOException e) { - e.printStackTrace(); + LOGGER.error("Failed to start database at " + folder.toAbsolutePath(), e); + safeLoggingClose(raLockFile, lockFile); + throw new ProCoreException("Failed to start database at " + folder.toAbsolutePath(), e); } } @@ -135,19 +137,19 @@ public class AcornDatabase implements Database { } @Override - public boolean tryToStop() throws ProCoreException { + public synchronized boolean tryToStop() throws ProCoreException { + if (!isRunning) + return false; try { - lock.release(); - raLockFile.close(); - - Files.deleteIfExists(folder.resolve("lock")); - + safeLoggingClose(lock, lockFile); + lock = null; + safeLoggingClose(raLockFile, lockFile); + raLockFile = null; + Files.deleteIfExists(lockFile); isRunning = false; - } catch (IOException e) { - e.printStackTrace(); + LOGGER.error("Failed to start database at " + folder.toAbsolutePath(), e); } - return true; } @@ -265,4 +267,13 @@ public class AcornDatabase implements Database { return "LZ4"; } + private static void safeLoggingClose(AutoCloseable closeable, Path file) { + if (closeable == null) + return; + try (AutoCloseable c = closeable) { + } catch (Exception e) { + LOGGER.error("Failed to close " + closeable.getClass() + " of " + file.toAbsolutePath()); + } + } + }