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