[
https://issues.apache.org/jira/browse/HDDS-16789?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Rui Wang updated HDDS-16789:
----------------------------
Description:
h2. Problem
`Buffers.pollAll()` in the KeyValue stream write path throws
`IllegalStateException` when the internal deque is empty
(`Preconditions.checkState(!deque.isEmpty(), ...)`).
Callers such as `KeyValueStreamDataChannel.drainBuffers()` must guard with
`buffers.isEmpty()` before calling `pollAll()`, which duplicates checks and
makes the API easy to misuse. However, ideally, drainBuffers on empty buffers
can still work by do nothing, and throw an exception does not make sense.
was:
h2. Problem
`Buffers.pollAll()` in the KeyValue stream write path throws
`IllegalStateException` when the internal deque is empty
(`Preconditions.checkState(!deque.isEmpty(), ...)`).
Callers such as `KeyValueStreamDataChannel.drainBuffers()` must guard with
`buffers.isEmpty()` before calling `pollAll()`, which duplicates checks and
makes the API easy to misuse.
h2. Proposed change
* When the deque is empty, `pollAll()` returns
`ReferenceCountedObject.wrap(Unpooled.EMPTY_BUFFER)` instead of throwing.
* Simplify `KeyValueStreamDataChannel.drainBuffers()` by removing the explicit
`isEmpty()` early return; repeated drains remain a no-op.
* In the close path that flushes buffered data without parsing a stream
PutBlock (`writeBuffers()`), skip `setEndIndex` / file writes when the polled
buffer is not readable (e.g. close with no prior writes).
Behavior for `closeBuffers()` / stream PutBlock close is unchanged: an empty
buffer still fails when reading the PutBlock trailer, which is expected for a
malformed close.
> Make Buffers.pollAll() allows empty buffer instead of failing on empty deque
> ----------------------------------------------------------------------------
>
> Key: HDDS-16789
> URL: https://issues.apache.org/jira/browse/HDDS-16789
> Project: Apache Ozone
> Issue Type: Sub-task
> Reporter: Rui Wang
> Assignee: Rui Wang
> Priority: Major
> Labels: pull-request-available
>
> h2. Problem
> `Buffers.pollAll()` in the KeyValue stream write path throws
> `IllegalStateException` when the internal deque is empty
> (`Preconditions.checkState(!deque.isEmpty(), ...)`).
> Callers such as `KeyValueStreamDataChannel.drainBuffers()` must guard with
> `buffers.isEmpty()` before calling `pollAll()`, which duplicates checks and
> makes the API easy to misuse. However, ideally, drainBuffers on empty buffers
> can still work by do nothing, and throw an exception does not make sense.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]