From 1bd4169558c6825bf9f804bf9a48fc91c3d3da4a Mon Sep 17 00:00:00 2001 From: Gabor Kulik Date: Fri, 4 Nov 2022 15:23:43 +0100 Subject: [PATCH] NIFI-10702 Clear server list on connection error in SMB processors This closes #6620. Signed-off-by: Peter Turcsanyi --- .../nifi-smb-bundle/nifi-smb-processors/pom.xml | 4 ++++ .../java/org/apache/nifi/processors/smb/GetSmbFile.java | 1 + .../java/org/apache/nifi/processors/smb/PutSmbFile.java | 1 + .../org/apache/nifi/processors/smb/PutSmbFileTest.java | 5 +++++ .../nifi-smb-bundle/nifi-smb-smbj-client/pom.xml | 4 ++++ .../nifi/services/smb/SmbjClientProviderService.java | 8 +++++++- nifi-nar-bundles/nifi-smb-bundle/pom.xml | 4 ---- 7 files changed, 22 insertions(+), 5 deletions(-) diff --git a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/pom.xml b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/pom.xml index 2bab111eef..b2cb350967 100644 --- a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/pom.xml +++ b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/pom.xml @@ -53,6 +53,10 @@ com.hierynomus smbj + + org.bouncycastle + bcprov-jdk18on + commons-io commons-io diff --git a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/main/java/org/apache/nifi/processors/smb/GetSmbFile.java b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/main/java/org/apache/nifi/processors/smb/GetSmbFile.java index 9ed9a3c969..c03a846ab4 100644 --- a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/main/java/org/apache/nifi/processors/smb/GetSmbFile.java +++ b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/main/java/org/apache/nifi/processors/smb/GetSmbFile.java @@ -545,6 +545,7 @@ public class GetSmbFile extends AbstractProcessor { } catch (Exception e) { logger.error("Could not establish smb connection because of error {}", new Object[]{e}); context.yield(); + smbClient.getServerList().unregister(hostname); } } } diff --git a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/main/java/org/apache/nifi/processors/smb/PutSmbFile.java b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/main/java/org/apache/nifi/processors/smb/PutSmbFile.java index d88561e895..43196d85a1 100644 --- a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/main/java/org/apache/nifi/processors/smb/PutSmbFile.java +++ b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/main/java/org/apache/nifi/processors/smb/PutSmbFile.java @@ -401,6 +401,7 @@ public class PutSmbFile extends AbstractProcessor { } catch (Exception e) { session.transfer(flowFiles, REL_FAILURE); logger.error("Could not establish smb connection because of error {}", new Object[]{e}); + smbClient.getServerList().unregister(hostname); } } } diff --git a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/test/java/org/apache/nifi/processors/smb/PutSmbFileTest.java b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/test/java/org/apache/nifi/processors/smb/PutSmbFileTest.java index e045fa6a87..e6192caf7d 100644 --- a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/test/java/org/apache/nifi/processors/smb/PutSmbFileTest.java +++ b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-processors/src/test/java/org/apache/nifi/processors/smb/PutSmbFileTest.java @@ -21,6 +21,7 @@ import com.hierynomus.mssmb2.SMB2ShareAccess; import com.hierynomus.smbj.SMBClient; import com.hierynomus.smbj.auth.AuthenticationContext; import com.hierynomus.smbj.connection.Connection; +import com.hierynomus.smbj.server.ServerList; import com.hierynomus.smbj.session.Session; import com.hierynomus.smbj.share.DiskEntry; import com.hierynomus.smbj.share.DiskShare; @@ -59,6 +60,7 @@ public class PutSmbFileTest { private DiskShare diskShare; private DiskEntry diskEntry; private File smbfile; + private ServerList serverList; private ByteArrayOutputStream baOutputStream; private final static String HOSTNAME = "smbhostname"; @@ -80,9 +82,12 @@ public class PutSmbFileTest { diskShare = mock(DiskShare.class); diskEntry = mock(DiskEntry.class); smbfile = mock(File.class); + serverList = mock(ServerList.class); baOutputStream = new ByteArrayOutputStream(); when(smbClient.connect(any(String.class))).thenReturn(connection); + when(smbClient.getServerList()).thenReturn(serverList); + when(connection.authenticate(any(AuthenticationContext.class))).thenReturn(session); when(session.connectShare(SHARE)).thenReturn(diskShare); when(diskShare.openFile( diff --git a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-smbj-client/pom.xml b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-smbj-client/pom.xml index f6d2a57427..cdafdd6b13 100644 --- a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-smbj-client/pom.xml +++ b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-smbj-client/pom.xml @@ -49,6 +49,10 @@ com.hierynomus smbj + + org.bouncycastle + bcprov-jdk18on + org.testcontainers testcontainers diff --git a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-smbj-client/src/main/java/org/apache/nifi/services/smb/SmbjClientProviderService.java b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-smbj-client/src/main/java/org/apache/nifi/services/smb/SmbjClientProviderService.java index e1de5e5bcf..70c9260a62 100644 --- a/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-smbj-client/src/main/java/org/apache/nifi/services/smb/SmbjClientProviderService.java +++ b/nifi-nar-bundles/nifi-smb-bundle/nifi-smb-smbj-client/src/main/java/org/apache/nifi/services/smb/SmbjClientProviderService.java @@ -121,14 +121,16 @@ public class SmbjClientProviderService extends AbstractControllerService impleme @Override public SmbClientService getClient() throws IOException { - Connection connection = smbClient.connect(hostname, port); + Connection connection = null; try { + connection = smbClient.connect(hostname, port); return connectToShare(connection); } catch (IOException e) { getLogger().debug("Closing stale connection and trying to create a new one for share " + getServiceLocation()); closeConnection(connection); + unregisterHost(); connection = smbClient.connect(hostname, port); return connectToShare(connection); @@ -160,6 +162,10 @@ public class SmbjClientProviderService extends AbstractControllerService impleme return new SmbjClientService(session, (DiskShare) share, getServiceLocation()); } + private void unregisterHost() { + smbClient.getServerList().unregister(hostname); + } + private void closeConnection(Connection connection) { try { if (connection != null) { diff --git a/nifi-nar-bundles/nifi-smb-bundle/pom.xml b/nifi-nar-bundles/nifi-smb-bundle/pom.xml index bf0570ef5d..c8d60c0820 100644 --- a/nifi-nar-bundles/nifi-smb-bundle/pom.xml +++ b/nifi-nar-bundles/nifi-smb-bundle/pom.xml @@ -47,10 +47,6 @@ - - org.bouncycastle - bcprov-jdk18on - net.engio mbassador