From a70209de6941cf127904b0a514bcd64f522dff98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C4=81rti=C5=86=C5=A1=20Avots?= Date: Sat, 21 Mar 2026 21:53:12 +0100 Subject: [PATCH 1/3] Format finally block like others (#1800) --- .../src/main/java/org/eclipse/aether/named/NamedLock.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/maven-resolver-named-locks/src/main/java/org/eclipse/aether/named/NamedLock.java b/maven-resolver-named-locks/src/main/java/org/eclipse/aether/named/NamedLock.java index 4f5b3d2af..27866abff 100644 --- a/maven-resolver-named-locks/src/main/java/org/eclipse/aether/named/NamedLock.java +++ b/maven-resolver-named-locks/src/main/java/org/eclipse/aether/named/NamedLock.java @@ -29,8 +29,7 @@ * if (lock.lockExclusively(10L, Timeunit.SECONDS)) { * try { * ... exclusive access to "resourceName" resource gained here - * } - * finally { + * } finally { * lock.unlock(); * } * } From 3308b3829535db2606630baa0693daa8055ae7db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C4=81rti=C5=86=C5=A1=20Avots?= Date: Sat, 21 Mar 2026 22:23:39 +0100 Subject: [PATCH 2/3] Draft named file locking (#1800) --- .../impl/DefaultTrackingFileManager.java | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.java index 9f10b0115..40c14c0a7 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.java @@ -36,7 +36,11 @@ import java.nio.file.StandardOpenOption; import java.util.Map; import java.util.Properties; +import java.util.concurrent.TimeUnit; +import org.eclipse.aether.named.NamedLock; +import org.eclipse.aether.named.NamedLockKey; +import org.eclipse.aether.named.providers.FileLockNamedLockFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,6 +56,7 @@ @Named public final class DefaultTrackingFileManager implements TrackingFileManager { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultTrackingFileManager.class); + private static final FileLockNamedLockFactory FILE_LOCK_FACTORY = new FileLockNamedLockFactory(); @Deprecated @Override @@ -62,18 +67,24 @@ public Properties read(File file) { @Override public Properties read(Path path) { if (Files.isReadable(path)) { - synchronized (mutex(path)) { - try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ); - FileLock unused = fileLock(fileChannel, true)) { - Properties props = new Properties(); - props.load(Channels.newInputStream(fileChannel)); - return props; - } catch (NoSuchFileException e) { - LOGGER.debug("No such file to read {}: {}", path, e.getMessage()); - } catch (IOException e) { - LOGGER.warn("Failed to read tracking file '{}'", path, e); - throw new UncheckedIOException(e); + final String lockUri = lockUri(path); + try (NamedLock lock = FILE_LOCK_FACTORY.getLock(NamedLockKey.of(lockUri, lockUri))) { + if (lock.lockExclusively(10L, TimeUnit.SECONDS)) { + try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) { + Properties props = new Properties(); + props.load(Channels.newInputStream(fileChannel)); + return props; + } catch (NoSuchFileException e) { + LOGGER.debug("No such file to read {}: {}", path, e.getMessage()); + } catch (IOException e) { + LOGGER.warn("Failed to read tracking file '{}'", path, e); + throw new UncheckedIOException(e); + } finally { + lock.unlock(); + } } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); } } return null; @@ -164,6 +175,10 @@ private static Object mutex(Path path) { return canonicalPath(path).toString().intern(); } + private static String lockUri(Path path) { + return canonicalPath(path).toUri().toString(); + } + /** * Tries the best it can to figure out actual file the workload is about, while resolving cases like symlinked * local repository etc. From 4808f113d92a7384fa32ae158b0d9d5625867dea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C4=81rti=C5=86=C5=A1=20Avots?= Date: Sun, 22 Mar 2026 17:22:51 +0100 Subject: [PATCH 3/3] Avoid magic constant (#1800) --- .../aether/internal/impl/DefaultTrackingFileManager.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.java index 40c14c0a7..b35a985e0 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultTrackingFileManager.java @@ -44,6 +44,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import static java.util.concurrent.TimeUnit.SECONDS; + /** * Manages access to a properties file. *

@@ -57,6 +59,7 @@ public final class DefaultTrackingFileManager implements TrackingFileManager { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultTrackingFileManager.class); private static final FileLockNamedLockFactory FILE_LOCK_FACTORY = new FileLockNamedLockFactory(); + private static final long FILE_LOCK_TIMEOUT = 10L; @Deprecated @Override @@ -69,7 +72,7 @@ public Properties read(Path path) { if (Files.isReadable(path)) { final String lockUri = lockUri(path); try (NamedLock lock = FILE_LOCK_FACTORY.getLock(NamedLockKey.of(lockUri, lockUri))) { - if (lock.lockExclusively(10L, TimeUnit.SECONDS)) { + if (lock.lockExclusively(FILE_LOCK_TIMEOUT, SECONDS)) { try (FileChannel fileChannel = FileChannel.open(path, StandardOpenOption.READ)) { Properties props = new Properties(); props.load(Channels.newInputStream(fileChannel));