[ 
https://issues.apache.org/jira/browse/MRESOLVER-278?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17617851#comment-17617851
 ] 

ASF GitHub Bot commented on MRESOLVER-278:
------------------------------------------

cstamas commented on code in PR #201:
URL: https://github.com/apache/maven-resolver/pull/201#discussion_r995934236


##########
maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/checksum/SummaryFileTrustedChecksumsSource.java:
##########
@@ -201,41 +214,38 @@ private String calculateSummaryPath( boolean originAware,
         return fileName + "." + checksumAlgorithmFactory.getFileExtension();
     }
 
-    /**
-     * Note: this implementation will work only in single-thread (T1) model. 
While not ideal, the "workaround" is
-     * possible in both, Maven and Maven Daemon: force single threaded 
execution model while "recording" (in mvn:
-     * do not pass any {@code -T} CLI parameter, while for mvnd use {@code -1} 
CLI parameter.
-     * 
-     * TODO: this will need to be reworked for at least two reasons: a) avoid 
duplicates in summary file and b)
-     * support multi threaded builds (probably will need "on session close" 
hook).
-     */
     private class SummaryFileWriter implements Writer
     {
         private final Path basedir;
 
         private final boolean originAware;
 
-        private SummaryFileWriter( Path basedir, boolean originAware )
+        private final ConcurrentHashMap<Path, Set<String>> recordedLines;
+
+        private SummaryFileWriter( Path basedir,
+                                   boolean originAware,
+                                   ConcurrentHashMap<Path, Set<String>> 
recordedLines )
         {
             this.basedir = basedir;
             this.originAware = originAware;
+            this.recordedLines = recordedLines;
         }
 
         @Override
         public void addTrustedArtifactChecksums( Artifact artifact, 
ArtifactRepository artifactRepository,
                                                  
List<ChecksumAlgorithmFactory> checksumAlgorithmFactories,
-                                                 Map<String, String> 
trustedArtifactChecksums ) throws IOException
+                                                 Map<String, String> 
trustedArtifactChecksums )
         {
             for ( ChecksumAlgorithmFactory checksumAlgorithmFactory : 
checksumAlgorithmFactories )
             {
                 String checksum = requireNonNull(
                         trustedArtifactChecksums.get( 
checksumAlgorithmFactory.getName() ) );
-                String summaryLine = ArtifactIdUtils.toId( artifact ) + " " + 
checksum + "\n";
+                String summaryLine = ArtifactIdUtils.toId( artifact ) + " " + 
checksum;
                 Path summaryPath = basedir.resolve(
                         calculateSummaryPath( originAware, artifactRepository, 
checksumAlgorithmFactory ) );
-                Files.createDirectories( summaryPath.getParent() );
-                Files.write( summaryPath, summaryLine.getBytes( 
StandardCharsets.UTF_8 ),
-                        StandardOpenOption.CREATE, StandardOpenOption.WRITE, 
StandardOpenOption.APPEND );
+
+                recordedLines.computeIfAbsent( summaryPath, p -> 
Collections.synchronizedSet( new TreeSet<>() ) )
+                        .add( summaryLine );

Review Comment:
   Sorted is really just a "nice to have" thing, is easier to author/grasp 
"recorded" file





> BREAKING: Make Session extend AutoCloseable (and introduce onCloseHandlers)
> ---------------------------------------------------------------------------
>
>                 Key: MRESOLVER-278
>                 URL: https://issues.apache.org/jira/browse/MRESOLVER-278
>             Project: Maven Resolver
>          Issue Type: New Feature
>          Components: Resolver
>            Reporter: Tamas Cservenak
>            Assignee: Tamas Cservenak
>            Priority: Major
>             Fix For: 1.9.0
>
>
> So far, in (vanilla) Maven, the lifecycle of session was on par with 
> lifecycle of SISU container, as Maven does something like this:
>  * boot, create container
>  * create session
>  * work
>  * destroy container
>  * exit JVM
> So, Maven execution is 1 session 1 container, are on par.
> This is not true for cases where container (and resolver components) are 
> reused across several sessions, like mvnd does. Also, current code on master 
> (named locks adapter) uses {{@PreDestroy}} to shut down adapters, that is 
> invoked when container is shut down, while the adapters are created 
> per-session. This means that long-living mvnd daemons will shut down the 
> unused adapter only when daemon itself is shut down, even is session for 
> which adapter was created is long gone/done.
> While Maven has "session scoped" notion, resolver has not. Hence, simplest 
> and cleanest solution is to make RepositorySystemSession have a method to 
> "close", denoting that "this session is done". Also, if we can provide hooks 
> for "onSessionClose", this resolves all the problems, as for example the 
> adapter, that is created per session, could be now cleanly shut down at 
> session end.
> One gotcha: this change implies a {*}breaking change for integrators of 
> resolver{*}:  integrator should make sure they close the session after they 
> are done with it.
> Example changes needed for resolver users: 
> [https://github.com/apache/maven/pull/822]
> The "pattern" to make use of this feature in resolver is following:
>  * stuff something into session data, ideally using computeWhenAbsent
>  * if absent, register a callback hook as well
>  * in callback, get the stuffed thing from session and if present, do 
> something with it



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to