Search in sources :

Example 16 with UnsupportedOperationInTransactionException

use of org.apache.geode.cache.UnsupportedOperationInTransactionException in project geode by apache.

the class TXState method commit.

/*
   * (non-Javadoc)
   * 
   * @see org.apache.geode.internal.cache.TXStateInterface#commit()
   */
public void commit() throws CommitConflictException {
    if (this.closed) {
        return;
    }
    if (logger.isDebugEnabled()) {
        logger.debug("committing transaction {}", getTransactionId());
    }
    synchronized (this.completionGuard) {
        this.completionStarted = true;
    }
    if (onBehalfOfRemoteStub && !proxy.isCommitOnBehalfOfRemoteStub()) {
        throw new UnsupportedOperationInTransactionException(LocalizedStrings.TXState_CANNOT_COMMIT_REMOTED_TRANSACTION.toLocalizedString());
    }
    cleanupNonDirtyRegions();
    try {
        /*
       * Lock buckets so they can't be rebalanced then perform the conflict check to fix #43489
       */
        try {
            lockBucketRegions();
        } catch (PrimaryBucketException pbe) {
            // not sure what to do here yet
            RuntimeException re = new TransactionDataRebalancedException(LocalizedStrings.PartitionedRegion_TRANSACTIONAL_DATA_MOVED_DUE_TO_REBALANCING.toLocalizedString());
            re.initCause(pbe);
            throw re;
        }
        if (this.locks == null) {
            reserveAndCheck();
        }
        // For internal testing
        if (this.internalAfterConflictCheck != null) {
            this.internalAfterConflictCheck.run();
        }
        /*
       * If there is a TransactionWriter plugged in, we need to to give it an opportunity to abort
       * the transaction.
       */
        TransactionWriter writer = this.proxy.getTxMgr().getWriter();
        if (!firedWriter && writer != null) {
            try {
                firedWriter = true;
                TXEvent event = getEvent();
                if (!event.hasOnlyInternalEvents()) {
                    writer.beforeCommit(event);
                }
            } catch (TransactionWriterException twe) {
                cleanup();
                throw new CommitConflictException(twe);
            } catch (VirtualMachineError err) {
                // cleanup(); this allocates objects so I don't think we can do it - that leaves the TX
                // open, but we are poison pilling so we should be ok??
                SystemFailure.initiateFailure(err);
                // now, so don't let this thread continue.
                throw err;
            } catch (Throwable t) {
                // rollback the transaction!
                cleanup();
                // Whenever you catch Error or Throwable, you must also
                // catch VirtualMachineError (see above). However, there is
                // _still_ a possibility that you are dealing with a cascading
                // error condition, so you also need to check to see if the JVM
                // is still usable:
                SystemFailure.checkFailure();
                throw new CommitConflictException(t);
            }
        }
        List /* <TXEntryStateWithRegionAndKey> */
        entries = generateEventOffsets();
        TXCommitMessage msg = null;
        try {
            /*
         * In order to preserve data consistency, we need to: 1. Modify the cache first
         * (applyChanges) 2. Ask for advice on who to send to (buildMessage) 3. Send out to other
         * members.
         * 
         * If this is done out of order, we will have problems with GII, split brain, and HA. See
         * bug #41187
         * 
         * @gregp
         */
            attachFilterProfileInformation(entries);
            lockTXRegions(regions);
            try {
                // apply changes to the cache
                applyChanges(entries);
                // For internal testing
                if (this.internalAfterApplyChanges != null) {
                    this.internalAfterApplyChanges.run();
                }
                // build and send the message
                msg = buildMessage();
                this.commitMessage = msg;
                if (this.internalBeforeSend != null) {
                    this.internalBeforeSend.run();
                }
                msg.send(this.locks.getDistributedLockId());
                // For internal testing
                if (this.internalAfterSend != null) {
                    this.internalAfterSend.run();
                }
                firePendingCallbacks();
                /*
           * This is to prepare the commit message for the caller, make sure all events are in
           * there.
           */
                this.commitMessage = buildCompleteMessage();
            } finally {
                unlockTXRegions(regions);
            }
        } finally {
            if (msg != null) {
                msg.releaseViewVersions();
            }
            this.locks.releaseLocal();
            // For internal testing
            if (this.internalAfterReleaseLocalLocks != null) {
                this.internalAfterReleaseLocalLocks.run();
            }
        }
    } finally {
        cleanup();
    }
}
Also used : CommitConflictException(org.apache.geode.cache.CommitConflictException) SynchronizationCommitConflictException(org.apache.geode.cache.SynchronizationCommitConflictException) TransactionWriter(org.apache.geode.cache.TransactionWriter) TransactionWriterException(org.apache.geode.cache.TransactionWriterException) ArrayList(java.util.ArrayList) VersionedObjectList(org.apache.geode.internal.cache.tier.sockets.VersionedObjectList) List(java.util.List) UnsupportedOperationInTransactionException(org.apache.geode.cache.UnsupportedOperationInTransactionException) TransactionDataRebalancedException(org.apache.geode.cache.TransactionDataRebalancedException)

