[
https://issues.apache.org/jira/browse/NIFI-16439?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Peter Turcsanyi updated NIFI-16439:
-----------------------------------
Status: Patch Available (was: Open)
> 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
> Time Spent: 10m
> 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)