[
https://issues.apache.org/jira/browse/HDDS-17717?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Andrey Yarovoy reassigned HDDS-17717:
-------------------------------------
Assignee: Andrey Yarovoy
> OzoneFSInputStream should implement CanSetDropBehind as a no-op
> ---------------------------------------------------------------
>
> Key: HDDS-17717
> URL: https://issues.apache.org/jira/browse/HDDS-17717
> Project: Apache Ozone
> Issue Type: Improvement
> Components: Ozone Filesystem
> Reporter: Andrey Yarovoy
> Assignee: Andrey Yarovoy
> Priority: Major
>
> *Description*
> `OzoneFSInputStream` implements `ByteBufferReadable`, `CanUnbuffer` and
> `ByteBufferPositionedReadable`, but not `CanSetDropBehind`. Hadoop's
> `FSDataInputStream.setDropBehind` casts the wrapped stream to
> `CanSetDropBehind`, and on `ClassCastException` throws
> `UnsupportedOperationException`. Both exceptions fill in a stack trace.
> HBase calls `setDropBehind` on every stream it opens
> (`FSDataInputStreamWrapper.setStreamOptions`) and swallows the exception. On
> HBase every
> store-file reopen (`StoreScanner.trySwitchToStreamRead`) opens two streams,
> so the exception is thrown twice per reopen per store file.
> *Evidence (HBase YCSB on EC, RegionServer async-profiler JFR, 6×60s per arm)*
> `FSDataInputStream.setDropBehind` → `UnsupportedOperationException.<init>` →
> `Throwable.fillInStackTrace` costs **0.75% (stream read ON) and
> 0.96% (OFF)** of RS CPU. That is pure exception cost; the call has no effect.
> *Proposed fix*
> {code:java}
> public class OzoneFSInputStream extends FSInputStream
> implements ByteBufferReadable, CanUnbuffer, ByteBufferPositionedReadable,
> CanSetDropBehind {
> /** Drop-behind is a page-cache hint for the local client; Ozone reads go to
> datanodes, so it is accepted and ignored. */
> @Override
> public void setDropBehind(Boolean dropCache) {
> }
> }
> {code}
> - Same for the o3fs path; both share `OzoneFSInputStream`.
> - `CapableOzoneFSInputStream.hasCapability(StreamCapabilities.DROPBEHIND)`
> keeps returning `false`. The stream accepts the hint but does not
> implement it, so it should not advertise the capability. Callers that probe
> capabilities first see no change.
> *Rejected alternative*
> Forward the hint to the datanode (`fadvise`-style, like HDFS). That would be
> a protocol and feature change; the cost here is the exception.
> *Compatibility / side effects*
> `setDropBehind` stops throwing `UnsupportedOperationException`. Callers that
> treat the exception as "unsupported" (HBase logs and ignores it)
> now see a silent no-op. No wire change.
> *Tests*
> - Unit: `setDropBehind(true/false/null)` on an ofs and an o3fs
> `FSDataInputStream` does not throw; `hasCapability("dropbehind")` stays false.
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]