This is an automated email from the ASF dual-hosted git repository.
chungen0126 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 7ed017d22e4 HDDS-16721. StreamBlockInputStream.read() returns a
negative value for bytes 0x80 to 0xFF (#11411)
7ed017d22e4 is described below
commit 7ed017d22e4e62b2edad6ef4f3b5969ceb9f96d6
Author: Peter Lee <[email protected]>
AuthorDate: Tue Oct 6 04:48:51 2026 +0800
HDDS-16721. StreamBlockInputStream.read() returns a negative value for
bytes 0x80 to 0xFF (#11411)
---
.../hdds/scm/storage/StreamBlockInputStream.java | 2 +-
.../scm/storage/TestStreamBlockInputStream.java | 39 ++++++++++++++++++++++
2 files changed, 40 insertions(+), 1 deletion(-)
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 53620567d08..96e5fbaa781 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
@@ -144,7 +144,7 @@ public synchronized int read() throws IOException {
if (!dataAvailableToRead(1, preRead)) {
return EOF;
}
- final int value = readBuffer.getByteBuffer().get();
+ final int value = Byte.toUnsignedInt(readBuffer.getByteBuffer().get());
advancePosition(1, preRead);
return value;
}
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 ce4a66dea3a..0effa12e4bf 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
@@ -645,6 +645,45 @@ public void
testSeekReadsCorrectBytesWhenFirstResponseIsFullyBeforePosition() th
}
}
+ /** A single-byte read returns the byte as 0 to 255: 0xFF must not look like
the end of the stream. */
+ @Test
+ public void testReadReturnsUnsignedByte() throws Exception {
+ OzoneClientConfig clientConfig = newStreamReadConfig();
+ BlockID blockID = new BlockID(1L, 13L);
+ Pipeline pipeline = mockStandalonePipeline();
+ ClientCallStreamObserver<ContainerCommandRequestProto> requestObserver =
+ mock(ClientCallStreamObserver.class);
+ StreamingReadResponse streamingReadResponse =
mock(StreamingReadResponse.class);
+
when(streamingReadResponse.getRequestObserver()).thenReturn(requestObserver);
+
+ AtomicReference<StreamingReaderSpi> readerRef = new AtomicReference<>();
+ XceiverClientGrpc xceiverClient = mock(XceiverClientGrpc.class);
+ doAnswer(inv -> {
+ StreamingReaderSpi reader = inv.getArgument(1);
+ reader.setStreamingReadResponse(streamingReadResponse);
+ readerRef.set(reader);
+ return null;
+ }).when(xceiverClient).initStreamRead(any(BlockID.class), any(), any());
+ doAnswer(inv -> {
+ StreamingReaderSpi reader = readerRef.get();
+ reader.onNext(buildResponseProto(new byte[]{(byte) 0x80, (byte) 0xFF},
0));
+ reader.onCompleted();
+ return null;
+ }).when(xceiverClient).streamRead(any(), any());
+
+ XceiverClientFactory xceiverClientFactory =
mock(XceiverClientFactory.class);
+ when(xceiverClientFactory.acquireClientForReadData(any(Pipeline.class)))
+ .thenReturn(xceiverClient);
+
+ try (StreamBlockInputStream sbis = new StreamBlockInputStream(
+ blockID, 2, pipeline, null, xceiverClientFactory,
+ NO_REFRESH, clientConfig)) {
+ assertEquals(0x80, sbis.read());
+ assertEquals(0xFF, sbis.read());
+ assertEquals(-1, sbis.read());
+ }
+ }
+
/**
* Defensive test for readFromQueue() which NPE'ed when poll() returns null.
*
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]