This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-4.10.x in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/camel-4.10.x by this push: new feaa958265d CAMEL-22174 Catch TransportExceptions and disconnect share calls so we can recover from network outage (#18387) (#18399) feaa958265d is described below commit feaa958265d389ded78b3c5d8d4fa379ef5301bc Author: Tom Cunningham <tcunn...@redhat.com> AuthorDate: Thu Jun 19 01:13:53 2025 -0400 CAMEL-22174 Catch TransportExceptions and disconnect share calls so we can recover from network outage (#18387) (#18399) --- .../apache/camel/component/smb/SmbOperations.java | 74 +++++++++++++++++++--- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbOperations.java b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbOperations.java index 333d28b0092..b7e40c1da09 100644 --- a/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbOperations.java +++ b/components/camel-smb/src/main/java/org/apache/camel/component/smb/SmbOperations.java @@ -28,8 +28,10 @@ import com.hierynomus.msfscc.fileinformation.FileIdBothDirectoryInformation; import com.hierynomus.mssmb2.SMB2CreateDisposition; import com.hierynomus.mssmb2.SMB2CreateOptions; import com.hierynomus.mssmb2.SMB2ShareAccess; +import com.hierynomus.protocol.transport.TransportException; import com.hierynomus.smbj.SMBClient; import com.hierynomus.smbj.auth.AuthenticationContext; +import com.hierynomus.smbj.common.SMBRuntimeException; import com.hierynomus.smbj.connection.Connection; import com.hierynomus.smbj.session.Session; import com.hierynomus.smbj.share.DiskShare; @@ -126,6 +128,12 @@ public class SmbOperations implements SmbFileOperations { if (session != null) { try { session.close(); + } catch (TransportException t) { + try { + session.getConnection().close(true); + } catch (IOException e) { + // ignore + } } catch (Exception e) { // ignore } @@ -189,6 +197,11 @@ public class SmbOperations implements SmbFileOperations { } src.deleteOnClose(); + } catch (SMBRuntimeException smbre) { + if (smbre.getCause() instanceof TransportException) { + disconnect(); + throw smbre; + } } return true; } @@ -197,7 +210,15 @@ public class SmbOperations implements SmbFileOperations { public boolean buildDirectory(String directory, boolean absolute) throws GenericFileOperationFailedException { connectIfNecessary(); SmbFiles files = new SmbFiles(); - files.mkdirs(share, normalize(directory)); + + try { + files.mkdirs(share, normalize(directory)); + } catch (SMBRuntimeException smbre) { + if (smbre.getCause() instanceof TransportException) { + disconnect(); + throw smbre; + } + } return true; } @@ -215,7 +236,16 @@ public class SmbOperations implements SmbFileOperations { public boolean existsFolder(String name) { connectIfNecessary(); - return share.folderExists(name); + boolean result = false; + try { + result = share.folderExists(name); + } catch (SMBRuntimeException smbre) { + if (smbre.getCause() instanceof TransportException) { + disconnect(); + throw smbre; + } + } + return result; } private boolean retrieveFileToStreamInBody(String name, Exchange exchange) throws GenericFileOperationFailedException { @@ -242,6 +272,11 @@ public class SmbOperations implements SmbFileOperations { } exchange.getIn().setHeader(SmbConstants.SMB_UNC_PATH, shareFile.getUncPath()); + } catch (SMBRuntimeException smbre) { + if (smbre.getCause() instanceof TransportException) { + disconnect(); + throw smbre; + } } return true; } @@ -490,7 +525,16 @@ public class SmbOperations implements SmbFileOperations { public FileIdBothDirectoryInformation[] listFiles(String path, String searchPattern) throws GenericFileOperationFailedException { connectIfNecessary(); - return share.list(path, searchPattern).toArray(FileIdBothDirectoryInformation[]::new); + FileIdBothDirectoryInformation[] result = null; + try { + result = share.list(path, searchPattern).toArray(FileIdBothDirectoryInformation[]::new); + } catch (SMBRuntimeException smbre) { + if (smbre.getCause() instanceof TransportException) { + disconnect(); + throw smbre; + } + } + return result; } public byte[] getBody(String path) { @@ -503,16 +547,30 @@ public class SmbOperations implements SmbFileOperations { } catch (Exception e) { throw new GenericFileOperationFailedException(e.getMessage(), e); } + } catch (SMBRuntimeException smbre) { + if (smbre.getCause() instanceof TransportException) { + disconnect(); + throw smbre; + } } + return null; } public InputStream getBodyAsInputStream(Exchange exchange, String path) { connectIfNecessary(); - File shareFile = share.openFile(path, EnumSet.of(AccessMask.GENERIC_READ), null, - SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OPEN, null); - InputStream is = shareFile.getInputStream(); - exchange.getIn().setHeader(SmbComponent.SMB_FILE_INPUT_STREAM, is); - exchange.getIn().setHeader(SmbConstants.SMB_UNC_PATH, shareFile.getUncPath()); + InputStream is = null; + try { + File shareFile = share.openFile(path, EnumSet.of(AccessMask.GENERIC_READ), null, + SMB2ShareAccess.ALL, SMB2CreateDisposition.FILE_OPEN, null); + is = shareFile.getInputStream(); + exchange.getIn().setHeader(SmbComponent.SMB_FILE_INPUT_STREAM, is); + exchange.getIn().setHeader(SmbConstants.SMB_UNC_PATH, shareFile.getUncPath()); + } catch (SMBRuntimeException smbre) { + if (smbre.getCause() instanceof TransportException) { + disconnect(); + throw smbre; + } + } return is; }