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)

Reply via email to