[
https://issues.apache.org/jira/browse/HDDS-15485?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
ASF GitHub Bot updated HDDS-15485:
----------------------------------
Labels: pull-request-available (was: )
> Avoid ByteBuffer.wrap on ChunkBuffer.put(byte[]) path
> -----------------------------------------------------
>
> Key: HDDS-15485
> URL: https://issues.apache.org/jira/browse/HDDS-15485
> Project: Apache Ozone
> Issue Type: Bug
> Reporter: Andrey Yarovoy
> Assignee: Andrey Yarovoy
> Priority: Major
> Labels: pull-request-available
>
> The default on {{ChunkBuffer}} is:
>
> {code:java}
> default ChunkBuffer put(byte[] b,int offset,int length) {
> return put(ByteBuffer.wrap(b, offset, length));
> }
>
> {code}
> So every {{{}put(byte[], offset, length){}}}:
> # Allocates a new {{ByteBuffer}} view ({{{}HeapByteBuffer{}}} over the same
> backing array).
> # Dispatches to {{put(ByteBuffer)}}, which for list/incremental buffers runs
> a segment loop that adjusts the wrapper’s position/limit and copies via
> {{{}ByteBuffer.put(ByteBuffer){}}}.
> On the client write path, {{BlockOutputStream.write(byte[], …)}} calls
> {{currentBuffer.put(b, off, writeLen)}} once per slice that fits in the
> current chunk buffer. Large writes can do that many times per {{write()}}
> call.
>
> {{wrap}} itself is “cheap” (no array copy), but per call it still pays object
> allocation + dispatch into the {{ByteBuffer}} put path. On a hot path called
> for every slice of every {{{}write(byte[]){}}}, that cost is measurable under
> load.
>
> the fix would be micro-optimization, but should reduce memory allocations on
> hot path and reduce number of objects for garbage collection.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]