[
https://issues.apache.org/jira/browse/MRESOLVER-325?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17696495#comment-17696495
]
Robert Muir commented on MRESOLVER-325:
---------------------------------------
[~michael-o] no problem. Sorry I don't understand the bigger picture, but happy
to help more if I can. I read a little on the issue and saw mentions of locking
and became a little afraid :)
As someone who hasn't looked at the code, but just the file structure, I'd
high-level naively try to do something like this for this artifact:
{noformat}
$ ls org/apache/maven/maven-core/3.1.1
maven-core-3.1.1.jar maven-core-3.1.1.jar.sha1 maven-core-3.1.1.pom
maven-core-3.1.1.pom.sha1 _remote.repositories
{noformat}
1. first create org/apache/maven/maven-core file tree. Fsync parent directories
of each new one i make when i do it. I'm assuming if this filetree is empty, it
won't cause harm at read time.
2. next create org/apache/maven/maven-core/.tmpXYZ123 temporary to stage my
files. I'm assuming these tempdirs can be filtered out by reads, so that no
uncommitted stuff is really "visible" to maven.
3. next write each one of my files (jars and poms and sha1s and
_remote.repositories) into org/apache/maven/maven-core/.tmpXYZ123
4. fsync all my files, including .tmpXYZ13 directory.
5. rename org/apache/maven/maven-core/.tmpXYZ123 to
org/apache/maven/maven-core/3.1.1. don't use REPLACE_EXISTING. Use ATOMIC_MOVE
and handle the exception if another process beat you to it.
6. fsync org/apache/maven/maven-core
If the maven code supports deleting artifacts (i dont know if this is allowed),
i'd ATOMIC_MOVE 3.1.1 to .tmpABC234, then fsync org/apache/maven/maven-core/,
then actually delete stuff. This way it is "atomically deleted".
The idea here would be, to avoid relying on filesystem locks at all, instead
only solely "publish" or "unpublish" data via move(ATOMIC_MOVE). And since
files are only written to temp directories, they can all be created with e.g.
{{Files.newOutputStream(path, CREATE_NEW)}} and so on.
> [REGRESSION] Suddenly seeing I/O errors under windows aborting the build
> ------------------------------------------------------------------------
>
> Key: MRESOLVER-325
> URL: https://issues.apache.org/jira/browse/MRESOLVER-325
> Project: Maven Resolver
> Issue Type: Bug
> Components: Resolver
> Affects Versions: 1.9.4
> Reporter: Christoph Läubrich
> Assignee: Michael Osipov
> Priority: Major
> Fix For: 1.9.6
>
>
> If one runs a build that otherwise works fine on 3.8.x with 3.9 we now get
> the following exception (full output can be found here
> https://github.com/eclipse-platform/eclipse.platform/actions/runs/4211467991/jobs/7309831666):
> {code:java}
> Error: 5.889 [ERROR] Internal error: java.io.UncheckedIOException:
> java.nio.file.AccessDeniedException:
> C:\Users\runneradmin\.m2\repository\com\google\code\gson\gson\2.10.1\_remote.repositories.15650462061630955031.tmp
> ->
> C:\Users\runneradmin\.m2\repository\com\google\code\gson\gson\2.10.1\_remote.repositories
> -> [Help 1]
> org.apache.maven.InternalErrorException: Internal error:
> java.io.UncheckedIOException: java.nio.file.AccessDeniedException:
> C:\Users\runneradmin\.m2\repository\com\google\code\gson\gson\2.10.1\_remote.repositories.15650462061630955031.tmp
> ->
> C:\Users\runneradmin\.m2\repository\com\google\code\gson\gson\2.10.1\_remote.repositories
> at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:108)
> at org.apache.maven.cli.MavenCli.execute (MavenCli.java:821)
> at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:270)
> at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
> at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
> at jdk.internal.reflect.NativeMethodAccessorImpl.invoke
> (NativeMethodAccessorImpl.java:77)
> at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke
> (DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke (Method.java:568)
> at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced
> (Launcher.java:282)
> at org.codehaus.plexus.classworlds.launcher.Launcher.launch
> (Launcher.java:225)
> at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode
> (Launcher.java:406)
> at org.codehaus.plexus.classworlds.launcher.Launcher.main
> (Launcher.java:347)
> Caused by: java.io.UncheckedIOException: java.nio.file.AccessDeniedException:
> C:\Users\runneradmin\.m2\repository\com\google\code\gson\gson\2.10.1\_remote.repositories.15650462061630955031.tmp
> ->
> C:\Users\runneradmin\.m2\repository\com\google\code\gson\gson\2.10.1\_remote.repositories
> at org.eclipse.aether.internal.impl.DefaultTrackingFileManager.update
> (DefaultTrackingFileManager.java:121)
> at
> org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManager.addRepo
> (EnhancedLocalRepositoryManager.java:274)
> at
> org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManager.addArtifact
> (EnhancedLocalRepositoryManager.java:252)
> at org.eclipse.aether.internal.impl.EnhancedLocalRepositoryManager.add
> (EnhancedLocalRepositoryManager.java:225)
> at
> org.eclipse.aether.internal.impl.DefaultArtifactResolver.evaluateDownloads
> (DefaultArtifactResolver.java:680)
> at
> org.eclipse.aether.internal.impl.DefaultArtifactResolver.performDownloads
> (DefaultArtifactResolver.java:592)
> at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve
> (DefaultArtifactResolver.java:478)
> at
> org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts
> (DefaultArtifactResolver.java:278)
> at
> org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact
> (DefaultArtifactResolver.java:255)
> at
> org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact
> (DefaultRepositorySystem.java:296)
> at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolve
> (DefaultArtifactResolver.java:197)
> at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolve
> (DefaultArtifactResolver.java:413)
> at org.apache.maven.repository.legacy.LegacyRepositorySystem.resolve
> (LegacyRepositorySystem.java:332)
> at
> org.eclipse.tycho.osgi.configuration.MavenDependenciesResolverConfigurer.resolve
> (MavenDependenciesResolverConfigurer.java:104)
> at org.eclipse.tycho.core.shared.MavenDependenciesResolver.resolve
> (MavenDependenciesResolver.java:60)
> at org.eclipse.tycho.core.resolver.MavenTargetDefinitionContent.<init>
> (MavenTargetDefinitionContent.java:262)
> at
> org.eclipse.tycho.p2resolver.TargetDefinitionResolver.resolveContentWithExceptions
> (TargetDefinitionResolver.java:179)
> at org.eclipse.tycho.p2resolver.TargetDefinitionResolver.resolveContent
> (TargetDefinitionResolver.java:110)
> at
> org.eclipse.tycho.p2resolver.TargetDefinitionResolverService.resolveFromArguments
> (TargetDefinitionResolverService.java:90)
> at java.util.concurrent.ConcurrentHashMap.computeIfAbsent
> (ConcurrentHashMap.java:1708)
> at
> org.eclipse.tycho.p2resolver.TargetDefinitionResolverService.getTargetDefinitionContent
> (TargetDefinitionResolverService.java:65)
> at
> org.eclipse.tycho.p2resolver.TargetPlatformFactoryImpl.resolveTargetDefinitions
> (TargetPlatformFactoryImpl.java:214)
> at
> org.eclipse.tycho.p2resolver.TargetPlatformFactoryImpl.createTargetPlatform
> (TargetPlatformFactoryImpl.java:164)
> at
> org.eclipse.tycho.p2resolver.TargetPlatformFactoryImpl.createTargetPlatform
> (TargetPlatformFactoryImpl.java:137)
> at
> org.eclipse.tycho.p2resolver.TargetPlatformFactoryImpl.createTargetPlatform
> (TargetPlatformFactoryImpl.java:88)
> at
> org.eclipse.tycho.p2resolver.ReactorRepositoryManagerImpl.computePreliminaryTargetPlatform
> (ReactorRepositoryManagerImpl.java:61)
> at
> org.eclipse.tycho.p2resolver.P2DependencyResolver.computePreliminaryTargetPlatform
> (P2DependencyResolver.java:202)
> at org.eclipse.tycho.core.resolver.DefaultTychoResolver.resolveProject
> (DefaultTychoResolver.java:130)
> at
> org.eclipse.tycho.core.maven.TychoMavenLifecycleParticipant.lambda$resolveProjects$2
> (TychoMavenLifecycleParticipant.java:256)
> at java.util.stream.ForEachOps$ForEachOp$OfRef.accept
> (ForEachOps.java:183)
> at java.util.stream.SpinedBuffer$1Splitr.forEachRemaining
> (SpinedBuffer.java:364)
> at java.util.stream.AbstractPipeline.copyInto (AbstractPipeline.java:509)
> at java.util.stream.ForEachOps$ForEachTask.compute (ForEachOps.java:290)
> at java.util.concurrent.CountedCompleter.exec (CountedCompleter.java:754)
> at java.util.concurrent.ForkJoinTask.doExec (ForkJoinTask.java:373)
> at java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec
> (ForkJoinPool.java:1182)
> at java.util.concurrent.ForkJoinPool.scan (ForkJoinPool.java:1655)
> at java.util.concurrent.ForkJoinPool.runWorker (ForkJoinPool.java:1622)
> at java.util.concurrent.ForkJoinWorkerThread.run
> (ForkJoinWorkerThread.java:165)
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)