diff --git a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/StreamBlockInputStream.java b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/StreamBlockInputStream.java index cb2f80ca7c83..223ce65881f1 100644 --- a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/StreamBlockInputStream.java +++ b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/StreamBlockInputStream.java @@ -345,8 +345,8 @@ public ByteBuffer readNext() throws IOException { } private void releaseResources() { - boolean wasNotYetComplete = semaphoreReleased.getAndSet(true); - if (wasNotYetComplete) { + // release resources only if it was not yet completed + if (semaphoreReleased.compareAndSet(false, true)) { releaseStreamResources(response); } } diff --git a/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/storage/TestStreamBlockInputStream.java b/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/storage/TestStreamBlockInputStream.java index b2cb3fb865cb..83784499110f 100644 --- a/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/storage/TestStreamBlockInputStream.java +++ b/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/storage/TestStreamBlockInputStream.java @@ -193,7 +193,7 @@ public void testErrorThrownIfStreamReturnsError() throws IOException, Interrupte return null; }).when(xceiverClient).streamRead(any(), any()); assertThrows(IOException.class, () -> blockStream.read()); - verify(xceiverClient, times(0)).completeStreamRead(any()); + verify(xceiverClient, times(1)).completeStreamRead(any()); } @Test