/*
* JBoss, Home of Professional Open Source
* Copyright 2009 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.distribution.rehash;
import org.infinispan.Cache;
import org.infinispan.distribution.MagicKey;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.distribution.BaseDistFunctionalTest;
import org.infinispan.test.TestingUtil;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static java.util.concurrent.TimeUnit.SECONDS;
/**
* Ensures entries are moved to L1 if they are removed due to a rehash
*
* @author Manik Surtani
* @since 4.0
*/
@Test(groups = "functional", testName = "distribution.rehash.L1OnRehashTest")
public class L1OnRehashTest extends BaseDistFunctionalTest {
public L1OnRehashTest() {
this.tx = false;
this.sync = true;
this.l1CacheEnabled = true;
this.performRehashing = true;
this.l1OnRehash = true;
this.INIT_CLUSTER_SIZE = 2;
cleanup = CleanupPhase.AFTER_METHOD;
}
EmbeddedCacheManager joinerManager;
Cache<Object, String> joiner;
void performRehashEvent() {
joinerManager = addClusterEnabledCacheManager();
joinerManager.defineConfiguration(cacheName, configuration);
joiner = joinerManager.getCache(cacheName);
}
int waitForJoinCompletion() {
// need to block until this join has completed!
TestingUtil.blockUntilViewsReceived(SECONDS.toMillis(10), c1, c2, joiner);
waitForClusterToForm(cacheName);
// where does the joiner sit in relation to the other caches?
int joinerPos = locateJoiner(joinerManager.getAddress());
log.info("***>>> Joiner is in position " + joinerPos);
caches.add(joinerPos, joiner);
return joinerPos;
}
private List<MagicKey> init() {
List<MagicKey> keys = new ArrayList<MagicKey>(Arrays.asList(
new MagicKey(c1, "k1"), new MagicKey(c2, "k2")
));
int i = 0;
for (Cache<Object, String> c : caches) c.put(keys.get(i++), "v" + i);
i = 0;
for (MagicKey key : keys) assertOnAllCachesAndOwnership(key, "v" + ++i);
log.infof("Initialized with keys %s", keys);
return keys;
}
public void testInvalidationBehaviorOnRehash() {
// start with 2 caches...
List<MagicKey> keys = init();
// add 1
performRehashEvent();
int joinerPos = waitForJoinCompletion();
for (MagicKey key : keys) {
assertOwnershipAndNonOwnership(key, l1OnRehash);
}
}
}