Example 17 with UnsupportedOperationInTransactionException

use of org.apache.geode.cache.UnsupportedOperationInTransactionException in project geode by apache.

the class MapInterface2JUnitTest method testBasicMapClearTrnxn.

@Test
public void testBasicMapClearTrnxn() {
    Region rgn = CacheUtils.getRegion("Portfolios");
    int size = rgn.size();
    assertTrue("MapInterface2JUnitTest::basicMapClearNonTranxn: The init size of region is zero", size > 0);
    CacheTransactionManager tm = CacheUtils.getCacheTranxnMgr();
    tm.begin();
    rgn.put("6", new Portfolio(6));
    assertTrue(rgn.size() == 5);
    try {
        rgn.clear();
        fail("expected exception not thrownn");
    } catch (UnsupportedOperationInTransactionException e) {
    }
    if (rgn.size() == 0) {
        fail("The region size is zero even after throwing exception");
    }
    try {
        tm.commit();
    } catch (CommitConflictException cce) {
    // Ignore
    }
    if (rgn.size() == 0) {
        fail("The region size is zero even after throwing exception");
    }
}
Also used : CommitConflictException(org.apache.geode.cache.CommitConflictException) Portfolio(org.apache.geode.cache.query.data.Portfolio) Region(org.apache.geode.cache.Region) UnsupportedOperationInTransactionException(org.apache.geode.cache.UnsupportedOperationInTransactionException) CacheTransactionManager(org.apache.geode.cache.CacheTransactionManager) Test(org.junit.Test) IntegrationTest(org.apache.geode.test.junit.categories.IntegrationTest)

Aggregations

UnsupportedOperationInTransactionException (org.apache.geode.cache.UnsupportedOperationInTransactionException)17 Region (org.apache.geode.cache.Region)7 CacheTransactionManager (org.apache.geode.cache.CacheTransactionManager)6 Test (org.junit.Test)6 AttributesFactory (org.apache.geode.cache.AttributesFactory)5 ArrayList (java.util.ArrayList)4 CommitConflictException (org.apache.geode.cache.CommitConflictException)4 IntegrationTest (org.apache.geode.test.junit.categories.IntegrationTest)4 HashMap (java.util.HashMap)3 Map (java.util.Map)3 Entry (java.util.Map.Entry)3 TreeMap (java.util.TreeMap)3 PartitionAttributes (org.apache.geode.cache.PartitionAttributes)3 PartitionAttributesFactory (org.apache.geode.cache.PartitionAttributesFactory)3 TransactionDataRebalancedException (org.apache.geode.cache.TransactionDataRebalancedException)3 TransactionWriterException (org.apache.geode.cache.TransactionWriterException)3 DistributedMember (org.apache.geode.distributed.DistributedMember)3 DM (org.apache.geode.distributed.internal.DM)3 InternalDistributedMember (org.apache.geode.distributed.internal.membership.InternalDistributedMember)3 AbstractRegion (org.apache.geode.internal.cache.AbstractRegion)3