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

Robert Schulte commented on FELIX-6490:
---------------------------------------

I can provide a PR with one of the suggested fixes if that helps

> Files that cannot be deployed due to a missing handler are not processed again
> ------------------------------------------------------------------------------
>
>                 Key: FELIX-6490
>                 URL: https://issues.apache.org/jira/browse/FELIX-6490
>             Project: Felix
>          Issue Type: Bug
>          Components: File Install
>    Affects Versions: fileinstall-3.7.0, fileinstall-3.7.2
>            Reporter: Robert Schulte
>            Priority: Major
>
> h2. Context
> I tried to migrate a custom Karaf distribution from 4.2.8 to 4.3.3 
> (fileinstall version 3.6.4 -> 3.7.0). The distribution contains a blueprint 
> (xml) file that is supposed to be handled by one of Karaf's custom 
> ArtifactListener_s. This kind of deploment works for Karaf 4.2.8 but fails 
> for 4.3.3
> h2. Issue Analysis
> [DirectoryWatcher.java#doProcess|https://github.com/apache/felix-dev/blob/org.apache.felix.fileinstall-3.7.0/fileinstall/src/main/java/org/apache/felix/fileinstall/internal/DirectoryWatcher.java#L381-L385]
>  has a mechanic of retrying deployment for files that could not be matched to 
> a handler on a previous attempt:
> {code:java}
> private void doProcess(Set<File> files) throws InterruptedException
>     {
>         List<ArtifactListener> listeners = fileInstall.getListeners();
>         List<Artifact> deleted = new ArrayList<Artifact>();
>         List<Artifact> modified = new ArrayList<Artifact>();
>         List<Artifact> created = new ArrayList<Artifact>();
>         // Try to process again files that could not be processed
>         synchronized (processingFailures)
>         {
>             files.addAll(processingFailures);
>             processingFailures.clear();
>         }
>               //...
>       }
> {code}
> It is vital that doProcess is invoked although no changes have been observed 
> in the watched folder. Otherwise, the retry mechanism is not effective at all.
> The workaround for FELIX-6229 
> ([101a360248311817e1ad4645c549ea77773b0481|https://github.com/apache/felix-dev/commit/101a360248311817e1ad4645c549ea77773b0481#diff-263cdbacfd163ef5ce31dcbb1db83138f78d88eab353f1f587a10199e8ef3817])
>  introduced a regression (in addition to the possible NPE that was fixed in 
> cbf8174b66af21453ae209c590d4bf7f4a36e36b) that prevents doProcess from being 
> invoked in the absence of changes in the watched directory.
> {code:java}
> if (files != null && !files.isEmpty()) {
>     process(files);
> }
> {code}
> The added guard {{!files.isEmpty()}} to {{process(files)}} renders the 
> retrying logic ineffective
> h2. Possible fixes
> h3. Revert to old guard
> {code:java}
> if (files != null) {
>     process(files);
> }
> {code}
> h3. Account for "processingFailures"
> {code:java}
> if ((files != null && !files.isEmpty()) || !processingFailures.isEmpty()) {
>     process(files);
> }
> {code}
> This should probably be accompanied by some refactoring. If the re-processing 
> of processingFailures was more apparent (e.g., by having a dedicated method 
> for this),
>  * it becomes less likely, that the re-processing gets accidentally broken 
> again
>  * re-processing could even be decoupled from the scanning interval



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to