[ 
https://issues.apache.org/jira/browse/NIFI-16439?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Pierre Villard updated NIFI-16439:
----------------------------------
    Fix Version/s: 2.13.0
       Resolution: Fixed
           Status: Resolved  (was: Patch Available)

> GetSmbFile throws exception for subdirectories when "Recurse Subdirectories" 
> is false
> -------------------------------------------------------------------------------------
>
>                 Key: NIFI-16439
>                 URL: https://issues.apache.org/jira/browse/NIFI-16439
>             Project: Apache NiFi
>          Issue Type: Bug
>          Components: Extensions
>    Affects Versions: 2.12.0
>         Environment: N/A
>            Reporter: René Zeidler
>            Assignee: Peter Turcsanyi
>            Priority: Major
>              Labels: regression
>             Fix For: 2.13.0
>
>          Time Spent: 20m
>  Remaining Estimate: 0h
>
> h2. Summary
> After updating from NiFi 2.8.0 to NiFi 2.12.0, we startet getting a lot of 
> errors from GetSmbFile processors like this:
> {code:none}
> 2026-10-07 11:05:29,207 ERROR [Timer-Driven Process Thread-6] 
> o.apache.nifi.processors.smb.GetSmbFile 
> GetSmbFile[id=02fcb437-5e7d-3afd-9c6d-172675e0d63e] Failed to retrieve files 
> due to {}
> org.apache.nifi.services.smb.SmbException: STATUS_FILE_IS_A_DIRECTORY 
> (0xc00000ba): Create failed for \\server\share\my-directory\subdirectory
> at 
> org.apache.nifi.services.smb.SmbjClientService.wrapException(SmbjClientService.java:258)
> at 
> org.apache.nifi.services.smb.SmbjClientService.readFile(SmbjClientService.java:166)
> at 
> org.apache.nifi.processors.smb.GetSmbFile.lambda$onTrigger$1(GetSmbFile.java:422)
> at 
> org.apache.nifi.controller.repository.StandardProcessSession.write(StandardProcessSession.java:3340)
> at 
> org.apache.nifi.controller.repository.WeakHashMapProcessSessionFactory$FactoryRetainingProcessSession.write(WeakHashMapProcessSessionFactory.java:290)
> at org.apache.nifi.processors.smb.GetSmbFile.onTrigger(GetSmbFile.java:422)
> at 
> org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)
> at 
> org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1295)
> at 
> org.apache.nifi.controller.tasks.ConnectableTask.invoke(ConnectableTask.java:237)
> at 
> org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:102)
> at org.apache.nifi.engine.FlowEngine.lambda$wrap$1(FlowEngine.java:105)
> at 
> java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
> at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358)
> at 
> java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305)
> at 
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
> at 
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
> at java.base/java.lang.Thread.run(Thread.java:1583)
> Caused by: com.hierynomus.mssmb2.SMBApiException: STATUS_FILE_IS_A_DIRECTORY 
> (0xc00000ba): Create failed for \\server\share\my-directory\subdirectory
> at com.hierynomus.smbj.share.Share.receive(Share.java:389)
> at com.hierynomus.smbj.share.Share.sendReceive(Share.java:368)
> at com.hierynomus.smbj.share.Share.createFile(Share.java:165)
> at com.hierynomus.smbj.share.DiskShare.createFileAndResolve(DiskShare.java:86)
> at com.hierynomus.smbj.share.DiskShare.access$100(DiskShare.java:61)
> at com.hierynomus.smbj.share.DiskShare$2.apply(DiskShare.java:121)
> at com.hierynomus.smbj.share.DiskShare$2.apply(DiskShare.java:117)
> at com.hierynomus.smbj.paths.PathResolver$1.resolve(PathResolver.java:32)
> at 
> com.hierynomus.smbj.paths.SymlinkPathResolver.resolve(SymlinkPathResolver.java:62)
> at 
> com.hierynomus.smbj.share.DiskShare.resolveAndCreateFile(DiskShare.java:117)
> at com.hierynomus.smbj.share.DiskShare.open(DiskShare.java:71)
> at com.hierynomus.smbj.share.DiskShare.openFile(DiskShare.java:279)
> at 
> org.apache.nifi.services.smb.SmbjClientService.readFile(SmbjClientService.java:156)
> ... 15 common frames omitted
> {code}
> In this case, the configured "Directory" in the GetSmbFile processor is 
> "my-directory" (not "my-directory\subdirectory"!).
> We narrowed the issue down to the following cases:
>  * "Recurse Subdirectories" is false
>  * The directory contains subdirectories
>  * No "File Filter" is set
> h2. Cause
> From reading the code it seems like the issue was introduced by 
> [#11542|https://github.com/apache/nifi/pull/11542].
> Previously, the {{performListing}} method filtered out subdirectories 
> regardless of the {{recurseSubdirectories}} parameter:
> [nifi/nifi-extension-bundles/nifi-smb-bundle/nifi-smb-processors/src/main/java/org/apache/nifi/processors/smb/GetSmbFile.java
>  at 78a68749e64b5c32af53886b10d757aa412467b6 - 
> apache/nifi|https://github.com/apache/nifi/blob/78a68749e64b5c32af53886b10d757aa412467b6/nifi-extension-bundles/nifi-smb-bundle/nifi-smb-processors/src/main/java/org/apache/nifi/processors/smb/GetSmbFile.java#L373-L377]
> After the change, the method delegates to the {{listFiles}} method of the 
> {{{}SmbjClientService{}}}. That method only filters subdirectories if 
> {{recursive}} is true:
> [nifi/nifi-extension-bundles/nifi-smb-bundle/nifi-smb-smbj-common/src/main/java/org/apache/nifi/services/smb/SmbjClientService.java
>  at main - 
> apache/nifi|https://github.com/apache/nifi/blob/main/nifi-extension-bundles/nifi-smb-bundle/nifi-smb-smbj-common/src/main/java/org/apache/nifi/services/smb/SmbjClientService.java#L124-L125]
> Since subdirectories are no longer excluded from the directory listing, the 
> processor tries to create a FlowFile for each subdirectory, which obviously 
> fails.
> h2. Workaround
> As a workaround, you can avoid this error by setting an appropriate "File 
> Filter" which matches all file names that are intended to be read but doesn't 
> match any subdirectory name. The filter {noformat}.*\..*{noformat} often 
> works, which matches any file name containing a dot (since most files have a 
> file extension, but directories usually don't).



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

Reply via email to