Package org.h2.store

Class FileLock

java.lang.Object
org.h2.store.FileLock
All Implemented Interfaces:
Runnable

public class FileLock extends Object implements Runnable
The file lock is used to lock a database so that only one process can write to it. It uses a cooperative locking protocol. Usually a .lock.db file is used, but locking by creating a socket is supported as well.
  • Field Details

    • MAGIC

      private static final String MAGIC
      See Also:
    • FILE

      private static final String FILE
      See Also:
    • SOCKET

      private static final String SOCKET
      See Also:
    • RANDOM_BYTES

      private static final int RANDOM_BYTES
      See Also:
    • SLEEP_GAP

      private static final int SLEEP_GAP
      See Also:
    • TIME_GRANULARITY

      private static final int TIME_GRANULARITY
      See Also:
    • fileName

      private volatile String fileName
      The lock file name.
    • serverSocket

      private volatile ServerSocket serverSocket
      The server socket (only used when using the SOCKET mode).
    • locked

      private volatile boolean locked
      Whether the file is locked.
    • sleep

      private final int sleep
      The number of milliseconds to sleep after checking a file.
    • trace

      private final Trace trace
      The trace object.
    • lastWrite

      private long lastWrite
      The last time the lock file was written.
    • method

      private String method
    • properties

      private Properties properties
    • uniqueId

      private String uniqueId
    • watchdog

      private Thread watchdog
  • Constructor Details

    • FileLock

      public FileLock(TraceSystem traceSystem, String fileName, int sleep)
      Create a new file locking object.
      Parameters:
      traceSystem - the trace system to use
      fileName - the file name
      sleep - the number of milliseconds to sleep
  • Method Details

    • lock

      public void lock(FileLockMethod fileLockMethod)
      Lock the file if possible. A file may only be locked once.
      Parameters:
      fileLockMethod - the file locking method to use
      Throws:
      DbException - if locking was not successful
    • unlock

      public void unlock()
      Unlock the file. The watchdog thread is stopped. This method does nothing if the file is already unlocked.
    • setProperty

      public void setProperty(String key, String value)
      Add or change a setting to the properties. This call does not save the file.
      Parameters:
      key - the key
      value - the value
    • save

      public Properties save()
      Save the lock file.
      Returns:
      the saved properties
    • aggressiveLastModified

      private static long aggressiveLastModified(String fileName)
      Aggressively read last modified time, to work-around remote filesystems.
      Parameters:
      fileName - file name to check
      Returns:
      last modified date/time in milliseconds UTC
    • checkServer

      private void checkServer()
    • load

      public Properties load()
      Load the properties file.
      Returns:
      the properties
    • waitUntilOld

      private void waitUntilOld()
    • setUniqueId

      private void setUniqueId()
    • lockFile

      private void lockFile()
    • lockSocket

      private void lockSocket()
    • sleep

      private static void sleep(int time)
    • getExceptionFatal

      private static DbException getExceptionFatal(String reason, Throwable t)
    • getExceptionAlreadyInUse

      private DbException getExceptionAlreadyInUse(String reason)
    • getFileLockMethod

      public static FileLockMethod getFileLockMethod(String method)
      Get the file locking method type given a method name.
      Parameters:
      method - the method name
      Returns:
      the method type
      Throws:
      DbException - if the method name is unknown
    • getUniqueId

      public String getUniqueId()
    • run

      public void run()
      Specified by:
      run in interface Runnable