You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2007/10/10 15:12:39 UTC

svn commit: r583465 - /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/RepositoryLock.java

Author: thomasm
Date: Wed Oct 10 06:12:38 2007
New Revision: 583465

URL: http://svn.apache.org/viewvc?rev=583465&view=rev
Log:
JCR-1170: Repository lock keeps file open

Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/RepositoryLock.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/RepositoryLock.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/RepositoryLock.java?rev=583465&r1=583464&r2=583465&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/RepositoryLock.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/RepositoryLock.java Wed Oct 10 06:12:38 2007
@@ -51,7 +51,7 @@
     /**
      * Logger instance.
      */
-    private static final Logger log =
+    private static final Logger LOG =
         LoggerFactory.getLogger(RepositoryLock.class);
 
     /**
@@ -63,6 +63,11 @@
      * The lock file within the given directory.
      */
     private final File file;
+    
+    /**
+     * The random access file.
+     */
+    private RandomAccessFile randomAccessFile;
 
     /**
      * Unique identifier (canonical path name) of the locked directory.
@@ -108,12 +113,26 @@
      */
     public void acquire() throws RepositoryException {
         if (file.exists()) {
-            log.warn("Existing lock file " + file + " detected."
+            LOG.warn("Existing lock file " + file + " detected."
                     + " Repository was not shut down properly.");
         }
-
         try {
-            lock = new RandomAccessFile(file, "rw").getChannel().tryLock();
+            tryLock();
+        } catch (RepositoryException e) {
+            closeRandomAccessFile();
+            throw e;
+        }
+    }
+    
+    /**
+     * Try to lock the random access file.
+     * 
+     * @throws RepositoryException
+     */
+    private void tryLock() throws RepositoryException {
+        try {
+            randomAccessFile = new RandomAccessFile(file, "rw");
+            lock = randomAccessFile.getChannel().tryLock();
         } catch (IOException e) {
             throw new RepositoryException(
                     "Unable to create or lock file " + file, e);
@@ -150,11 +169,25 @@
                 try {
                     System.setProperty(identifier, identifier);
                 } catch (SecurityException e) {
-                    log.warn("Unable to set system property: " + identifier, e);
+                    LOG.warn("Unable to set system property: " + identifier, e);
                 }
             }
         }
     }
+    
+    /**
+     * Close the random access file if it is open, and set it to null.
+     */
+    private void closeRandomAccessFile() {
+        if (randomAccessFile != null) {
+            try {
+                randomAccessFile.close();
+            } catch (IOException e) {
+                LOG.warn("Unable to close the random access file " + file, e);
+            }
+            randomAccessFile = null;
+        }
+    }    
 
     /**
      * Releases repository lock.
@@ -169,10 +202,11 @@
                 // ignore
             }
             lock = null;
+            closeRandomAccessFile();
         }
 
         if (!file.delete()) {
-            log.error("Unable to release repository lock");
+            LOG.warn("Unable to delete repository lock file");
         }
 
         // JCR-933: see #acquire()
@@ -180,9 +214,9 @@
             try {
                 System.getProperties().remove(identifier);
             } catch (SecurityException e) {
-                log.error("Unable to clear system property: " + identifier, e);
+                LOG.error("Unable to clear system property: " + identifier, e);
             }
         }
     }
-
+    
 }