René Zeidler created NIFI-16439:
-----------------------------------
Summary: 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
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 "{{{}.*\..*{}}}" 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)