/* * JBoss, Home of Professional Open Source * Copyright 2010 Red Hat Inc. and/or its affiliates and other * contributors as indicated by the @author tags. All rights reserved. * See the copyright.txt in the distribution for a full listing of * individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.infinispan.lock; import org.infinispan.Cache; import org.infinispan.config.Configuration; import org.infinispan.distribution.MagicKey; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.test.fwk.CleanupAfterMethod; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.infinispan.transaction.LockingMode; import org.testng.annotations.Test; import javax.transaction.HeuristicMixedException; import javax.transaction.HeuristicRollbackException; import javax.transaction.NotSupportedException; import javax.transaction.RollbackException; import javax.transaction.SystemException; @Test(testName = "lock.APIDistTest", groups = "functional") @CleanupAfterMethod public class APIDistTest extends MultipleCacheManagersTest { EmbeddedCacheManager cm1, cm2; MagicKey key; // guaranteed to be mapped to cache2 @Override protected void createCacheManagers() throws Throwable { Configuration cfg = createConfig(); cm1 = TestCacheManagerFactory.createClusteredCacheManager(cfg); cm2 = TestCacheManagerFactory.createClusteredCacheManager(cfg); registerCacheManager(cm1, cm2); cm1.getCache(); waitForClusterToForm(); key = new MagicKey(cm2.getCache(), "Key mapped to Cache2"); } protected Configuration createConfig() { Configuration cfg = getDefaultClusteredConfig(Configuration.CacheMode.DIST_SYNC, true); cfg.fluent().transaction().lockingMode(LockingMode.PESSIMISTIC); cfg.setL1CacheEnabled(false); // no L1 enabled cfg.setLockAcquisitionTimeout(100); cfg.setNumOwners(1); cfg.setSyncCommitPhase(true); cfg.setSyncRollbackPhase(true); return cfg; } public void testLockAndGet() throws SystemException, NotSupportedException { Cache<MagicKey, String> cache1 = cache(0), cache2 = cache(1); cache1.put(key, "v"); assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1"; assert "v".equals(cache2.get(key)) : "Could not find key " + key + " on cache2"; tm(0).begin(); log.trace("About to lock"); cache1.getAdvancedCache().lock(key); log.trace("About to get"); assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1"; tm(0).rollback(); } public void testLockAndGetAndPut() throws SystemException, NotSupportedException, RollbackException, HeuristicRollbackException, HeuristicMixedException { Cache<MagicKey, String> cache1 = cache(0), cache2 = cache(1); cache1.put(key, "v"); assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1"; assert "v".equals(cache2.get(key)) : "Could not find key " + key + " on cache2"; tm(0).begin(); cache1.getAdvancedCache().lock(key); assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1"; String old = cache1.put(key, "new_value"); assert "v".equals(old) : "Expected v, was " + old; log.trace("Before commit!"); tm(0).commit(); String val; assert "new_value".equals(val = cache1.get(key)) : "Could not find key " + key + " on cache1: expected new_value, was " + val; assert "new_value".equals(val = cache2.get(key)) : "Could not find key " + key + " on cache2: expected new_value, was " + val; } public void testLockAndPutRetval() throws SystemException, NotSupportedException, RollbackException, HeuristicRollbackException, HeuristicMixedException { Cache<MagicKey, String> cache1 = cache(0), cache2 = cache(1); cache1.put(key, "v"); assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1"; assert "v".equals(cache2.get(key)) : "Could not find key " + key + " on cache2"; tm(0).begin(); cache1.getAdvancedCache().lock(key); String old = cache1.put(key, "new_value"); assert "v".equals(old) : "Expected v, was " + old; tm(0).commit(); String val; assert "new_value".equals(val = cache1.get(key)) : "Could not find key " + key + " on cache1: expected new_value, was " + val; assert "new_value".equals(val = cache2.get(key)) : "Could not find key " + key + " on cache2: expected new_value, was " + val; } public void testLockAndRemoveRetval() throws SystemException, NotSupportedException, RollbackException, HeuristicRollbackException, HeuristicMixedException { Cache<MagicKey, String> cache1 = cache(0), cache2 = cache(1); cache1.put(key, "v"); assert "v".equals(cache1.get(key)) : "Could not find key " + key + " on cache1"; assert "v".equals(cache2.get(key)) : "Could not find key " + key + " on cache2"; tm(0).begin(); cache1.getAdvancedCache().lock(key); String old = cache1.remove(key); assert "v".equals(old) : "Expected v, was " + old; tm(0).commit(); String val; assert (null == (val = cache1.get(key))) : "Could not find key " + key + " on cache1: expected null, was " + val; assert (null == (val = cache2.get(key))) : "Could not find key " + key + " on cache2: expected null, was " + val; } }