This is an automated email from the ASF dual-hosted git repository. rabreu pushed a commit to branch issue_7978_blob_download in repository https://gitbox.apache.org/repos/asf/storm.git
commit 36c4b816cf52453b47cb337a27be7438d3c971b0 Author: Rui Abreu <[email protected]> AuthorDate: Sun Oct 5 20:08:52 2025 +0100 KeyAlreadyExistsException does not cause downloadMissingBlob to return false --- .../org/apache/storm/blobstore/BlobStoreUtils.java | 1 + .../apache/storm/blobstore/BlobStoreUtilsTest.java | 51 +++++++++++++++++++--- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/storm-server/src/main/java/org/apache/storm/blobstore/BlobStoreUtils.java b/storm-server/src/main/java/org/apache/storm/blobstore/BlobStoreUtils.java index cc1d54550..f42b0c7e0 100644 --- a/storm-server/src/main/java/org/apache/storm/blobstore/BlobStoreUtils.java +++ b/storm-server/src/main/java/org/apache/storm/blobstore/BlobStoreUtils.java @@ -150,6 +150,7 @@ public class BlobStoreUtils { throw new RuntimeException(exception); } catch (KeyAlreadyExistsException kae) { LOG.info("KeyAlreadyExistsException Key: {} {}", key, kae); + isSuccess = true; } catch (KeyNotFoundException knf) { // Catching and logging KeyNotFoundException because, if // there is a subsequent update and delete, the non-leader diff --git a/storm-server/src/test/java/org/apache/storm/blobstore/BlobStoreUtilsTest.java b/storm-server/src/test/java/org/apache/storm/blobstore/BlobStoreUtilsTest.java index fa4352691..6079c8432 100644 --- a/storm-server/src/test/java/org/apache/storm/blobstore/BlobStoreUtilsTest.java +++ b/storm-server/src/test/java/org/apache/storm/blobstore/BlobStoreUtilsTest.java @@ -12,17 +12,27 @@ package org.apache.storm.blobstore; +import java.io.IOException; +import java.io.InputStream; +import java.util.Collections; import java.util.List; import java.util.Map; + +import org.apache.storm.generated.*; import org.apache.storm.nimbus.NimbusInfo; +import org.apache.storm.thrift.TException; +import org.apache.storm.thrift.transport.TTransportException; +import org.apache.storm.utils.NimbusClient; import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import javax.security.auth.Subject; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.atLeastOnce; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; public class BlobStoreUtilsTest { @@ -126,4 +136,33 @@ public class BlobStoreUtilsTest { verify(nimbusDetails).getHost(); verify(conf, atLeastOnce()).get(anyString()); } + + @Test + public void testDownloadMissingBlob_KeyAkreadyExists() throws TException, IOException { + + NimbusClient.Builder builder1 = mock(NimbusClient.Builder.class); + NimbusClient.Builder builder2 = mock(NimbusClient.Builder.class); + NimbusClient client = mock(NimbusClient.class); + ReadableBlobMeta readableBlobMeta = mock(ReadableBlobMeta.class); + Nimbus.Iface iface = mock(Nimbus.Iface.class); + + + try (MockedStatic<NimbusClient.Builder> mockedNimbusClient = Mockito.mockStatic(NimbusClient.Builder.class)) { + + mockedNimbusClient.when(() ->NimbusClient.Builder.withConf(anyMap())).thenReturn(builder1); + when(builder1.forDaemon()).thenReturn(builder2); + when(builder2.buildWithNimbusHostPort(anyString(),anyInt())).thenReturn(client); + when(client.getClient()).thenReturn(iface); + when(iface.getBlobMeta(anyString())).thenReturn(readableBlobMeta); + when(readableBlobMeta.get_settable()).thenReturn(new SettableBlobMeta()); + when(iface.beginBlobDownload(anyString())).thenReturn(new BeginDownloadResult()); + when(nimbusDetails.getHost()).thenReturn("localhost"); + when(nimbusDetails.getPort()).thenReturn(1234); + + doThrow(new KeyAlreadyExistsException()).when(blobStore).createBlob(anyString(),any(InputStream.class),any(SettableBlobMeta.class),any(Subject.class)); + + assertTrue((BlobStoreUtils.downloadMissingBlob(conf, blobStore, "testKey", Collections.singleton(nimbusDetails)))); + } + + } }
