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();