[
https://issues.apache.org/jira/browse/HBASE-3978?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13047779#comment-13047779
]
Ming Ma commented on HBASE-3978:
--------------------------------
Stack, here is the fix. Please review. Thanks.
> rowlock lease renew doesn't work when custom coprocessor/RegionObserver
> indicates to bypass default action
> ----------------------------------------------------------------------------------------------------------
>
> Key: HBASE-3978
> URL: https://issues.apache.org/jira/browse/HBASE-3978
> Project: HBase
> Issue Type: Bug
> Components: coprocessors, regionserver
> Affects Versions: 0.92.0
> Reporter: Ming Ma
> Assignee: Ming Ma
> Attachments: HBASE-3978-TRUNK.patch
>
>
> Region server will keep extending the lease on the rowlock as long as there
> is some action on the row. This is done inside HRegionServer.getLockFromId,
> where it renew the lease on the rowlock. However, when coprocessor
> "pre-action" observer is used, getLockFromId is skipped if default action is
> bypassed. Take HRegionServer.exists as example,
> RegionCoprocessorHost.preExists could return Boolean object if one of the
> regionobservers indicates default action should be bypassed; thus
> getLockFromId didn't called and the lease on the lock doesn't get renewed.
> public boolean exists(byte[] regionName, Get get) throws IOException {
> checkOpen();
> requestCount.incrementAndGet();
> try {
> HRegion region = getRegion(regionName);
> if (region.getCoprocessorHost() != null) {
> Boolean result = region.getCoprocessorHost().preExists(get);
> if (result != null) {
> return result.booleanValue();
> }
> }
> Result r = region.get(get, getLockFromId(get.getLockId()));
> boolean result = r != null && !r.isEmpty();
> if (region.getCoprocessorHost() != null) {
> result = region.getCoprocessorHost().postExists(get, result);
> }
> return result;
> } catch (Throwable t) {
> throw convertThrowableToIOE(cleanup(t));
> }
> }
> The application scenario is:
> a) client application passes in a rowlock object in an action.
> b) there is custom coprocessor/observer used.
> c) For a given action, the custom coprocessor/observer might tell coprocessor
> framework to bypass the default action.
> From client application point of view, the behavior is sometimes the rowlock
> will timeout even though client is accessing the row all the time, depending
> on whether coprocessor/observer wants to bypass the default action.
> This applies to several other actions as well, increment, checkAndPut,
> checkandDelete.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira