You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by og...@apache.org on 2008/10/07 00:05:02 UTC

svn commit: r702289 - in /maven/sandbox/trunk/mercury/mercury-util/src: main/java/org/apache/maven/mercury/util/FileUtil.java test/java/org/apache/maven/mercury/util/FileUtilTest.java

Author: ogusakov
Date: Mon Oct  6 15:05:02 2008
New Revision: 702289

URL: http://svn.apache.org/viewvc?rev=702289&view=rev
Log:
synchronized file locking for http://jira.codehaus.org/browse/MERCURY-7

Modified:
    maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java
    maven/sandbox/trunk/mercury/mercury-util/src/test/java/org/apache/maven/mercury/util/FileUtilTest.java

Modified: maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java?rev=702289&r1=702288&r2=702289&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java (original)
+++ maven/sandbox/trunk/mercury/mercury-util/src/main/java/org/apache/maven/mercury/util/FileUtil.java Mon Oct  6 15:05:02 2008
@@ -721,6 +721,7 @@
   public static FileLockBundle lockDir( String dir, long millis, long sleepFor )
   throws IOException
   {
+    
     File df = new File(dir);
     
     boolean exists = df.exists(); 
@@ -735,47 +736,35 @@
 
     if( !exists )
       throw new IOException( _lang.getMessage( "cannot.create.directory", dir ) );
-
+    
     if( !df.isDirectory() )
       throw new IOException( _lang.getMessage( "file.is.not.directory", dir, df.exists()+"", df.isDirectory()+"", df.isFile()+"" ) );
     
-    File lock = new File(dir,LOCK_FILE);
+    File lockFile = new File(dir,LOCK_FILE);
+
     long start = System.currentTimeMillis();
 
-    byte [] lockId = (""+System.nanoTime()+""+Math.random()).getBytes();
-    int lockIdLen = lockId.length;
-    
-    for(;;)
+    for( long now = start; (now-start) < millis; now = System.currentTimeMillis() )
       try
       {
-        if( lock.exists() )
-          throw new OverlappingFileLockException();
+        synchronized( FileUtil.class )
+        {
+          if( !lockFile.exists() )
+          {
+            writeRawData( lockFile, "lock" );
+            lockFile.deleteOnExit();
+            return new FileLockBundle( dir );
+          }
+        }
+        Thread.sleep( sleepFor );
 
-        FileOutputStream fos = new FileOutputStream( lock );
-        fos.write( lockId, 0, lockIdLen );
-        fos.flush();
-        fos.close();
-        
-        byte [] lockBytes = readRawData( lock );
-        int lockBytesLen = lockBytes.length;
-        
-        if( lockBytesLen != lockIdLen )
-          throw new OverlappingFileLockException();
-        
-        for( int i=0; i<lockIdLen; i++ )
-          if( lockBytes[i] != lockId[i] )
-            throw new OverlappingFileLockException();
-        
-        lock.deleteOnExit();
-
-        return new FileLockBundle(dir);
       }
-      catch( OverlappingFileLockException le )
+      catch( InterruptedException ie )
       {
-        try { Thread.sleep( sleepFor ); } catch( InterruptedException e ){}
-        if( System.currentTimeMillis() - start > millis )
-          return null;
       }
+      
+      // too long a wait
+      return null;
   }
   //---------------------------------------------------------------------------------------------------------------
   /**
@@ -816,8 +805,6 @@
     
     FileChannel ch = new RandomAccessFile( lockFile, "rw" ).getChannel();
     FileLock lock = null;
-System.out.println("locking channel "+lockFile.getAbsolutePath()+", channel isOpen()="+ch.isOpen() );
-System.out.flush();
     
     long start = System.currentTimeMillis();
 
@@ -833,15 +820,14 @@
       }
       catch( OverlappingFileLockException oe )
       {
-System.out.println("channel "+lockFile.getAbsolutePath()+" locked, waiting" );
-System.out.flush();
         try { Thread.sleep( sleepFor ); } catch( InterruptedException e ){}
         if( System.currentTimeMillis() - start > millis )
           return null;
       }
+      
   }
   //---------------------------------------------------------------------------------------------------------------
-  public static void unlockDir( String dir )
+  public static synchronized void unlockDir( String dir )
   {
     try
     {

Modified: maven/sandbox/trunk/mercury/mercury-util/src/test/java/org/apache/maven/mercury/util/FileUtilTest.java
URL: http://svn.apache.org/viewvc/maven/sandbox/trunk/mercury/mercury-util/src/test/java/org/apache/maven/mercury/util/FileUtilTest.java?rev=702289&r1=702288&r2=702289&view=diff
==============================================================================
--- maven/sandbox/trunk/mercury/mercury-util/src/test/java/org/apache/maven/mercury/util/FileUtilTest.java (original)
+++ maven/sandbox/trunk/mercury/mercury-util/src/test/java/org/apache/maven/mercury/util/FileUtilTest.java Mon Oct  6 15:05:02 2008
@@ -269,7 +269,8 @@
     say("Multi-threaded test finished successfully");
   }
   //----------------------------------------------------------------------------------------
-  public void testLockNio()
+  // TODO: 2008-10-06 Oleg: enable if switching to NIO locking between processes
+  public void notestLockNio()
   throws Exception
   {
     Ok th1ok = new Ok();