package org.infinispan.distribution;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import java.util.ArrayList;
import java.util.List;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.context.Flag;
import org.infinispan.persistence.dummy.DummyInMemoryStore;
import org.infinispan.persistence.dummy.DummyInMemoryStoreConfigurationBuilder;
import org.infinispan.persistence.manager.PersistenceManager;
import org.infinispan.persistence.spi.AdvancedCacheLoader;
import org.infinispan.test.TestingUtil;
import org.testng.annotations.Test;
@Test(groups = "functional", testName = "distribution.DistSyncL1PassivationFuncTest")
public class DistSyncL1PassivationFuncTest extends BaseDistFunctionalTest {
protected int MAX_ENTRIES = 4;
protected AdvancedCacheLoader ownerCacheStore;
protected AdvancedCacheLoader nonOwnerCacheStore;
public DistSyncL1PassivationFuncTest() {
testRetVals = true;
numOwners = 1;
INIT_CLUSTER_SIZE = 2;
}
@Override
protected void createCacheManagers() throws Throwable {
super.createCacheManagers();
ownerCacheStore = TestingUtil.extractComponent(cache(0, cacheName), PersistenceManager.class).getStores(DummyInMemoryStore.class).iterator().next();
nonOwnerCacheStore = TestingUtil.extractComponent(cache(1, cacheName), PersistenceManager.class).getStores(DummyInMemoryStore.class).iterator().next();
}
@Override
protected ConfigurationBuilder buildConfiguration() {
ConfigurationBuilder builder = super.buildConfiguration();
builder
.eviction()
.maxEntries(MAX_ENTRIES)
.persistence()
.passivation(true)
.addStore(DummyInMemoryStoreConfigurationBuilder.class);
return builder;
}
@Test
public void testPassivatedL1Entries() {
final int minPassivated = 2;
final int insertCount = MAX_ENTRIES + minPassivated;
List<MagicKey> keys = new ArrayList<MagicKey>(insertCount);
Cache<MagicKey, Object> ownerCache = cache(0, cacheName);
Cache<MagicKey, Object> nonOwnerCache = cache(1, cacheName);
// Need to put 2+ magic keys to make sure we fill up the L1 on the local node
for (int i = 0; i < insertCount; ++i) {
// If the put worked then keep the key otherwise we need to generate a new one
MagicKey key = new MagicKey(ownerCache);
while (ownerCache.putIfAbsent(key, key) != null) {
key = new MagicKey(ownerCache);
}
keys.add(key);
}
assertTrue(ownerCacheStore.size() >= minPassivated);
assertTrue(MAX_ENTRIES >= ownerCache.getAdvancedCache().getDataContainer().size());
assertEquals(0, nonOwnerCache.getAdvancedCache().withFlags(Flag.CACHE_MODE_LOCAL).size());
assertEquals(0, nonOwnerCacheStore.size());
// Now load those keys in our non owner cache which should store them in L1
for (MagicKey key : keys) {
nonOwnerCache.get(key);
}
// L1 entries should not be passivated
assertEquals("Some L1 values were passivated", 0, nonOwnerCacheStore.size());
}
}