Eric Shu created GEODE-5953:
-------------------------------
Summary: TXStateProxyImpl target needs to be set to local member
if it contains TXState
Key: GEODE-5953
URL: https://issues.apache.org/jira/browse/GEODE-5953
Project: Geode
Issue Type: Bug
Components: transactions
Reporter: Eric Shu
If target is not set earlier, it will be set in function execution code. It
could cause issue when rebalance occurs during function execution by setting
target to another node when the local member already hosts the transaction. If
target was set earlier, the following code can detect it and throw
TransactionDataRebalancedException.
public void validateExecution(Function function, Set targetMembers) {
InternalCache cache = pr.getGemFireCache();
if (cache.getTxManager().getTXState() != null) {
if (targetMembers.size() > 1) {
throw new TransactionException(
"Function inside a transaction cannot execute on more than one
node");
} else {
assert targetMembers.size() == 1;
DistributedMember funcTarget = (DistributedMember)
targetMembers.iterator().next();
DistributedMember target =
cache.getTxManager().getTXState().getTarget();
if (target == null) {
cache.getTxManager().getTXState().setTarget(funcTarget);
} else if (!target.equals(funcTarget)) {
throw new TransactionDataRebalancedException(
String.format(
"Function execution is not colocated with transaction. The
transactional data is hosted on node %s, but you are trying to target node %s",
target, funcTarget));
}
}
}
cache.getInternalResourceManager().getHeapMonitor().checkForLowMemory(function,
targetMembers);
}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)