/** * Creates a lock in a directory if it does not yet exist. * * @return a newly acquired lock. * @throws SailLockedException * if the directory is already locked. */ @Override public Lock lockOrFail() throws SailLockedException { Lock lock = tryLock(); if (lock != null) { return lock; } String requestedBy = getProcessName(); String lockedBy = getLockedBy(); if (lockedBy != null) { throw new SailLockedException(lockedBy, requestedBy, this); } lock = tryLock(); if (lock != null) { return lock; } throw new SailLockedException(requestedBy); }
/** * Determines if the directory is locked. * * @return <code>true</code> if the directory is already locked. */ @Override public boolean isLocked() { return getLockDir().exists(); }
synchronized void delete() { try { if (raf.getChannel().isOpen()) { fileLock.release(); raf.close(); } } catch (IOException e) { logger.warn(e.toString(), e); } revokeLock(); } };
DirectoryLockManager locker = new DirectoryLockManager(dataDir); dataFile = new File(dataDir, DATA_FILE_NAME); syncFile = new File(dataDir, SYNC_FILE_NAME); dirLock = locker.tryLock(); if (dirLock == null) { logger.warn("Failed to lock directory: {}", dataDir); dirLock = locker.lockOrFail();
File lockDir = getLockDir(); removeInvalidLock(lockDir); try { FileLock fileLock = raf.getChannel().lock(); lock = createLock(raf, fileLock); sign(infoFile);
dirLock = new DirectoryLockManager(dataDir).lockOrFail();
private void removeInvalidLock(File lockDir) { try { boolean revokeLock = false; File lockedFile = new File(lockDir, LOCK_FILE_NAME); RandomAccessFile raf = new RandomAccessFile(lockedFile, "rw"); try { FileLock fileLock = raf.getChannel().tryLock(); if (fileLock != null) { logger.warn("Removing invalid lock {}", getLockedBy()); fileLock.release(); revokeLock = true; } } catch (OverlappingFileLockException exc) { // lock is still valid } finally { raf.close(); } if (revokeLock) { revokeLock(); } } catch (IOException e) { logger.warn(e.toString(), e); } }
private void sign(File infoFile) throws IOException { FileWriter out = new FileWriter(infoFile); try { out.write(getProcessName()); out.flush(); } finally { out.close(); } }
DirectoryLockManager locker = new DirectoryLockManager(dataDir); dataFile = new File(dataDir, DATA_FILE_NAME); syncFile = new File(dataDir, SYNC_FILE_NAME); dirLock = locker.tryLock(); if (dirLock == null) { logger.warn("Failed to lock directory: {}", dataDir); dirLock = locker.lockOrFail();
File lockDir = getLockDir(); removeInvalidLock(lockDir); try { FileLock fileLock = raf.getChannel().lock(); lock = createLock(raf, fileLock); sign(infoFile);
dirLock = new DirectoryLockManager(dataDir).lockOrFail();
private void removeInvalidLock(File lockDir) { try { boolean revokeLock = false; File lockedFile = new File(lockDir, LOCK_FILE_NAME); RandomAccessFile raf = new RandomAccessFile(lockedFile, "rw"); try { FileLock fileLock = raf.getChannel().tryLock(); if (fileLock != null) { logger.warn("Removing invalid lock {}", getLockedBy()); fileLock.release(); revokeLock = true; } } catch (OverlappingFileLockException exc) { // lock is still valid } finally { raf.close(); } if (revokeLock) { revokeLock(); } } catch (IOException e) { logger.warn(e.toString(), e); } }
private void sign(File infoFile) throws IOException { FileWriter out = new FileWriter(infoFile); try { out.write(getProcessName()); out.flush(); } finally { out.close(); } }
/** * Creates a lock in a directory if it does not yet exist. * * @return a newly acquired lock. * @throws SailLockedException * if the directory is already locked. */ @Override public Lock lockOrFail() throws SailLockedException { Lock lock = tryLock(); if (lock != null) { return lock; } String requestedBy = getProcessName(); String lockedBy = getLockedBy(); if (lockedBy != null) { throw new SailLockedException(lockedBy, requestedBy, this); } lock = tryLock(); if (lock != null) { return lock; } throw new SailLockedException(requestedBy); }
/** * Determines if the directory is locked. * * @return <code>true</code> if the directory is already locked. */ @Override public boolean isLocked() { return getLockDir().exists(); }
synchronized void delete() { try { if (raf.getChannel().isOpen()) { fileLock.release(); raf.close(); } } catch (IOException e) { logger.warn(e.toString(), e); } revokeLock(); } };
/** * Revokes a lock owned by another process. * * @return <code>true</code> if a lock was successfully revoked. */ @Override public boolean revokeLock() { File lockDir = getLockDir(); File lockedFile = new File(lockDir, LOCK_FILE_NAME); File infoFile = new File(lockDir, INFO_FILE_NAME); lockedFile.delete(); infoFile.delete(); return lockDir.delete(); }
/** * Revokes a lock owned by another process. * * @return <code>true</code> if a lock was successfully revoked. */ @Override public boolean revokeLock() { File lockDir = getLockDir(); File lockedFile = new File(lockDir, LOCK_FILE_NAME); File infoFile = new File(lockDir, INFO_FILE_NAME); lockedFile.delete(); infoFile.delete(); return lockDir.delete(); }
private String getLockedBy() { try { File lockDir = getLockDir(); File infoFile = new File(lockDir, INFO_FILE_NAME); BufferedReader reader = new BufferedReader(new FileReader(infoFile)); try { return reader.readLine(); } finally { reader.close(); } } catch (IOException e) { logger.warn(e.toString(), e); return null; } }
private String getLockedBy() { try { File lockDir = getLockDir(); File infoFile = new File(lockDir, INFO_FILE_NAME); BufferedReader reader = new BufferedReader(new FileReader(infoFile)); try { return reader.readLine(); } finally { reader.close(); } } catch (IOException e) { logger.warn(e.toString(), e); return null; } }