[
https://issues.apache.org/jira/browse/HBASE-17872?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15956304#comment-15956304
]
Anoop Sam John commented on HBASE-17872:
----------------------------------------
Yes. We should not make the pos of any of the BBs affected by the ops in
BBUtils.. Unsafe way is ok as all are relative reads/writes. When unsafe is
not availble, we should take the path of BB.duplicate() if we need to change
the position so that the original BBs are unaffected wrt pos or limit. Nice
find.. All such cases u can unify. Will see once u attach patch.. Thanks so
much.
> Make BBU#copyFromBufferToBuffer thread-safe
> -------------------------------------------
>
> Key: HBASE-17872
> URL: https://issues.apache.org/jira/browse/HBASE-17872
> Project: HBase
> Issue Type: Bug
> Reporter: Chia-Ping Tsai
> Assignee: Chia-Ping Tsai
> Priority: Critical
> Fix For: 2.0.0
>
>
> A case is shown below.
> We will get the wrong position of buffer in multithreaded environment, so the
> method makes the invalid cell in MSLAB.
> {noformat}
> public static int copyFromBufferToBuffer(ByteBuffer in, ByteBuffer out, int
> sourceOffset,
> int destinationOffset, int length) {
> if (in.hasArray() && out.hasArray()) {
> // ...
> } else if (UNSAFE_AVAIL) {
> // ...
> } else {
> int outOldPos = out.position();
> out.position(destinationOffset);
> ByteBuffer inDup = in.duplicate();
> inDup.position(sourceOffset).limit(sourceOffset + length);
> out.put(inDup);
> out.position(outOldPos);
> }
> return destinationOffset + length;
> }
> {noformat}
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)