[
https://issues.apache.org/jira/browse/HBASE-22309?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Michael Stack updated HBASE-22309:
----------------------------------
Issue Type: Improvement (was: Bug)
Priority: Critical (was: Major)
Summary: Replace Shipper Interface with Netty's ReferenceCounted; add
ExtendCell#retain/ExtendCell#release (was: Replace the Shipper interface by
using ExtendCell#retain or ExtendCell#release)
> Replace Shipper Interface with Netty's ReferenceCounted; add
> ExtendCell#retain/ExtendCell#release
> -------------------------------------------------------------------------------------------------
>
> Key: HBASE-22309
> URL: https://issues.apache.org/jira/browse/HBASE-22309
> Project: HBase
> Issue Type: Improvement
> Reporter: Zheng Hu
> Assignee: Zheng Hu
> Priority: Critical
>
> We've some discussion about the Shipper interface.
> {code}
> /**
> * This interface denotes a scanner as one which can ship cells. Scan
> operation do many RPC requests
> * to server and fetch N rows/RPC. These are then shipped to client. At the
> end of every such batch
> * {@link #shipped()} will get called.
> */
> @InterfaceAudience.Private
> public interface Shipper {
> /**
> * Called after a batch of rows scanned and set to be returned to client.
> Any in between cleanup
> * can be done here.
> */
> void shipped() throws IOException;
> }
> {code}
> it seems not an elegant ways...for example:
> 1. we want to keep the previous cell in the scanner, we must deep clone
> the kv before an shipping, otherwise the ship will free all the ByteBuffers,
> the prevCell will point to an unknown area.
> 2. when switch from PREAD to STREAM in a long scan, we also have accomplish
> this in shipped() method. if not , once we close the PREAD scanner, the
> un-shipped cell will also point to an unknown memory area, because the
> scanner closing free all ByteBuffes.
> ....
> If we change to use refCnt to manage the RPC memory release or retain, we
> can just call prevCell.retain.. then it memory won't be free unless the
> prevCell reach the end of life and call prevCell#release. I mean we can
> replace all the shipper logic by using cell#release and cell#retain.
> One concern is about the API, actually the ExtendCell is an pure server side
> type, we can make the ExtendCell extend the Netty's ReferenceCounted
> interface , and provide an retain() and release() methods. we won't maitain
> an refCnt in ExtendCell, the refCnt is still in HFileBlock. Once we encoded
> an ExtendCell to CellScanner, we can release the extendCell, and it will
> release its blocks backend... so in theory, will have no performance loss...
> Anyway, that would be a big change, so maybe need to create another new
> feature branch to address this.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)