You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@geode.apache.org by "ASF subversion and git services (JIRA)" <ji...@apache.org> on 2016/11/15 16:39:59 UTC

[jira] [Commented] (GEODE-2088) A get in transaction may get incorrect TransactionDataNotColocatedException when bucket is not hosted locally

    [ https://issues.apache.org/jira/browse/GEODE-2088?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15667602#comment-15667602 ] 

ASF subversion and git services commented on GEODE-2088:
--------------------------------------------------------

Commit 139398a1f5af656c59eeacdb2dd9283a7145d992 in incubator-geode's branch refs/heads/develop from [~eshu]
[ https://git-wip-us.apache.org/repos/asf?p=incubator-geode.git;h=139398a ]

GEODE-2088: Correctly throw TransactionDataRebalancedException when bucket is moved during rebalance.

Turns out the transaction layer code has already handled when to throw TransactionDataNotColocatedException in getTransactionException method call in TXStateProxyImpl by checking whether the key is colocated with the keys already touched in the transaction. Only need to make sure that piece of code will be executed by throwing correct TransactionException.


> A get in transaction may get incorrect TransactionDataNotColocatedException when bucket is not hosted locally
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: GEODE-2088
>                 URL: https://issues.apache.org/jira/browse/GEODE-2088
>             Project: Geode
>          Issue Type: Bug
>          Components: transactions
>            Reporter: Eric Shu
>
> Currently a get of a PR in transaction on a data node with TXState will first check if the bucket is hosted locally by following code. 
> {noformat}
>   public Object getLocally(int bucketId, final Object key, final Object aCallbackArgument,
>       boolean disableCopyOnRead, boolean preferCD, ClientProxyMembershipID requestingClient,
>       EntryEventImpl clientEvent, boolean returnTombstones, boolean opScopeIsLocal)
>       throws PrimaryBucketException, ForceReattemptException, PRLocallyDestroyedException {
>     final BucketRegion bucketRegion = getInitializedBucketForId(key, Integer.valueOf(bucketId));
> {noformat}
> The BucketNotFoundException is thrown if the node does not host the bucket:
> {noformat}
>   public BucketRegion getInitializedBucketForId(Object key, Integer bucketId)
>       throws ForceReattemptException {
>     final BucketRegion bucketRegion = this.localBucket2RegionMap.get(bucketId);
>     if (null == bucketRegion) {
>       this.partitionedRegion.checkReadiness();
>       if (logger.isDebugEnabled()) {
>         logger.debug("Got null bucket region for bucketId={}{}{} for PartitionedRegion = {}",
>             this.partitionedRegion.getPRId(), PartitionedRegion.BUCKET_ID_SEPARATOR, bucketId,
>             this.partitionedRegion);
>       }
>       ForceReattemptException fre = new BucketNotFoundException(
>           LocalizedStrings.PartitionedRegionDataStore_BUCKET_ID_0_NOT_FOUND_ON_VM_1
>               .toLocalizedString(
>                   new Object[] {this.partitionedRegion.bucketStringForLogs(bucketId.intValue()),
>                       this.partitionedRegion.getMyId()}));
>       if (key != null) {
>         fre.setHash(key.hashCode());
>       }
>       throw fre;
>     }
> {noformat}
> Currently, transaction would fail with the TransactionDataNotColocatedException if bucket is not on local data store 
> {noformat}
>           if (prce instanceof BucketNotFoundException) {
>             TransactionException ex = new TransactionDataNotColocatedException(
>                 LocalizedStrings.PartitionedRegion_KEY_0_NOT_COLOCATED_WITH_TRANSACTION
>                     .toLocalizedString(key));
>             ex.initCause(prce);
>             throw ex;
>           }
> {noformat}
> This TransactionDataNotColocatedException is fine if the node never hosts bucket, or only previous operations within the transaction touches replicate regions earlier. However, if a bucket is moved to another node due to rebalance, and previous entry operations within the transaction only touches colocated regions, the transaction should fail with TransactionDataRebalancedException.
> We do not have a good way currently to throw the correct exception. One idea is to iterate through the existing TXRegions in the TXState to see whether we should throw TransactionDataRebalancedException. 



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)