From 7e2a2940c4eed39a9b7f85721f18e75045ee72f8 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Mon, 17 Nov 2025 21:26:05 +0100 Subject: [PATCH 1/6] [1.9.x] Do not serialize losers Use assymetric lock times, and losers should not become serialized, so introduce yet another loop after attempt of exclusive lock. This improves runtime of reproducer too, as middle tasks are now able to run in parallel. --- .../impl/DefaultArtifactResolver.java | 51 +++++++++----- .../impl/DefaultMetadataResolver.java | 66 +++++++++++++------ .../named/NamedLockFactoryAdapter.java | 42 +++++++----- .../NamedLockFactoryAdapterTestSupport.java | 1 + 4 files changed, 107 insertions(+), 53 deletions(-) diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java index 044302461..25c0952d1 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java @@ -31,6 +31,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Supplier; import org.eclipse.aether.RepositoryEvent; import org.eclipse.aether.RepositoryEvent.EventType; @@ -248,32 +249,46 @@ public List resolveArtifacts( throws ArtifactResolutionException { requireNonNull(session, "session cannot be null"); requireNonNull(requests, "requests cannot be null"); - try (SyncContext shared = syncContextFactory.newInstance(session, true); - SyncContext exclusive = syncContextFactory.newInstance(session, false)) { - Collection artifacts = new ArrayList<>(requests.size()); - for (ArtifactRequest request : requests) { - if (request.getArtifact().getProperty(ArtifactProperties.LOCAL_PATH, null) != null) { - continue; - } - artifacts.add(request.getArtifact()); + Collection artifacts = new ArrayList<>(requests.size()); + for (ArtifactRequest request : requests) { + if (request.getArtifact().getProperty(ArtifactProperties.LOCAL_PATH, null) != null) { + continue; } - - return resolve(shared, exclusive, artifacts, session, requests); + artifacts.add(request.getArtifact()); } + + return resolve( + () -> syncContextFactory.newInstance(session, true), + () -> syncContextFactory.newInstance(session, false), + artifacts, + session, + requests); } @SuppressWarnings("checkstyle:methodlength") private List resolve( - SyncContext shared, - SyncContext exclusive, + Supplier sharedSupplier, + Supplier exclusiveSupplier, Collection subjects, RepositorySystemSession session, Collection requests) throws ArtifactResolutionException { - SyncContext current = shared; + boolean firstAttempt = true; + boolean shared = true; + SyncContext current = sharedSupplier.get(); try { while (true) { - current.acquire(subjects, null); + try { + current.acquire(subjects, null); + } catch (SyncContext.FailedToAcquireLockException e) { + if (e.isShared()) { + throw e; + } else { + current.close(); + shared = true; + current = sharedSupplier.get(); + } + } boolean failures = false; final List results = new ArrayList<>(requests.size()); @@ -292,7 +307,7 @@ private List resolve( Artifact artifact = request.getArtifact(); - if (current == shared) { + if (firstAttempt) { artifactResolving(session, trace, artifact); } @@ -439,9 +454,11 @@ private List resolve( } } - if (!groups.isEmpty() && current == shared) { + if (!groups.isEmpty() && shared) { + firstAttempt = false; current.close(); - current = exclusive; + current = exclusiveSupplier.get(); + shared = false; continue; } diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java index b0620cd7b..36ef93f97 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.Executor; +import java.util.function.Supplier; import org.eclipse.aether.RepositoryEvent; import org.eclipse.aether.RepositoryEvent.EventType; @@ -170,28 +171,42 @@ public List resolveMetadata( RepositorySystemSession session, Collection requests) { requireNonNull(session, "session cannot be null"); requireNonNull(requests, "requests cannot be null"); - try (SyncContext shared = syncContextFactory.newInstance(session, true); - SyncContext exclusive = syncContextFactory.newInstance(session, false)) { - Collection metadata = new ArrayList<>(requests.size()); - for (MetadataRequest request : requests) { - metadata.add(request.getMetadata()); - } - - return resolve(shared, exclusive, metadata, session, requests); + Collection metadata = new ArrayList<>(requests.size()); + for (MetadataRequest request : requests) { + metadata.add(request.getMetadata()); } + + return resolve( + () -> syncContextFactory.newInstance(session, true), + () -> syncContextFactory.newInstance(session, false), + metadata, + session, + requests); } @SuppressWarnings("checkstyle:methodlength") private List resolve( - SyncContext shared, - SyncContext exclusive, + Supplier sharedSupplier, + Supplier exclusiveSupplier, Collection subjects, RepositorySystemSession session, Collection requests) { - SyncContext current = shared; + boolean firstAttempt = true; + boolean shared = true; + SyncContext current = sharedSupplier.get(); try { while (true) { - current.acquire(null, subjects); + try { + current.acquire(null, subjects); + } catch (SyncContext.FailedToAcquireLockException e) { + if (e.isShared()) { + throw e; + } else { + current.close(); + shared = true; + current = sharedSupplier.get(); + } + } final List results = new ArrayList<>(requests.size()); final List tasks = new ArrayList<>(requests.size()); @@ -212,7 +227,9 @@ private List resolve( LocalRepository localRepo = session.getLocalRepositoryManager().getRepository(); - metadataResolving(session, trace, metadata, localRepo); + if (firstAttempt) { + metadataResolving(session, trace, metadata, localRepo); + } File localFile = getLocalFile(session, metadata); @@ -223,7 +240,9 @@ private List resolve( result.setException(new MetadataNotFoundException(metadata, localRepo)); } - metadataResolved(session, trace, metadata, localRepo, result.getException()); + if (firstAttempt) { + metadataResolved(session, trace, metadata, localRepo, result.getException()); + } continue; } @@ -244,7 +263,10 @@ private List resolve( continue; } - metadataResolving(session, trace, metadata, repository); + if (firstAttempt) { + metadataResolving(session, trace, metadata, repository); + } + LocalRepositoryManager lrm = session.getLocalRepositoryManager(); LocalMetadataRequest localRequest = new LocalMetadataRequest(metadata, repository, request.getRequestContext()); @@ -265,7 +287,9 @@ private List resolve( result.setException(new MetadataNotFoundException(metadata, repository, msg, e)); } - metadataResolved(session, trace, metadata, repository, result.getException()); + if (firstAttempt) { + metadataResolved(session, trace, metadata, repository, result.getException()); + } continue; } @@ -328,13 +352,17 @@ private List resolve( metadata = metadata.setFile(metadataFile); result.setMetadata(metadata); } - metadataResolved(session, trace, metadata, repository, result.getException()); + if (firstAttempt) { + metadataResolved(session, trace, metadata, repository, result.getException()); + } } } - if (!tasks.isEmpty() && current == shared) { + if (!tasks.isEmpty() && shared) { + firstAttempt = false; current.close(); - current = exclusive; + current = exclusiveSupplier.get(); + shared = false; continue; } diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java index 20d6132ec..eb9b4f8b0 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java @@ -47,6 +47,10 @@ public final class NamedLockFactoryAdapter { public static final long DEFAULT_TIME = 900L; + public static final String EXCLUSIVE_TIME_KEY = "aether.syncContext.named.exclusiveTime"; + + public static final long DEFAULT_EXCLUSIVE_TIME = 5L; + public static final String TIME_UNIT_KEY = "aether.syncContext.named.time.unit"; public static final TimeUnit DEFAULT_TIME_UNIT = TimeUnit.SECONDS; @@ -111,6 +115,8 @@ private static class AdaptedLockSyncContext implements SyncContext { private final long time; + private final long exclusiveTime; + private final TimeUnit timeUnit; private final int retry; @@ -128,7 +134,8 @@ private AdaptedLockSyncContext( this.shared = shared; this.lockNaming = lockNaming; this.namedLockFactory = namedLockFactory; - this.time = getTime(session); + this.time = getTime(session, DEFAULT_TIME, TIME_KEY); + this.exclusiveTime = getTime(session, DEFAULT_EXCLUSIVE_TIME, EXCLUSIVE_TIME_KEY); this.timeUnit = getTimeUnit(session); this.retry = getRetry(session); this.retryWait = getRetryWait(session); @@ -137,6 +144,9 @@ private AdaptedLockSyncContext( if (time < 0L) { throw new IllegalArgumentException(TIME_KEY + " value cannot be negative"); } + if (exclusiveTime < 0L) { + throw new IllegalArgumentException(EXCLUSIVE_TIME_KEY + " value cannot be negative"); + } if (retry < 0L) { throw new IllegalArgumentException(RETRY_KEY + " value cannot be negative"); } @@ -145,8 +155,8 @@ private AdaptedLockSyncContext( } } - private long getTime(final RepositorySystemSession session) { - return ConfigUtils.getLong(session, DEFAULT_TIME, TIME_KEY); + private long getTime(final RepositorySystemSession session, long defaultValue, String... keys) { + return ConfigUtils.getLong(session, defaultValue, keys); } private TimeUnit getTimeUnit(final RepositorySystemSession session) { @@ -168,11 +178,13 @@ public void acquire(Collection artifacts, Collection illegalStateExceptions = new ArrayList<>(); for (int attempt = 1; attempt <= attempts; attempt++) { - LOGGER.trace( - "Attempt {}: Need {} {} lock(s) for {}", attempt, keys.size(), shared ? "read" : "write", keys); + LOGGER.trace("Attempt {}: Need {} {} lock(s) for {}", attempt, keys.size(), lockKindString, keys); int acquiredLockCount = 0; try { if (attempt > 1) { @@ -180,28 +192,24 @@ public void acquire(Collection artifacts, Collection artifacts, Collection config = new HashMap<>(); config.put(NamedLockFactoryAdapter.TIME_KEY, String.valueOf(ADAPTER_TIME)); + config.put(NamedLockFactoryAdapter.EXCLUSIVE_TIME_KEY, String.valueOf(ADAPTER_TIME)); config.put(NamedLockFactoryAdapter.TIME_UNIT_KEY, ADAPTER_TIME_UNIT.name()); when(session.getConfigProperties()).thenReturn(config); } From fa968bf93ffd746d22a9d2a1afb12a733e5aad01 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Mon, 17 Nov 2025 21:39:03 +0100 Subject: [PATCH 2/6] Use 10 vs 900 --- .../impl/synccontext/named/NamedLockFactoryAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java index eb9b4f8b0..a00394970 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java @@ -49,7 +49,7 @@ public final class NamedLockFactoryAdapter { public static final String EXCLUSIVE_TIME_KEY = "aether.syncContext.named.exclusiveTime"; - public static final long DEFAULT_EXCLUSIVE_TIME = 5L; + public static final long DEFAULT_EXCLUSIVE_TIME = 10L; public static final String TIME_UNIT_KEY = "aether.syncContext.named.time.unit"; From 4ac14f25b0ffb83d4f8ed50dfceb7ace85491c90 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Tue, 18 Nov 2025 12:20:40 +0100 Subject: [PATCH 3/6] WIP --- .../impl/DefaultArtifactResolver.java | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java index 25c0952d1..38c8729bd 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -274,19 +275,24 @@ private List resolve( Collection requests) throws ArtifactResolutionException { boolean firstAttempt = true; - boolean shared = true; - SyncContext current = sharedSupplier.get(); + HashSet needsShared = new HashSet<>(subjects); + HashSet needsExclusive = new HashSet<>(subjects.size()); + SyncContext shared = sharedSupplier.get(); + SyncContext exclusive = exclusiveSupplier.get(); + boolean relock = false; try { while (true) { try { - current.acquire(subjects, null); + shared.acquire(needsShared, null); + exclusive.acquire(needsExclusive, null); } catch (SyncContext.FailedToAcquireLockException e) { if (e.isShared()) { throw e; } else { - current.close(); - shared = true; - current = sharedSupplier.get(); + shared.close(); + exclusive.close(); + shared = sharedSupplier.get(); + exclusive = exclusiveSupplier.get(); } } @@ -450,15 +456,21 @@ private List resolve( groups.add(group); groupIt = Collections.emptyIterator(); } + if (needsExclusive.add(artifact)) { + needsShared.remove(artifact); + relock = true; + } group.items.add(new ResolutionItem(trace, artifact, resolved, result, local, repo)); } } - if (!groups.isEmpty() && shared) { + if (!groups.isEmpty() && relock) { firstAttempt = false; - current.close(); - current = exclusiveSupplier.get(); - shared = false; + relock = false; + shared.close(); + exclusive.close(); + shared = sharedSupplier.get(); + exclusive = exclusiveSupplier.get(); continue; } @@ -493,7 +505,8 @@ private List resolve( return results; } } finally { - current.close(); + exclusive.close(); + shared.close(); } } From b1b79a7d62eb53f34635c50153e8983aac4df209 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Tue, 18 Nov 2025 14:09:08 +0100 Subject: [PATCH 4/6] Keep default times same (no change logically) --- .../impl/synccontext/named/NamedLockFactoryAdapter.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java index a00394970..55c6b587c 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java @@ -45,11 +45,9 @@ public final class NamedLockFactoryAdapter { public static final String TIME_KEY = "aether.syncContext.named.time"; - public static final long DEFAULT_TIME = 900L; - public static final String EXCLUSIVE_TIME_KEY = "aether.syncContext.named.exclusiveTime"; - public static final long DEFAULT_EXCLUSIVE_TIME = 10L; + public static final long DEFAULT_TIME = 900L; public static final String TIME_UNIT_KEY = "aether.syncContext.named.time.unit"; @@ -135,7 +133,7 @@ private AdaptedLockSyncContext( this.lockNaming = lockNaming; this.namedLockFactory = namedLockFactory; this.time = getTime(session, DEFAULT_TIME, TIME_KEY); - this.exclusiveTime = getTime(session, DEFAULT_EXCLUSIVE_TIME, EXCLUSIVE_TIME_KEY); + this.exclusiveTime = getTime(session, DEFAULT_TIME, EXCLUSIVE_TIME_KEY); this.timeUnit = getTimeUnit(session); this.retry = getRetry(session); this.retryWait = getRetryWait(session); From dfc18559fc457376e9d15bd0c639bc123f1694b8 Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Tue, 18 Nov 2025 14:16:02 +0100 Subject: [PATCH 5/6] Undo; md files are small and no user reported issues with them Later we can revisit it. --- .../impl/DefaultMetadataResolver.java | 66 ++++++------------- 1 file changed, 19 insertions(+), 47 deletions(-) diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java index 36ef93f97..b0620cd7b 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultMetadataResolver.java @@ -30,7 +30,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.Executor; -import java.util.function.Supplier; import org.eclipse.aether.RepositoryEvent; import org.eclipse.aether.RepositoryEvent.EventType; @@ -171,42 +170,28 @@ public List resolveMetadata( RepositorySystemSession session, Collection requests) { requireNonNull(session, "session cannot be null"); requireNonNull(requests, "requests cannot be null"); - Collection metadata = new ArrayList<>(requests.size()); - for (MetadataRequest request : requests) { - metadata.add(request.getMetadata()); - } + try (SyncContext shared = syncContextFactory.newInstance(session, true); + SyncContext exclusive = syncContextFactory.newInstance(session, false)) { + Collection metadata = new ArrayList<>(requests.size()); + for (MetadataRequest request : requests) { + metadata.add(request.getMetadata()); + } - return resolve( - () -> syncContextFactory.newInstance(session, true), - () -> syncContextFactory.newInstance(session, false), - metadata, - session, - requests); + return resolve(shared, exclusive, metadata, session, requests); + } } @SuppressWarnings("checkstyle:methodlength") private List resolve( - Supplier sharedSupplier, - Supplier exclusiveSupplier, + SyncContext shared, + SyncContext exclusive, Collection subjects, RepositorySystemSession session, Collection requests) { - boolean firstAttempt = true; - boolean shared = true; - SyncContext current = sharedSupplier.get(); + SyncContext current = shared; try { while (true) { - try { - current.acquire(null, subjects); - } catch (SyncContext.FailedToAcquireLockException e) { - if (e.isShared()) { - throw e; - } else { - current.close(); - shared = true; - current = sharedSupplier.get(); - } - } + current.acquire(null, subjects); final List results = new ArrayList<>(requests.size()); final List tasks = new ArrayList<>(requests.size()); @@ -227,9 +212,7 @@ private List resolve( LocalRepository localRepo = session.getLocalRepositoryManager().getRepository(); - if (firstAttempt) { - metadataResolving(session, trace, metadata, localRepo); - } + metadataResolving(session, trace, metadata, localRepo); File localFile = getLocalFile(session, metadata); @@ -240,9 +223,7 @@ private List resolve( result.setException(new MetadataNotFoundException(metadata, localRepo)); } - if (firstAttempt) { - metadataResolved(session, trace, metadata, localRepo, result.getException()); - } + metadataResolved(session, trace, metadata, localRepo, result.getException()); continue; } @@ -263,10 +244,7 @@ private List resolve( continue; } - if (firstAttempt) { - metadataResolving(session, trace, metadata, repository); - } - + metadataResolving(session, trace, metadata, repository); LocalRepositoryManager lrm = session.getLocalRepositoryManager(); LocalMetadataRequest localRequest = new LocalMetadataRequest(metadata, repository, request.getRequestContext()); @@ -287,9 +265,7 @@ private List resolve( result.setException(new MetadataNotFoundException(metadata, repository, msg, e)); } - if (firstAttempt) { - metadataResolved(session, trace, metadata, repository, result.getException()); - } + metadataResolved(session, trace, metadata, repository, result.getException()); continue; } @@ -352,17 +328,13 @@ private List resolve( metadata = metadata.setFile(metadataFile); result.setMetadata(metadata); } - if (firstAttempt) { - metadataResolved(session, trace, metadata, repository, result.getException()); - } + metadataResolved(session, trace, metadata, repository, result.getException()); } } - if (!tasks.isEmpty() && shared) { - firstAttempt = false; + if (!tasks.isEmpty() && current == shared) { current.close(); - current = exclusiveSupplier.get(); - shared = false; + current = exclusive; continue; } From ce71cc095f24764f34be1dac6aeaa56e93381f6c Mon Sep 17 00:00:00 2001 From: Tamas Cservenak Date: Tue, 18 Nov 2025 15:27:01 +0100 Subject: [PATCH 6/6] Undo --- .../impl/DefaultArtifactResolver.java | 68 ++++++------------- 1 file changed, 19 insertions(+), 49 deletions(-) diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java index 38c8729bd..044302461 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/DefaultArtifactResolver.java @@ -27,12 +27,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Supplier; import org.eclipse.aether.RepositoryEvent; import org.eclipse.aether.RepositoryEvent.EventType; @@ -250,51 +248,32 @@ public List resolveArtifacts( throws ArtifactResolutionException { requireNonNull(session, "session cannot be null"); requireNonNull(requests, "requests cannot be null"); - Collection artifacts = new ArrayList<>(requests.size()); - for (ArtifactRequest request : requests) { - if (request.getArtifact().getProperty(ArtifactProperties.LOCAL_PATH, null) != null) { - continue; + try (SyncContext shared = syncContextFactory.newInstance(session, true); + SyncContext exclusive = syncContextFactory.newInstance(session, false)) { + Collection artifacts = new ArrayList<>(requests.size()); + for (ArtifactRequest request : requests) { + if (request.getArtifact().getProperty(ArtifactProperties.LOCAL_PATH, null) != null) { + continue; + } + artifacts.add(request.getArtifact()); } - artifacts.add(request.getArtifact()); - } - return resolve( - () -> syncContextFactory.newInstance(session, true), - () -> syncContextFactory.newInstance(session, false), - artifacts, - session, - requests); + return resolve(shared, exclusive, artifacts, session, requests); + } } @SuppressWarnings("checkstyle:methodlength") private List resolve( - Supplier sharedSupplier, - Supplier exclusiveSupplier, + SyncContext shared, + SyncContext exclusive, Collection subjects, RepositorySystemSession session, Collection requests) throws ArtifactResolutionException { - boolean firstAttempt = true; - HashSet needsShared = new HashSet<>(subjects); - HashSet needsExclusive = new HashSet<>(subjects.size()); - SyncContext shared = sharedSupplier.get(); - SyncContext exclusive = exclusiveSupplier.get(); - boolean relock = false; + SyncContext current = shared; try { while (true) { - try { - shared.acquire(needsShared, null); - exclusive.acquire(needsExclusive, null); - } catch (SyncContext.FailedToAcquireLockException e) { - if (e.isShared()) { - throw e; - } else { - shared.close(); - exclusive.close(); - shared = sharedSupplier.get(); - exclusive = exclusiveSupplier.get(); - } - } + current.acquire(subjects, null); boolean failures = false; final List results = new ArrayList<>(requests.size()); @@ -313,7 +292,7 @@ private List resolve( Artifact artifact = request.getArtifact(); - if (firstAttempt) { + if (current == shared) { artifactResolving(session, trace, artifact); } @@ -456,21 +435,13 @@ private List resolve( groups.add(group); groupIt = Collections.emptyIterator(); } - if (needsExclusive.add(artifact)) { - needsShared.remove(artifact); - relock = true; - } group.items.add(new ResolutionItem(trace, artifact, resolved, result, local, repo)); } } - if (!groups.isEmpty() && relock) { - firstAttempt = false; - relock = false; - shared.close(); - exclusive.close(); - shared = sharedSupplier.get(); - exclusive = exclusiveSupplier.get(); + if (!groups.isEmpty() && current == shared) { + current.close(); + current = exclusive; continue; } @@ -505,8 +476,7 @@ private List resolve( return results; } } finally { - exclusive.close(); - shared.close(); + current.close(); } }