You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2017/09/20 20:36:37 UTC
archiva git commit: Finally switching the file lock to java.nio
Repository: archiva
Updated Branches:
refs/heads/master 5806dc298 -> bed24eac4
Finally switching the file lock to java.nio
Project: http://git-wip-us.apache.org/repos/asf/archiva/repo
Commit: http://git-wip-us.apache.org/repos/asf/archiva/commit/bed24eac
Tree: http://git-wip-us.apache.org/repos/asf/archiva/tree/bed24eac
Diff: http://git-wip-us.apache.org/repos/asf/archiva/diff/bed24eac
Branch: refs/heads/master
Commit: bed24eac4430aec88d121c1f266a98d6ff124785
Parents: 5806dc2
Author: Martin Stockhammer <ma...@ars.de>
Authored: Wed Sep 20 22:34:10 2017 +0200
Committer: Martin Stockhammer <ma...@ars.de>
Committed: Wed Sep 20 22:34:10 2017 +0200
----------------------------------------------------------------------
.../common/filelock/DefaultFileLockManager.java | 67 +++++++-------------
.../common/filelock/FileLockManager.java | 6 +-
.../apache/archiva/common/filelock/Lock.java | 28 +++-----
.../filelock/DefaultFileLockManagerTest.java | 40 ++++++------
.../DefaultFileLockManagerTimeoutTest.java | 13 ++--
.../proxy/DefaultRepositoryProxyConnectors.java | 21 +++---
.../archiva/webdav/ArchivaDavResource.java | 4 +-
7 files changed, 75 insertions(+), 104 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/archiva/blob/bed24eac/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/DefaultFileLockManager.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/DefaultFileLockManager.java b/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/DefaultFileLockManager.java
index dcfeb04..b256fe2 100644
--- a/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/DefaultFileLockManager.java
+++ b/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/DefaultFileLockManager.java
@@ -24,11 +24,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
-import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.RandomAccessFile;
import java.nio.channels.ClosedChannelException;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -43,7 +44,7 @@ public class DefaultFileLockManager
// TODO currently we create lock for read and write!!
// the idea could be to store lock here with various clients read/write
// only read could be a more simple lock and acquire a write lock means waiting the end of all reading threads
- private static final ConcurrentMap<File, Lock> lockFiles = new ConcurrentHashMap<File, Lock>( 64 );
+ private static final ConcurrentMap<Path, Lock> lockFiles = new ConcurrentHashMap<Path, Lock>( 64 );
private boolean skipLocking = true;
@@ -53,7 +54,7 @@ public class DefaultFileLockManager
@Override
- public Lock readFileLock( File file )
+ public Lock readFileLock( Path file )
throws FileLockException, FileLockTimeoutException
{
if ( skipLocking )
@@ -63,7 +64,11 @@ public class DefaultFileLockManager
}
StopWatch stopWatch = new StopWatch();
boolean acquired = false;
- mkdirs( file.getParentFile() );
+ try {
+ mkdirs(file.getParent());
+ } catch (IOException e) {
+ throw new FileLockException("Could not create directories "+file.getParent(), e);
+ }
Lock lock = null;
@@ -116,14 +121,9 @@ public class DefaultFileLockManager
lock=null;
}
}
- catch ( FileNotFoundException e )
+ catch ( FileNotFoundException | NoSuchFileException e )
{
- // can happen if an other thread has deleted the file
- // close RandomAccessFile!!!
- if ( lock != null )
- {
- closeQuietly( lock.getRandomAccessFile() );
- }
+
log.debug( "read Lock skip: {} try to create file", e.getMessage() );
createNewFileQuietly( file );
}
@@ -143,7 +143,7 @@ public class DefaultFileLockManager
@Override
- public Lock writeFileLock( File file )
+ public Lock writeFileLock( Path file )
throws FileLockException, FileLockTimeoutException
{
if ( skipLocking )
@@ -151,7 +151,11 @@ public class DefaultFileLockManager
return new Lock( file );
}
- mkdirs( file.getParentFile() );
+ try {
+ mkdirs( file.getParent() );
+ } catch (IOException e) {
+ throw new FileLockException("Could not create directory "+file.getParent(), e);
+ }
StopWatch stopWatch = new StopWatch();
boolean acquired = false;
@@ -207,14 +211,9 @@ public class DefaultFileLockManager
lock=null;
}
}
- catch ( FileNotFoundException e )
+ catch ( FileNotFoundException | NoSuchFileException e )
{
- // can happen if an other thread has deleted the file
- // close RandomAccessFile!!!
- if ( lock != null )
- {
- closeQuietly( lock.getRandomAccessFile() );
- }
+
log.debug( "write Lock skip: {} try to create file", e.getMessage() );
createNewFileQuietly( file );
}
@@ -233,28 +232,11 @@ public class DefaultFileLockManager
}
- private void closeQuietly( RandomAccessFile randomAccessFile )
- {
- if ( randomAccessFile == null )
- {
- return;
- }
-
- try
- {
- randomAccessFile.close();
- }
- catch ( IOException e )
- {
- // ignore
- }
- }
-
- private void createNewFileQuietly( File file )
+ private void createNewFileQuietly( Path file )
{
try
{
- file.createNewFile();
+ Files.createFile(file);
}
catch ( IOException e )
{
@@ -297,9 +279,8 @@ public class DefaultFileLockManager
lockFiles.clear();
}
- private boolean mkdirs( File directory )
- {
- return directory.mkdirs();
+ private Path mkdirs( Path directory ) throws IOException {
+ return Files.createDirectories(directory);
}
@Override
http://git-wip-us.apache.org/repos/asf/archiva/blob/bed24eac/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/FileLockManager.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/FileLockManager.java b/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/FileLockManager.java
index 80f6a57..a23d978 100644
--- a/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/FileLockManager.java
+++ b/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/FileLockManager.java
@@ -19,8 +19,8 @@ package org.apache.archiva.common.filelock;
* under the License.
*/
-import java.io.File;
import java.io.FileNotFoundException;
+import java.nio.file.Path;
/**
* @author Olivier Lamy
@@ -35,7 +35,7 @@ public interface FileLockManager
* @throws FileLockException
* @throws FileLockTimeoutException
*/
- Lock writeFileLock( File file )
+ Lock writeFileLock( Path file )
throws FileLockException, FileLockTimeoutException;
/**
@@ -45,7 +45,7 @@ public interface FileLockManager
* @throws FileLockException
* @throws FileLockTimeoutException
*/
- Lock readFileLock( File file )
+ Lock readFileLock( Path file )
throws FileLockException, FileLockTimeoutException;
void release( Lock lock )
http://git-wip-us.apache.org/repos/asf/archiva/blob/bed24eac/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/Lock.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/Lock.java b/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/Lock.java
index 17b19c0..ab10d74 100644
--- a/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/Lock.java
+++ b/archiva-modules/archiva-base/archiva-filelock/src/main/java/org/apache/archiva/common/filelock/Lock.java
@@ -20,12 +20,11 @@ package org.apache.archiva.common.filelock;
*/
import java.io.Closeable;
-import java.io.File;
-import java.io.FileNotFoundException;
import java.io.IOException;
-import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -37,7 +36,7 @@ import java.util.concurrent.atomic.AtomicInteger;
*/
public class Lock
{
- private File file;
+ private Path file;
private AtomicBoolean write;
@@ -45,25 +44,22 @@ public class Lock
private FileLock fileLock;
- private RandomAccessFile randomAccessFile;
-
private FileChannel fileChannel;
- public Lock( File file )
+ public Lock( Path file )
{
this.file = file;
}
- public Lock( File file, boolean write )
- throws FileNotFoundException
+ public Lock( Path file, boolean write )
+ throws IOException
{
this.file = file;
this.write = new AtomicBoolean( write );
- randomAccessFile = new RandomAccessFile( file, write ? "rw" : "r" );
- fileChannel = randomAccessFile.getChannel();
+ fileChannel = write ? FileChannel.open(file, StandardOpenOption.WRITE, StandardOpenOption.READ) : FileChannel.open(file, StandardOpenOption.READ);
}
- public File getFile()
+ public Path getFile()
{
return file;
}
@@ -73,7 +69,7 @@ public class Lock
return write;
}
- public void setFile( File file )
+ public void setFile( Path file )
{
this.file = file;
}
@@ -122,7 +118,6 @@ public class Lock
}
closeQuietly( fileChannel );
- closeQuietly( randomAccessFile );
fileClients.remove( Thread.currentThread() );
@@ -144,10 +139,7 @@ public class Lock
}
- protected RandomAccessFile getRandomAccessFile()
- {
- return randomAccessFile;
- }
+
private void closeQuietly( Closeable closeable )
{
http://git-wip-us.apache.org/repos/asf/archiva/blob/bed24eac/archiva-modules/archiva-base/archiva-filelock/src/test/java/org/apache/archiva/common/filelock/DefaultFileLockManagerTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-filelock/src/test/java/org/apache/archiva/common/filelock/DefaultFileLockManagerTest.java b/archiva-modules/archiva-base/archiva-filelock/src/test/java/org/apache/archiva/common/filelock/DefaultFileLockManagerTest.java
index adcdbc7..ebebf15 100644
--- a/archiva-modules/archiva-base/archiva-filelock/src/test/java/org/apache/archiva/common/filelock/DefaultFileLockManagerTest.java
+++ b/archiva-modules/archiva-base/archiva-filelock/src/test/java/org/apache/archiva/common/filelock/DefaultFileLockManagerTest.java
@@ -32,11 +32,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.inject.Inject;
import javax.inject.Named;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.nio.file.FileAlreadyExistsException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -66,9 +62,9 @@ public class DefaultFileLockManagerTest {
FileLockManager fileLockManager;
- File file = new File(System.getProperty("buildDirectory"), "foo.txt");
+ Path file = Paths.get(System.getProperty("buildDirectory"), "foo.txt");
- File largeJar = new File(System.getProperty("basedir"), "src/test/cassandra-all-2.0.3.jar");
+ Path largeJar = Paths.get(System.getProperty("basedir"), "src/test/cassandra-all-2.0.3.jar");
ConcurrentFileWrite(FileLockManager fileLockManager)
throws IOException {
@@ -104,8 +100,8 @@ public class DefaultFileLockManagerTest {
logger.info("thread1");
Lock lock = fileLockManager.writeFileLock(this.file);
try {
- lock.getFile().delete();
- copyFile(largeJar.toPath(), lock.getFile().toPath());
+ Files.deleteIfExists(lock.getFile());
+ copyFile(largeJar, lock.getFile());
} finally {
fileLockManager.release(lock);
}
@@ -124,8 +120,8 @@ public class DefaultFileLockManagerTest {
logger.info("thread2");
Lock lock = fileLockManager.writeFileLock(this.file);
try {
- lock.getFile().delete();
- copyFile(largeJar.toPath(), lock.getFile().toPath());
+ Files.deleteIfExists(lock.getFile());
+ copyFile(largeJar, lock.getFile());
} finally {
fileLockManager.release(lock);
}
@@ -147,7 +143,7 @@ public class DefaultFileLockManagerTest {
Path outFile = null;
try {
outFile = Files.createTempFile("foo", ".jar");
- Files.copy(Paths.get(lock.getFile().getPath()),
+ Files.copy(lock.getFile(),
Files.newOutputStream(outFile));
} finally {
fileLockManager.release(lock);
@@ -169,8 +165,8 @@ public class DefaultFileLockManagerTest {
logger.info("thread4");
Lock lock = fileLockManager.writeFileLock(this.file);
try {
- lock.getFile().delete();
- copyFile(largeJar.toPath(), lock.getFile().toPath());
+ Files.deleteIfExists(lock.getFile());
+ copyFile(largeJar, lock.getFile());
} finally {
fileLockManager.release(lock);
}
@@ -190,8 +186,8 @@ public class DefaultFileLockManagerTest {
logger.info("thread5");
Lock lock = fileLockManager.writeFileLock(this.file);
try {
- lock.getFile().delete();
- copyFile(largeJar.toPath(), lock.getFile().toPath());
+ Files.deleteIfExists(lock.getFile());
+ copyFile(largeJar, lock.getFile());
} finally {
fileLockManager.release(lock);
}
@@ -213,7 +209,7 @@ public class DefaultFileLockManagerTest {
Path outFile = null;
try {
outFile = Files.createTempFile("foo", ".jar");
- Files.copy(lock.getFile().toPath(), Files.newOutputStream( outFile ));
+ Files.copy(lock.getFile(), Files.newOutputStream( outFile ));
} finally {
fileLockManager.release(lock);
if (outFile!=null) Files.delete( outFile );
@@ -234,8 +230,8 @@ public class DefaultFileLockManagerTest {
logger.info("thread7");
Lock lock = fileLockManager.writeFileLock(this.file);
try {
- lock.getFile().delete();
- copyFile(largeJar.toPath(), lock.getFile().toPath());
+ Files.deleteIfExists(lock.getFile());
+ copyFile(largeJar, lock.getFile());
} finally {
fileLockManager.release(lock);
}
@@ -257,7 +253,7 @@ public class DefaultFileLockManagerTest {
Path outFile = null;
try {
outFile = Files.createTempFile("foo", ".jar");
- Files.copy(lock.getFile().toPath(), Files.newOutputStream( outFile ));
+ Files.copy(lock.getFile(), Files.newOutputStream( outFile ));
} finally {
fileLockManager.release(lock);
if (outFile!=null) Files.delete( outFile );
@@ -278,8 +274,8 @@ public class DefaultFileLockManagerTest {
logger.info("thread9");
Lock lock = fileLockManager.writeFileLock(this.file);
try {
- lock.getFile().delete();
- copyFile(largeJar.toPath(), lock.getFile().toPath());
+ Files.deleteIfExists(lock.getFile());
+ copyFile(largeJar, lock.getFile());
} finally {
fileLockManager.release(lock);
}
@@ -300,7 +296,7 @@ public class DefaultFileLockManagerTest {
Path outFile = null;
try {
outFile = Files.createTempFile("foo", ".jar");
- Files.copy(lock.getFile().toPath(), Files.newOutputStream( outFile ));
+ Files.copy(lock.getFile(), Files.newOutputStream( outFile ));
} finally {
fileLockManager.release(lock);
if (outFile!=null) Files.delete(outFile);
http://git-wip-us.apache.org/repos/asf/archiva/blob/bed24eac/archiva-modules/archiva-base/archiva-filelock/src/test/java/org/apache/archiva/common/filelock/DefaultFileLockManagerTimeoutTest.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-filelock/src/test/java/org/apache/archiva/common/filelock/DefaultFileLockManagerTimeoutTest.java b/archiva-modules/archiva-base/archiva-filelock/src/test/java/org/apache/archiva/common/filelock/DefaultFileLockManagerTimeoutTest.java
index 514dfde..6ed069a 100644
--- a/archiva-modules/archiva-base/archiva-filelock/src/test/java/org/apache/archiva/common/filelock/DefaultFileLockManagerTimeoutTest.java
+++ b/archiva-modules/archiva-base/archiva-filelock/src/test/java/org/apache/archiva/common/filelock/DefaultFileLockManagerTimeoutTest.java
@@ -29,11 +29,8 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.inject.Inject;
import javax.inject.Named;
-import java.io.File;
import java.io.IOException;
-import java.nio.file.FileSystemException;
-import java.nio.file.Files;
-import java.nio.file.StandardCopyOption;
+import java.nio.file.*;
/**
* @author Olivier Lamy
@@ -65,16 +62,16 @@ public class DefaultFileLockManagerTimeoutTest
{
try {
- File file = new File(System.getProperty("buildDirectory"), "foo.txt");
+ Path file = Paths.get(System.getProperty("buildDirectory"), "foo.txt");
- Files.deleteIfExists(file.toPath());
+ Files.deleteIfExists(file);
- File largeJar = new File(System.getProperty("basedir"), "src/test/cassandra-all-2.0.3.jar");
+ Path largeJar = Paths.get(System.getProperty("basedir"), "src/test/cassandra-all-2.0.3.jar");
Lock lock = fileLockManager.writeFileLock(file);
try {
- Files.copy(largeJar.toPath(), lock.getFile().toPath(), StandardCopyOption.REPLACE_EXISTING);
+ Files.copy(largeJar, lock.getFile(), StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
logger.warn("Copy failed {}", e.getMessage());
// On windows a FileSystemException is thrown
http://git-wip-us.apache.org/repos/asf/archiva/blob/bed24eac/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyConnectors.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyConnectors.java b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyConnectors.java
index f04fe19..4266bf7 100644
--- a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyConnectors.java
+++ b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/archiva/proxy/DefaultRepositoryProxyConnectors.java
@@ -1089,17 +1089,22 @@ public class DefaultRepositoryProxyConnectors
Lock lock;
try
{
- lock = fileLockManager.writeFileLock( target.toFile() );
- if ( lock.getFile().exists() && !lock.getFile().delete() )
- {
+ lock = fileLockManager.writeFileLock( target );
+ try {
+ Files.deleteIfExists(lock.getFile());
+ } catch (IOException e) {
throw new ProxyException( "Unable to overwrite existing target file: " + target.toAbsolutePath() );
}
- lock.getFile().getParentFile().mkdirs();
+ try {
+ Files.createDirectories(lock.getFile().getParent());
+ } catch (IOException e) {
+ throw new ProxyException("Unable to create parent directory "+lock.getFile().getParent());
+ }
try
{
- Files.move(temp, lock.getFile().toPath() );
+ Files.move(temp, lock.getFile() );
}
catch ( IOException e )
{
@@ -1107,14 +1112,14 @@ public class DefaultRepositoryProxyConnectors
try
{
- Files.copy( temp, lock.getFile().toPath() );
+ Files.copy( temp, lock.getFile());
}
catch ( IOException e2 )
{
- if ( lock.getFile().exists() )
+ if ( Files.exists(lock.getFile()) )
{
log.debug( "Tried to copy file {} to {} but file with this name already exists.",
- temp.getFileName(), lock.getFile().getAbsolutePath() );
+ temp.getFileName(), lock.getFile().toAbsolutePath() );
}
else
{
http://git-wip-us.apache.org/repos/asf/archiva/blob/bed24eac/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResource.java
----------------------------------------------------------------------
diff --git a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResource.java b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResource.java
index 4124331..b152e89 100644
--- a/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResource.java
+++ b/archiva-modules/archiva-web/archiva-webdav/src/main/java/org/apache/archiva/webdav/ArchivaDavResource.java
@@ -212,8 +212,8 @@ public class ArchivaDavResource
{
if ( !isCollection() && outputContext.hasStream() )
{
- Lock lock = fileLockManager.readFileLock( localResource.toFile() );
- try (InputStream is = Files.newInputStream( lock.getFile().toPath() ))
+ Lock lock = fileLockManager.readFileLock( localResource );
+ try (InputStream is = Files.newInputStream( lock.getFile()))
{
IOUtils.copy( is, outputContext.getOutputStream() );
}