blob: 35cdf4496a08221fa948f13c44f7d788d1dc805c [file] [log] [blame]
/*
* =========================================================================
* Copyright (c) 2002-2014 Pivotal Software, Inc. All Rights Reserved.
* This product is protected by U.S. and international copyright
* and intellectual property laws. Pivotal products are covered by
* more patents listed at http://www.pivotal.io/patents.
* =========================================================================
*/
package com.gemstone.gemfire.internal.cache;
import com.gemstone.gemfire.LogWriter;
import com.gemstone.gemfire.cache.CacheException;
import com.gemstone.gemfire.cache.EvictionAction;
import com.gemstone.gemfire.cache.EvictionAttributes;
import com.gemstone.gemfire.cache.PartitionAttributesFactory;
import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.cache.RegionAttributes;
import com.gemstone.gemfire.cache.RegionDestroyedException;
import com.gemstone.gemfire.cache.RegionExistsException;
import com.gemstone.gemfire.cache30.CacheSerializableRunnable;
import com.gemstone.gemfire.cache30.CacheTestCase;
import com.gemstone.gemfire.internal.logging.InternalLogWriter;
import com.gemstone.gemfire.internal.logging.LogWriterImpl;
import com.gemstone.gemfire.internal.logging.PureLogWriter;
import dunit.Host;
import dunit.SerializableRunnable;
import dunit.standalone.DUnitLauncher;
/**
* This class is extended by some PartitionedRegion related DUnit test cases
*
*/
public class PartitionedRegionDUnitTestCase extends CacheTestCase
{
static int oldLogLevel;
public void setVMInfoLogLevel() {
SerializableRunnable runnable = new SerializableRunnable() {
public void run() {
oldLogLevel = setLogLevel(getCache().getLogger(), InternalLogWriter.INFO_LEVEL);
}
};
for (int i=0; i<4; i++) {
Host.getHost(0).getVM(i).invoke(runnable);
}
}
public void resetVMLogLevel() {
SerializableRunnable runnable = new SerializableRunnable() {
public void run() {
setLogLevel(getCache().getLogger(), oldLogLevel);
}
};
for (int i=0; i<4; i++) {
Host.getHost(0).getVM(i).invoke(runnable);
}
}
/**
* Sets the loglevel for the provided log writer
* @param l the {@link LogWriter}
* @param logLevl the new log level as specified in {@link LogWriterImpl}
* @return the old log level
*/
public static int setLogLevel(LogWriter l, int logLevl)
{
int ret = -1;
l.config("PartitionedRegionDUnitTest attempting to set log level on LogWriter instance class:" + l.getClass().getName());
if (l instanceof PureLogWriter) {
PureLogWriter pl = (PureLogWriter) l;
ret = pl.getLogWriterLevel();
l.config("PartitiionedRegionDUnitTest forcing log level to " + LogWriterImpl.levelToString(logLevl)
+ " from " + LogWriterImpl.levelToString(ret));
pl.setLevel(logLevl);
}
return ret;
}
public PartitionedRegionDUnitTestCase(String name) {
super(name);
}
/**
* Tear down a PartitionedRegionTestCase by cleaning up the existing cache (mainly
* because we want to destroy any existing PartitionedRegions)
*/
public void tearDown2() throws Exception
{
try {
closeCache();
invokeInEveryVM(CacheTestCase.class, "closeCache");
} finally {
super.tearDown2();
}
}
public static void caseSetUp() {
DUnitLauncher.launchIfNeeded();
// this makes sure we don't have any connection left over from previous tests
disconnectAllFromDS();
}
public static void caseTearDown() {
// this makes sure we don't leave anything for the next tests
disconnectAllFromDS();
}
/**
* This function creates multiple partition regions in a VM. The name of the
* Partition Region will be PRPrefix+index (index starts from
* startIndexForRegion and ends to endIndexForRegion)
*
* @param PRPrefix :
* Used in the name of the Partition Region
*
* These indices Represents range of the Partition Region
* @param startIndexForRegion :
* @param endIndexForRegion
* @param redundancy
* @param localmaxMemory
* @param evict
* @return
*/
public CacheSerializableRunnable createMultiplePartitionRegion(
final String PRPrefix, final int startIndexForRegion,
final int endIndexForRegion, final int redundancy, final int localmaxMemory) {
return createMultiplePartitionRegion(PRPrefix, startIndexForRegion, endIndexForRegion, redundancy, localmaxMemory, false);
}
/**
* This function creates multiple partition regions in a VM. The name of the
* Partition Region will be PRPrefix+index (index starts from
* startIndexForRegion and ends to endIndexForRegion)
*
* @param PRPrefix :
* Used in the name of the Partition Region
*
* These indices Represents range of the Partition Region
* @param startIndexForRegion :
* @param endIndexForRegion
* @param redundancy
* @param localmaxMemory
* @param evict
* @return
*/
public CacheSerializableRunnable createMultiplePartitionRegion(
final String PRPrefix, final int startIndexForRegion,
final int endIndexForRegion, final int redundancy, final int localmaxMemory, final boolean evict)
{
return new CacheSerializableRunnable(
"createPrRegions_" + PRPrefix) {
String innerPRPrefix = PRPrefix;
int innerStartIndexForRegion = startIndexForRegion;
int innerEndIndexForRegion = endIndexForRegion;
int innerRedundancy = redundancy;
int innerlocalmaxMemory = localmaxMemory;
public void run2() throws CacheException
{
System.setProperty(PartitionedRegion.RETRY_TIMEOUT_PROPERTY,
"20000");
EvictionAttributes evictionAttrs = evict ? EvictionAttributes
.createLRUEntryAttributes(Integer.MAX_VALUE,
EvictionAction.LOCAL_DESTROY) : null;
for (int i = startIndexForRegion; i < endIndexForRegion; i++) {
Region partitionedregion = getCache().createRegion(innerPRPrefix + i,
createRegionAttrsForPR(innerRedundancy,
innerlocalmaxMemory, PartitionAttributesFactory.RECOVERY_DELAY_DEFAULT, evictionAttrs));
getCache().getLogger().info("Successfully created PartitionedRegion = " + partitionedregion);
}
System.setProperty(PartitionedRegion.RETRY_TIMEOUT_PROPERTY,
Integer.toString(PartitionedRegionHelper.DEFAULT_TOTAL_WAIT_RETRY_ITERATION));
getCache().getLogger().info("createMultiplePartitionRegion() - Partition Regions Successfully Completed ");
}
};
}
protected RegionAttributes<?, ?> createRegionAttrsForPR(int red, int localMaxMem, long recoveryDelay, EvictionAttributes evictionAttrs) {
return PartitionedRegionTestHelper.createRegionAttrsForPR(
red, localMaxMem, recoveryDelay, evictionAttrs, null);
}
public CacheSerializableRunnable getCreateMultiplePRregion(
final String prPrefix, final int maxIndex, final int redundancy, final int localmaxMemory, final long recoveryDelay)
{
return new CacheSerializableRunnable("getCreateMultiplePRregion") {
public void run2() throws CacheException
{
// final Random ra = new Random();
for (int i = 0; i < maxIndex; i++) {
// final int rind = ra.nextInt(maxIndex);
try {
getCache().createRegion(
prPrefix + i,
PartitionedRegionTestHelper.createRegionAttrsForPR(redundancy,
localmaxMemory, recoveryDelay));
getLogWriter().info("Created Region new --- " + prPrefix + i);
} catch (RegionExistsException ignore) {}
}
getLogWriter().info("getCreateMultiplePRregion() - Partition Regions Successfully Completed ");
}
};
}
/**
* This function performs following checks on allPartitionRegion and
* bucket2Node region of Partition Region 1. allPartitionRegion should not be
* null 2. size of allPartitionRegion should be no. of regions + 1.
* 3.Bucket2Node should not be null and size should = no. of regions 4. Name
* of the Bucket2Node should be
* PartitionedRegionHelper.BUCKET_2_NODE_TABLE_PREFIX + pr.getName().
*/
public CacheSerializableRunnable validateMultiplePartitionRegion(
final String PRPrefix, final int startIndexForRegion,
final int endIndexForRegion)
{
CacheSerializableRunnable validateAllPRs;
validateAllPRs = new CacheSerializableRunnable("validateAllPRs") {
String innerPRPrefix = PRPrefix;
int innerStartIndexForRegion = startIndexForRegion;
int innerEndIndexForRegion = endIndexForRegion;
public void run2() throws CacheException
{
Region rootRegion = getCache().getRegion(PartitionedRegionHelper.PR_ROOT_REGION_NAME);
assertNotNull(rootRegion);
assertEquals("PR root size is not correct", innerEndIndexForRegion,
rootRegion.size());
// Region allPR = rootRegion.getSubregion(PartitionedRegionHelper.PARTITIONED_REGION_CONFIG_NAME);
// assertNotNull(allPR);
// assertEquals("allPR size is not correct", innerEndIndexForRegion,
// allPR.size());
assertEquals("prIdToPR size is not correct", innerEndIndexForRegion,
PartitionedRegion.prIdToPR.size());
getCache().getLogger().info("validateMultiplePartitionRegion() - Partition Regions Successfully Validated ");
}
};
return validateAllPRs;
}
/**
* This function performs put() operations in multiple Partition Regions
*/
public CacheSerializableRunnable putInMultiplePartitionRegion(
final String PRPrefix, final int startIndexForKey,
final int endIndexForKey, final int startIndexNumOfRegions,
final int endIndexNumOfRegions)
{
CacheSerializableRunnable putInPRs = new CacheSerializableRunnable(
"doPutOperations") {
String innerPRPrefix = PRPrefix;
int innerStartIndexForKey = startIndexForKey;
int innerEndIndexForKey = endIndexForKey;
int innerStartIndexNumOfRegions = startIndexNumOfRegions;
int innerEndIndexNumOfRegions = endIndexNumOfRegions;
public void run2() throws CacheException
{
for (int j = innerStartIndexNumOfRegions; j < innerEndIndexNumOfRegions; j++) {
Region pr = getCache().getRegion(Region.SEPARATOR + innerPRPrefix + j);
assertNotNull(pr);
for (int k = innerStartIndexForKey; k < innerEndIndexForKey; k++) {
pr.put(j + innerPRPrefix + k, innerPRPrefix + k);
}
getCache().getLogger().info("putInMultiplePartitionRegion() - Put() done Successfully in Partition Region "+ pr.getName());
}
}
};
return putInPRs;
}
/**
* This function performs get() operations in multiple Partitions Regions and
* checks return values
*/
public CacheSerializableRunnable getInMultiplePartitionRegion(
final String PRPrefix, final int startIndexForKey,
final int endIndexForKey, final int startIndexNumOfRegions,
final int endIndexNumOfRegions)
{
CacheSerializableRunnable getInPRs = new CacheSerializableRunnable(
"doGetOperations") {
String innerPRPrefix = PRPrefix;
int innerStartIndexForKey = startIndexForKey;
int innerEndIndexForKey = endIndexForKey;
int innerStartIndexNumOfRegions = startIndexNumOfRegions;
int innerEndIndexNumOfRegions = endIndexNumOfRegions;
public void run2() throws CacheException
{
for (int j = innerStartIndexNumOfRegions; j < innerEndIndexNumOfRegions; j++) {
Region pr = getCache().getRegion(Region.SEPARATOR + innerPRPrefix + j);
assertNotNull(pr);
for (int k = innerStartIndexForKey; k < innerEndIndexForKey; k++) {
Object Obj = pr.get(j + innerPRPrefix + k);
assertNotNull(Obj);
assertEquals("Values are not equal", Obj,
(innerPRPrefix + k));
}
getCache().getLogger().info("putInMultiplePartitionRegion() - Get() done Successfully in Partition Region "+ pr.getName());
}
}
};
return getInPRs;
}
/**
* This function performs put() operations in multiple Partition Regions after
* the region is destroyed.
*/
public CacheSerializableRunnable putAfterDestroyInMultiplePartitionedRegion(
final String PRPrefix, final int startIndexForKey,
final int endIndexForKey, final int startIndexNumOfRegions,
final int endIndexNumOfRegions)
{
CacheSerializableRunnable putInPRs = new CacheSerializableRunnable(
"doPutAfterDestroyOperations") {
String innerPRPrefix = PRPrefix;
int innerStartIndexForKey = startIndexForKey;
int innerEndIndexForKey = endIndexForKey;
int innerStartIndexNumOfRegions = startIndexNumOfRegions;
int innerEndIndexNumOfRegions = endIndexNumOfRegions;
public void run2() throws CacheException
{
for (int j = innerStartIndexNumOfRegions; j < innerEndIndexNumOfRegions; j++) {
Region pr = getCache().getRegion(Region.SEPARATOR + innerPRPrefix + j);
for (int k = innerStartIndexForKey; k < innerEndIndexForKey; k++) {
try {
pr.put(j + innerPRPrefix + k, innerPRPrefix + k);
fail("You can not put after the region is destroyed ");
}
catch (RegionDestroyedException e) {
// do nothing It's a valid exception
}
}
}
}
};
return putInPRs;
}
/**
* this function performs get() operations for the removed and destroyed
* entries
*/
public CacheSerializableRunnable getRemovedOrDestroyedInMultiplePartitionRegion(
final String PRPrefix, final int startIndexForKey,
final int endIndexForKey, final int startIndexNumOfRegions,
final int endIndexNumOfRegions, final int afterPutFlag)
{
CacheSerializableRunnable getInPRs = new CacheSerializableRunnable(
"doDetroyedGetOperations") {
String innerPRPrefix = PRPrefix;
int innerStartIndexForKey = startIndexForKey;
int innerEndIndexForKey = endIndexForKey;
int innerStartIndexNumOfRegions = startIndexNumOfRegions;
int innerEndIndexNumOfRegions = endIndexNumOfRegions;
int innerAfterPutFlag = afterPutFlag;
public void run2() throws CacheException
{
for (int j = innerStartIndexNumOfRegions; j < innerEndIndexNumOfRegions; j++) {
Region pr = getCache().getRegion(Region.SEPARATOR + innerPRPrefix + j);
assertNotNull(pr);
for (int k = innerStartIndexForKey; k < innerEndIndexForKey; k++) {
Object Obj = pr.get(j + innerPRPrefix + k);
if (innerAfterPutFlag == 0)
assertNull(Obj);
else
assertNotNull(Obj);
}
getCache().getLogger().info("getRmovedOrDestroyedInMultiplePartitionRegion() - Get() of Destroy Keys done Successfully in Partition Region " + pr.getName());
}
}
};
return getInPRs;
}
/** this functions destroys regions in a node */
public CacheSerializableRunnable destroyRegionInMultiplePartitionRegion(
final String PRPrefix, final int startIndexForRegion,
final int endIndexForRegion)
{
CacheSerializableRunnable getInPRs = new CacheSerializableRunnable(
"destroyRegionInMultiplePartitionRegion") {
String innerPRPrefix = PRPrefix;
int innerStartIndexForRegion = startIndexForRegion;
int innerEndIndexForRegion = endIndexForRegion;
public void run2() throws CacheException
{
for (int j = innerStartIndexForRegion; j < innerEndIndexForRegion; j++) {
Region pr = getCache().getRegion(Region.SEPARATOR + innerPRPrefix + j);
assertNotNull(pr);
getCache().getLogger().info("region going to destroy is : " + pr);
pr.destroyRegion();
}
}
};
return getInPRs;
}
/**
* This function performs destroy() operations in multiple partitions for
* destroying key-value pair so that entry corresponding to that key becomes
* null
*/
public CacheSerializableRunnable destroyInMultiplePartitionRegion(
final String PRPrefix, final int startIndexForKey,
final int endIndexForKey, final int startIndexNumOfRegions,
final int endIndexNumOfRegions)
{
CacheSerializableRunnable destroyInPRs = new CacheSerializableRunnable(
"doDestroyKeyOperations") {
String innerPRPrefix = PRPrefix;
int innerStartIndexForKey = startIndexForKey;
int innerEndIndexForKey = endIndexForKey;
int innerStartIndexNumOfRegions = startIndexNumOfRegions;
int innerEndIndexNumOfRegions = endIndexNumOfRegions;
public void run2() throws CacheException
{
for (int j = innerStartIndexNumOfRegions; j < innerEndIndexNumOfRegions; j++) {
Region pr = getCache().getRegion(Region.SEPARATOR + innerPRPrefix + j);
assertNotNull(pr);
for (int k = startIndexForKey; k < endIndexForKey; k++) {
try {
pr.destroy(j + innerPRPrefix + k);
}
catch (Exception e) {
fail("destroyInMultiplePartitionRegion()- Entry not found in the Partition region "
+ pr.getName());
}
}
getCache().getLogger().info("destroyInMultiplePartitionRegion() - destroy() done Successfully in Partition Region "+ pr.getName());
}
}
};
return destroyInPRs;
}
/**
* This function performs invalidate() operation in multiple partition
* regions.
*/
public CacheSerializableRunnable invalidatesInMultiplePartitionRegion(
final String PRPrefix, final int startIndexForKey,
final int endIndexForKey, final int startIndexNumOfRegions,
final int endIndexNumOfRegions)
{
CacheSerializableRunnable invalidateInPRs = new CacheSerializableRunnable(
"doInvalidateKeyOperations") {
String innerPRPrefix = PRPrefix;
int innerStartIndexForKey = startIndexForKey;
int innerEndIndexForKey = endIndexForKey;
int innerStartIndexNumOfRegions = startIndexNumOfRegions;
int innerEndIndexNumOfRegions = endIndexNumOfRegions;
public void run2() throws CacheException
{
for (int j = innerStartIndexNumOfRegions; j < innerEndIndexNumOfRegions; j++) {
Region pr = getCache().getRegion(Region.SEPARATOR + innerPRPrefix + j);
assertNotNull(pr);
for (int k = startIndexForKey; k < endIndexForKey; k++) {
try {
pr.invalidate(j + innerPRPrefix + k);
}
catch (Exception e) {
fail("invalidateInMultiplePartitionRegion()- Entry not found in the Partition region "
+ pr.getName());
}
}
getCache().getLogger().info("invalidateInMultiplePartitionRegion() - invalidate() done Successfully in Partition Region "+ pr.getName());
}
}
};
return invalidateInPRs;
}
public CacheSerializableRunnable disconnectVM()
{
CacheSerializableRunnable csr = new CacheSerializableRunnable(
"disconnectVM") {
public void run2() throws CacheException
{
getCache();
// DistributedMember dsMember = ((InternalDistributedSystem)getCache()
// .getDistributedSystem()).getDistributionManager().getId();
getCache().getDistributedSystem().disconnect();
getCache().getLogger().info("disconnectVM() completed ..");
}
};
return csr;
}
}