You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "Peter Turcsanyi (Jira)" <ji...@apache.org> on 2026/09/28 13:43:00 UTC
[jira] [Comment Edited] (NIFI-16385) SMB processors fail if SMB2 ECHO is not supported by the server
[ https://issues.apache.org/jira/browse/NIFI-16385?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18120178#comment-18120178 ]
Peter Turcsanyi edited comment on NIFI-16385 at 9/28/26 1:42 PM:
-----------------------------------------------------------------
Notes on the solution:
* the new "Connection Validation" property must be set to "false" if the SMB server does not support SMB2 ECHO requests outside of an active session
* an alternative failover mechanism was added to avoid stale connections but it works only in non-DFS environments (when the NiFi client has direct access to the single SMB connection in use and can reconnect if it is needed)
* health check of internal DFS connections could be implemented in the smbj library itself (see also [https://github.com/hierynomus/smbj/issues/796])
was (Author: turcsanyip):
Notes on the solution:
* the new "Connection Validation" property must be set to "false" if the SMB server does not support SMB2 ECHO outside an active session
* an alternative failover mechanism was added to avoid stale connections but it works only in non-DFS environments (when the NiFi client has direct access to the single SMB connection in use and can reconnect if it is needed)
* health check of internal DFS connections could be implemented in the smbj library itself (see also https://github.com/hierynomus/smbj/issues/796)
> SMB processors fail if SMB2 ECHO is not supported by the server
> ---------------------------------------------------------------
>
> Key: NIFI-16385
> URL: https://issues.apache.org/jira/browse/NIFI-16385
> Project: Apache NiFi
> Issue Type: Bug
> Reporter: Peter Turcsanyi
> Assignee: Peter Turcsanyi
> Priority: Major
> Fix For: 2.13.0
>
> Time Spent: 20m
> Remaining Estimate: 0h
>
> NIFI-12837 introduced connection health check because the underlying smbj library can return stale connections from its pool. The NiFi side code can handle the failed connection (reopen on exception) but it is more problematic when DFS is used and the smbj client opens sessions to the linked servers internally (not visible to our code) and it does not check if the cached connection is alive or not.
> To solve the stale connection issue, the NiFi code intercepts the "getConnection" call, validates the connection, and opens a new one if necessary. The [health check|https://github.com/apache/nifi/blob/751efb02f0360f89266d625cbda8e7c3a00465ee/nifi-extension-bundles/nifi-smb-bundle/nifi-smb-smbj-common/src/main/java/org/apache/nifi/smb/common/SmbClient.java#L80] is performed via an SMB2 ECHO call. This approach properly works on Windows Server and Linux/Samba but other servers (like Dell PowerScale) may reject the ECHO. Actually, these servers strictly follow the SMB specification which says about the [SMB2 ECHO|https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-smb2/fa23e613-2768-49e5-aa68-97c4bba72379] request: _“If Connection.SessionTable is empty, the server SHOULD<405> disconnect the connection.”_
> Result on the client side:
> {code:java}
> 2026-09-24 22:32:52,172 INFO [Packet Reader for 10.17.189.79, Original Thread name: Timer-Driven Process Thread-2] c.h.s.t.tcp.direct.DirectTcpPacketReader PacketReader e
> rror, got exception.
> com.hierynomus.protocol.transport.TransportException: java.io.EOFException: EOF while reading packet
> at com.hierynomus.smbj.transport.tcp.direct.DirectTcpPacketReader.readFully(DirectTcpPacketReader.java:72)
> at com.hierynomus.smbj.transport.tcp.direct.DirectTcpPacketReader.readTcpHeader(DirectTcpPacketReader.java:59)
> at com.hierynomus.smbj.transport.tcp.direct.DirectTcpPacketReader.doRead(DirectTcpPacketReader.java:48)
> at com.hierynomus.smbj.transport.PacketReader.readPacket(PacketReader.java:75)
> at com.hierynomus.smbj.transport.PacketReader.run(PacketReader.java:53)
> at java.base/java.lang.Thread.run(Thread.java:1583) {code}
> As the health check is critical for DFS only, it can be made optional for environments where the server does not support it (and no DFS is in use).
>
--
This message was sent by Atlassian Jira
(v8.20.10#820010)