@Override public Object visitPrepareCommand(TxInvocationContext ctx, PrepareCommand command) throws Throwable { Object retVal = invokeNextInterceptor(ctx, command); boolean sync = isSynchronous(ctx); if (shouldInvokeRemoteTxCommand(ctx)) { int newCacheViewId = -1; stateTransferLock.waitForStateTransferToEnd(ctx, command, newCacheViewId); if (command.isOnePhaseCommit()) flushL1Caches(ctx); // if we are one-phase, don't block on this future. Collection<Address> recipients = dm.getAffectedNodes(ctx.getAffectedKeys()); prepareOnAffectedNodes(ctx, command, recipients, sync); ((LocalTxInvocationContext) ctx).remoteLocksAcquired(recipients); } else if (isL1CacheEnabled && command.isOnePhaseCommit() && !ctx.isOriginLocal() && !ctx.getLockedKeys().isEmpty()) { // We fall into this block if we are a remote node, happen to be the primary data owner and // have locked keys. // it is still our responsibility to invalidate L1 caches in the cluster. flushL1Caches(ctx); } return retVal; }
@Override public Object visitLockControlCommand(TxInvocationContext ctx, LockControlCommand command) throws Throwable { Object retVal = invokeNextInterceptor(ctx, command); if (ctx.isOriginLocal()) { // unlock will happen async as it is a best effort boolean sync = !command.isUnlock(); ((LocalTxInvocationContext) ctx).remoteLocksAcquired(rpcManager.getTransport().getMembers()); rpcManager.invokeRemotely(null, command, rpcManager.getDefaultRpcOptions(sync)); } return retVal; }
@Override public Object visitLockControlCommand(TxInvocationContext ctx, LockControlCommand command) throws Throwable { if (ctx.isOriginLocal()) { int newCacheViewId = -1; stateTransferLock.waitForStateTransferToEnd(ctx, command, newCacheViewId); final Collection<Address> affectedNodes = dm.getAffectedNodes(command.getKeys()); ((LocalTxInvocationContext) ctx).remoteLocksAcquired(affectedNodes); rpcManager.invokeRemotely(affectedNodes, command, true, true); } return invokeNextInterceptor(ctx, command); }