[ https://issues.apache.org/jira/browse/MRESOLVER-325?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17693584#comment-17693584 ]
Christoph Läubrich commented on MRESOLVER-325: ---------------------------------------------- [~michael-o] many thanks for your detailed analysis! I think this should really be reported to JDK as it seems to hurt many projects with a lot of hacks and workarounds (that's as you have proven probably don't work at all)! For Resolver, I think the idea is that if the process is killed "in the middle" we do not leave a half written garbage file, for that case I wonder if a simple delete-then-move won't work equally good, atomic file operations sound good at the first place but are hard to guarantee as we see here. So there are some strategies: * You can (as suggested) just write directly to the file and make the read more robust, and simply discard data in the case something goes wrong (I think that's always good, because error can happen always but one should be able to recover from them) * Additionally if one wants can use some rolling file strategy, instead of writing to _remote.repositories you write to _remote.<n>.repositories where <n> is incremented on each write, so the process is then: find current index > write to temp > rename file to next index > delete last index ... but thats probably a way to much here as it also has impact on reading to find the current valid index So I would most probably go for (1) here the worst that can happen is that resolver the file is not up-to-date and download it again, something that would also happen if the file was deleted by the user or maybe an request to update it ... so its actually something that can already be handled and only should happen if previously something gone wrong in which case it might be better to start fresh anyways. > [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 > 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)