blob: ab40a4a33a45b43910f7984376dacafa1d77a98c [file] [log] [blame]
/*=========================================================================
* Copyright (c) 2010-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
* one or more patents listed at http://www.pivotal.io/patents.
*=========================================================================
*/
package com.gemstone.gemfire.internal.cache;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Random;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import static org.junit.Assert.*;
import com.gemstone.gemfire.cache.CacheFactory;
import com.gemstone.gemfire.cache.EntryDestroyedException;
import com.gemstone.gemfire.cache.EntryNotFoundException;
import com.gemstone.gemfire.cache.Region;
import com.gemstone.gemfire.cache.Scope;
import com.gemstone.gemfire.internal.cache.LocalRegion;
import com.gemstone.gemfire.internal.cache.versions.VersionTag;
import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
/**
*
* @author Asif
*
*/
@Category(IntegrationTest.class)
public class DiskRandomOperationsAndRecoveryJUnitTest extends DiskRegionTestingBase
{
DiskRegionProperties diskProps = new DiskRegionProperties();
private static int ENTRY_SIZE = 1024;
final static byte[] valueBytes = new byte[ENTRY_SIZE];
static {
Arrays.fill(valueBytes, (byte)32);
}
final static private Object value = new String(valueBytes);
// private static final boolean debug = false;
private static int testId=0;
@Before
public void setUp() throws Exception
{
super.setUp();
diskProps.setDiskDirs(dirs);
testId++;
}
@After
public void tearDown() throws Exception
{
super.tearDown();
}
private final static int ITERATIONS = 4;
private final static long MAX_OPLOG_SIZE_IN_BYTES = 1024*16;
/**
* Need to limit he max open oplogs so that we don't run out of file descriptors
*/
private final static int MAX_OPEN_OPLOGS = 400;
private final static long RECORDS_PER_OPLOG = MAX_OPLOG_SIZE_IN_BYTES / (ENTRY_SIZE + 24/*for key and record overhead*/);
/**
* Maximum number of ops a test can do w/o running out of file descriptors
* due to open oplogs
*/
private final static long OPS_PER_TEST = RECORDS_PER_OPLOG * MAX_OPEN_OPLOGS;
private final static long OPS_PER_ITERATION = OPS_PER_TEST / ITERATIONS;
@Test
public void testRollingDisabledRecoverValuesFalsePersistOnly() throws Exception {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "false");
try {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRollingDisabledRecoverValuesFalsePersistOnly");
diskProps.setMaxOplogSize(MAX_OPLOG_SIZE_IN_BYTES);
diskProps.setRolling(false);
int previousRegionSize = 0;
HashMap<String, VersionTag> tagmapInCache = null;
//Num time start / close cycles
for(int i =0; i < ITERATIONS; ++i) {
long t1 = System.currentTimeMillis();
region = DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
long t2 = System.currentTimeMillis();
System.out.println("Time taken to recover = "+ (t2-t1) + " for total number of entries= "+ region.size() + " with recover values as false and rolling disabled ");
if ((t2-t1) > 0) {
System.out.println("Recovery rate is= "+ region.size()/ (t2-t1) + " per milliseconds");
}
int startKey =this.processRegionData();
assertEquals(previousRegionSize,region.size());
HashMap<String, VersionTag> tagmapFromRecover = saveVersionTags((LocalRegion)region);
if (tagmapInCache!=null) {
compareVersionTags(tagmapInCache, tagmapFromRecover);
}
int thisRegionSize = startOperations(startKey, value);
previousRegionSize = thisRegionSize;
tagmapInCache = saveVersionTags((LocalRegion)region);
region.close();
}
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
}
}
@Test
public void testRollingDisabledRecoverValuesTruePersistOnly() throws Exception {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "true");
try {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRollingDisabledRecoverValuesTruePersistOnly");
diskProps.setMaxOplogSize(MAX_OPLOG_SIZE_IN_BYTES);
diskProps.setRolling(false);
int previousRegionSize = 0;
HashMap<String, VersionTag> tagmapInCache = null;
//Num time start / close cycles
for(int i =0; i < ITERATIONS; ++i) {
long t1 = System.currentTimeMillis();
region = DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
long t2 = System.currentTimeMillis();
System.out.println("Time taken to recover = "+ (t2-t1) + " for total number of entries= "+ region.size() + " with recover values as false and rolling disabled ");
if ((t2-t1) > 0) {
System.out.println("Recovery rate is= "+ region.size()/ (t2-t1) + " per milliseconds");
}
int startKey =this.processRegionData();
assertEquals(previousRegionSize,region.size());
HashMap<String, VersionTag> tagmapFromRecover = saveVersionTags((LocalRegion)region);
if (tagmapInCache!=null) {
compareVersionTags(tagmapInCache, tagmapFromRecover);
}
int thisRegionSize = startOperations(startKey, value);
previousRegionSize = thisRegionSize;
tagmapInCache = saveVersionTags((LocalRegion)region);
region.close();
}
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
}
}
//////////////////////////////////////////////////////////////Set 1 Begin //////////////////
@Test
public void testRollingEnabledRecoverValuesFalsePersistOnlyWithEarlyTerminationOfRoller() throws Exception {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "false");
// System.setProperty(DiskRegion.CHECK_ENTRY_BALANCE_PROPERTY_NAME, "true");
try {
this.rollingEnabledRecoverValuesFalsePersistOnly();
}finally {
// System.setProperty(DiskRegion.CHECK_ENTRY_BALANCE_PROPERTY_NAME, "false");
}
}
@Test
public void testRollingEnabledRecoverValuesFalsePersistOnlyWithRollerTerminationComplete() throws Exception {
try {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "true");
//System.setProperty(DiskRegion.ASSERT_ON_RECOVERY_PROPERTY_NAME, "true");
this.rollingEnabledRecoverValuesFalsePersistOnly();
}finally {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "false");
//System.setProperty(DiskRegion.ASSERT_ON_RECOVERY_PROPERTY_NAME, "false");
}
}
private void rollingEnabledRecoverValuesFalsePersistOnly() throws Exception {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "false");
try {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRollingEnabledRecoverValuesFalsePersistOnly");
diskProps.setMaxOplogSize(MAX_OPLOG_SIZE_IN_BYTES);
diskProps.setRolling(true);
int previousRegionSize = 0;
HashMap<String, VersionTag> tagmapInCache = null;
//Num time start / close cycles
for(int i =0; i < ITERATIONS; ++i) {
long t1 = System.currentTimeMillis();
region = DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
long t2 = System.currentTimeMillis();
System.out.println("Time taken to recover = "+ (t2-t1) + " for total number of entries= "+ region.size() + " with recover values as false and rolling disabled ");
if ((t2-t1) > 0) {
System.out.println("Recovery rate is= "+ region.size()/ (t2-t1) + " per milliseconds");
}
int startKey =this.processRegionData();
assertEquals(previousRegionSize,region.size());
HashMap<String, VersionTag> tagmapFromRecover = saveVersionTags((LocalRegion)region);
if (tagmapInCache!=null) {
compareVersionTags(tagmapInCache, tagmapFromRecover);
}
int thisRegionSize = startOperations(startKey, value);
previousRegionSize = thisRegionSize;
tagmapInCache = saveVersionTags((LocalRegion)region);
region.close();
}
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
}
}
//////////////////////////////////////////////////////////////Set 1 END //////////////////
//////////////////////////////////////////////////////////////Set 2 Begin //////////////////
@Test
public void testRollingEnabledRecoverValuesTruePersistOnlyWithEarlyTerminationOfRoller() throws Exception {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "false");
// System.setProperty(DiskRegion.CHECK_ENTRY_BALANCE_PROPERTY_NAME, "true");
try {
this.rollingEnabledRecoverValuesTruePersistOnly();
}finally {
// System.setProperty(DiskRegion.CHECK_ENTRY_BALANCE_PROPERTY_NAME, "false");
}
}
@Test
public void testRollingEnabledRecoverValuesTruePersistOnlyWithRollerTerminationComplete() throws Exception {
try {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "true");
//System.setProperty(DiskRegion.ASSERT_ON_RECOVERY_PROPERTY_NAME, "true");
this.rollingEnabledRecoverValuesTruePersistOnly();
}finally {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "false");
//System.setProperty(DiskRegion.ASSERT_ON_RECOVERY_PROPERTY_NAME, "false");
}
}
private void rollingEnabledRecoverValuesTruePersistOnly() throws Exception {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "true");
try {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRollingEnabledRecoverValuesTruePersistOnly");
diskProps.setMaxOplogSize(MAX_OPLOG_SIZE_IN_BYTES);
diskProps.setRolling(true);
int previousRegionSize = 0;
HashMap<String, VersionTag> tagmapInCache = null;
//Num time start / close cycles
for(int i =0; i < ITERATIONS; ++i) {
long t1 = System.currentTimeMillis();
region = DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
long t2 = System.currentTimeMillis();
System.out.println("Time taken to recover = "+ (t2-t1) + " for total number of entries= "+ region.size() + " with recover values as false and rolling disabled ");
if ((t2-t1) > 0) {
System.out.println("Recovery rate is= "+ region.size()/ (t2-t1) + " per milliseconds");
}
int startKey =this.processRegionData();
assertEquals(previousRegionSize,region.size());
HashMap<String, VersionTag> tagmapFromRecover = saveVersionTags((LocalRegion)region);
if (tagmapInCache!=null) {
compareVersionTags(tagmapInCache, tagmapFromRecover);
}
int thisRegionSize = startOperations(startKey, value);
previousRegionSize = thisRegionSize;
tagmapInCache = saveVersionTags((LocalRegion)region);
region.close();
}
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
}
}
//////////////////////////////////////////////////////////////Set 2 end //////////////////
@Test
public void testRollingDisabledRecoverValuesFalsePersistWithOverFlow() throws Exception {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "false");
try {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRollingDisabledRecoverValuesFalsePersistWithOverFlow");
diskProps.setMaxOplogSize(MAX_OPLOG_SIZE_IN_BYTES);
diskProps.setRolling(false);
diskProps.setOverFlowCapacity(100);
int previousRegionSize = 0;
HashMap<String, VersionTag> tagmapInCache = null;
//Num time start / close cycles
for(int i =0; i < ITERATIONS; ++i) {
long t1 = System.currentTimeMillis();
region = DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
long t2 = System.currentTimeMillis();
System.out.println("Time taken to recover = "+ (t2-t1) + " for total number of entries= "+ region.size() + " with recover values as false and rolling disabled ");
if ((t2-t1) > 0) {
System.out.println("Recovery rate is= "+ region.size()/ (t2-t1) + " per milliseconds");
}
int startKey =this.processRegionData();
assertEquals(previousRegionSize,region.size());
HashMap<String, VersionTag> tagmapFromRecover = saveVersionTags((LocalRegion)region);
if (tagmapInCache!=null) {
compareVersionTags(tagmapInCache, tagmapFromRecover);
}
int thisRegionSize = startOperations(startKey, value);
previousRegionSize = thisRegionSize;
tagmapInCache = saveVersionTags((LocalRegion)region);
region.close();
}
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
}
}
@Test
public void testRollingDisabledRecoverValuesTruePersistWithOverFlow() throws Exception {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "true");
try {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRollingDisabledRecoverValuesTruePersistWithOverFlow");
diskProps.setMaxOplogSize(MAX_OPLOG_SIZE_IN_BYTES);
diskProps.setRolling(false);
diskProps.setOverFlowCapacity(100);
int previousRegionSize = 0;
HashMap<String, VersionTag> tagmapInCache = null;
//Num time start / close cycles
for(int i =0; i < ITERATIONS; ++i) {
long t1 = System.currentTimeMillis();
region = DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
long t2 = System.currentTimeMillis();
System.out.println("Time taken to recover = "+ (t2-t1) + " for total number of entries= "+ region.size() + " with recover values as false and rolling disabled ");
if ((t2-t1) > 0) {
System.out.println("Recovery rate is= "+ region.size()/ (t2-t1) + " per milliseconds");
}
int startKey =this.processRegionData();
assertEquals(previousRegionSize,region.size());
HashMap<String, VersionTag> tagmapFromRecover = saveVersionTags((LocalRegion)region);
if (tagmapInCache!=null) {
compareVersionTags(tagmapInCache, tagmapFromRecover);
}
int thisRegionSize = startOperations(startKey, value);
previousRegionSize = thisRegionSize;
tagmapInCache = saveVersionTags((LocalRegion)region);
region.close();
}
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
}
}
///////////////////////////////////////Set 3 Begin /////////////////
@Test
public void testRollingEnabledRecoverValuesFalsePersistWithOverFlowWithEarlyTerminationOfRoller() throws Exception {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "false");
// System.setProperty(DiskRegion.CHECK_ENTRY_BALANCE_PROPERTY_NAME, "true");
try {
this.rollingEnabledRecoverValuesFalsePersistWithOverFlow();
}finally {
// System.setProperty(DiskRegion.CHECK_ENTRY_BALANCE_PROPERTY_NAME, "false");
}
}
@Test
public void testRollingEnabledRecoverValuesFalsePersistWithOverFlowWithRollerTerminatingAfterCompletion() throws Exception {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "true");
//System.setProperty(DiskRegion.ASSERT_ON_RECOVERY_PROPERTY_NAME, "true");
try {
this.rollingEnabledRecoverValuesFalsePersistWithOverFlow();
}finally {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "false");
//System.setProperty(DiskRegion.ASSERT_ON_RECOVERY_PROPERTY_NAME, "false");
}
}
private void rollingEnabledRecoverValuesFalsePersistWithOverFlow() throws Exception {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "false");
try {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRollingDisabledRecoverValuesFalsePersistWithOverFlow");
diskProps.setMaxOplogSize(MAX_OPLOG_SIZE_IN_BYTES);
diskProps.setRolling(true);
diskProps.setOverFlowCapacity(100);
int previousRegionSize = 0;
HashMap<String, VersionTag> tagmapInCache = null;
//Num time start / close cycles
for(int i =0; i < ITERATIONS; ++i) {
long t1 = System.currentTimeMillis();
region = DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
long t2 = System.currentTimeMillis();
System.out.println("Time taken to recover = "+ (t2-t1) + " for total number of entries= "+ region.size() + " with recover values as false and rolling disabled.");
if ((t2-t1) > 0) {
System.out.println("Recovery rate is= "+ region.size()/ (t2-t1) + " per milliseconds");
}
int startKey =this.processRegionData();
assertEquals(previousRegionSize,region.size());
HashMap<String, VersionTag> tagmapFromRecover = saveVersionTags((LocalRegion)region);
if (tagmapInCache!=null) {
compareVersionTags(tagmapInCache, tagmapFromRecover);
}
int thisRegionSize = startOperations(startKey, value);
previousRegionSize = thisRegionSize;
tagmapInCache = saveVersionTags((LocalRegion)region);
region.close();
}
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
}
}
///////////////////////////////////////Set 3 End /////////////////
//////////////////////////////////////////Set 4 begin/////////////////
@Test
public void testRollingEnabledRecoverValuesTruePersistWithOverFlowWithEarlyTerminationOfRoller() throws Exception {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "false");
// System.setProperty(DiskRegion.CHECK_ENTRY_BALANCE_PROPERTY_NAME, "true");
try {
this.rollingEnabledRecoverValuesTruePersistWithOverFlow();
}finally {
// System.setProperty(DiskRegion.CHECK_ENTRY_BALANCE_PROPERTY_NAME, "false");
}
}
@Test
public void testRollingEnabledRecoverValuesTruePersistWithOverFlowWithRollerTerminatingAfterCompletion() throws Exception {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "true");
//System.setProperty(DiskRegion.ASSERT_ON_RECOVERY_PROPERTY_NAME, "true");
try {
this.rollingEnabledRecoverValuesTruePersistWithOverFlow();
}finally {
System.setProperty(DiskStoreImpl.COMPLETE_COMPACTION_BEFORE_TERMINATION_PROPERTY_NAME, "false");
//System.setProperty(DiskRegion.ASSERT_ON_RECOVERY_PROPERTY_NAME, "false");
}
}
private void rollingEnabledRecoverValuesTruePersistWithOverFlow() throws Exception {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "true");
try {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRollingDisabledRecoverValuesTruePersistWithOverFlow");
diskProps.setMaxOplogSize(MAX_OPLOG_SIZE_IN_BYTES);
diskProps.setRolling(true);
diskProps.setOverFlowCapacity(100);
int previousRegionSize = 0;
HashMap<String, VersionTag> tagmapInCache = null;
//Num time start / close cycles
for(int i =0; i < ITERATIONS; ++i) {
long t1 = System.currentTimeMillis();
region = DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
long t2 = System.currentTimeMillis();
System.out.println("Time taken to recover = "+ (t2-t1) + " for total number of entries= "+ region.size() + " with recover values as false and rolling disabled ");
if ((t2-t1) > 0) {
System.out.println("Recovery rate is= "+ region.size()/ (t2-t1) + " per milliseconds");
}
int startKey =this.processRegionData();
assertEquals(previousRegionSize,region.size());
HashMap<String, VersionTag> tagmapFromRecover = saveVersionTags((LocalRegion)region);
if (tagmapInCache!=null) {
compareVersionTags(tagmapInCache, tagmapFromRecover);
}
int thisRegionSize = startOperations(startKey, value);
previousRegionSize = thisRegionSize;
tagmapInCache = saveVersionTags((LocalRegion)region);
region.close();
}
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
}
}
//////////////////////////////////////////Set 4 end/////////////////
@Test
public void testRollingDisabledRecoverValuesFalseWithNotifyToRollAPICall() throws Exception {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRollingDisabledRecoverValuesFalseWithNotifyToRoll");
diskProps.setMaxOplogSize(MAX_OPLOG_SIZE_IN_BYTES);
diskProps.setRolling(false);
int previousRegionSize = 0;
HashMap<String, VersionTag> tagmapInCache = null;
final boolean[] run = new boolean[] {true};
//Num time start / close cycles
for(int i =0; i < ITERATIONS; ++i) {
region = DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
int startKey =this.processRegionData();
assertEquals(previousRegionSize,region.size());
HashMap<String, VersionTag> tagmapFromRecover = saveVersionTags((LocalRegion)region);
if (tagmapInCache!=null) {
compareVersionTags(tagmapInCache, tagmapFromRecover);
}
Thread th = new Thread(new Runnable() {
public void run() {
while(run[0]) {
try {
Thread.sleep(1*1000);
}catch(InterruptedException ie) {
ie.printStackTrace();
}
((LocalRegion)region).notifyToRoll();
}
}
});
int thisRegionSize = startOperations(startKey, value);
previousRegionSize = thisRegionSize;
run[0] = false;
th.join();
tagmapInCache = saveVersionTags((LocalRegion)region);
region.close();
}
}
public int processRegionData() throws Exception
{
System.out.println("Total entries in region at start = " + region.size());
int startKey = 0;
Iterator entryItr = region.entrySet().iterator();
startKey = 0;
while (entryItr.hasNext()) {
Region.Entry entry = (Region.Entry)entryItr.next();
String key = (String)entry.getKey();
int indx = key.lastIndexOf('_');
int temp = Integer.parseInt(key.substring(indx + 1));
if (temp > startKey) {
startKey = temp;
}
if (entry.getValue() instanceof String) {
String val = (String)entry.getValue();
if (!val.equals(value)) {
throw new IllegalStateException("Values do not match");
}
} else if (entry.getValue() instanceof byte[]) {
byte[] val = (byte[])entry.getValue();
// System.out.println("Entry " + key + " had a byte array of size " + val.length
// + " whose first byte was " + val[0]);
assertEquals(((byte[])value).length, val.length);
for (int i=0; i < val.length; i++) {
assertEquals("at offset " + i,
((byte[])value)[i], val[i]);
}
} else {
assertEquals(value, entry.getValue());
}
}
return ++startKey;
}
/**
* Disk region recovery test for Persist only with sync writes. Test has four
* steps : STEP 1: Create cache. Create Region. Put entries. Close cache. STEP
* 2: Create cache. Create Region with the same name as that of in STEP 1.
* Delete some entries. 3) Recreate the deleted entries Close the Cache * 3:
* Again Create cache. 4) check if the region creation is successful
*
* @author Asif
*/
public int startOperations( final int startKey, final Object value)
throws Exception {
final int NUM_THREADS = 5;
final long OPS_PER_THREAD = OPS_PER_ITERATION / NUM_THREADS;
Thread operations[] = new Thread[NUM_THREADS];
System.out.println("Starting " + NUM_THREADS
+ " threads to do each do " + OPS_PER_THREAD
+ " operations");
for (int i = 0; i < NUM_THREADS; ++i) {
operations[i] = new Operation(i, region, value, startKey, OPS_PER_THREAD);
}
for (int i = 0; i < NUM_THREADS; ++i) {
operations[i].start();
}
// synchronized(this) {
// this.wait(operationTimeInSec*1000);
// }
// for (int i = 0; i < NUM_THREADS; ++i) {
// ((Operation)operations[i]).signalHalt();
// }
for (int i = 0; i < NUM_THREADS; ++i) {
operations[i].join();
}
int regionSize = region.size();
System.out.println("Total Region Size at end = " + region.size());
return regionSize;
}
class Operation extends Thread
{
final int id;
volatile boolean run = true;
int createKeyID = 1;
final Region rgn;
Object value;
volatile int totalEntries = 0;
final long maxOpCount;
public Operation(int id, Region rgn, Object value, int startKey, long maxOpCount) {
this.id = id;
this.rgn = rgn;
this.value = value;
this.createKeyID = startKey;
this.maxOpCount = maxOpCount;
}
// public void signalHalt()
// {
// this.run = false;
// }
public void run()
{
Random opRandom = new Random();
Random keyRandom = new Random();
long opCount = 0;
while (opCount < this.maxOpCount) {
int optype = opRandom.nextInt(3);
switch (optype) {
case 0:
this.rgn.create(testId + "_" + id + "_" + createKeyID, value);
opCount++;
++createKeyID;
++totalEntries;
break;
case 1: {
int key = keyRandom.nextInt(createKeyID);
try {
this.rgn.put(testId + "_" + id + "_" + key, value);
opCount++;
}
catch (EntryNotFoundException enfe) {
}
catch (EntryDestroyedException ede) {
}
}
break;
case 2: {
int key = keyRandom.nextInt(createKeyID);
try {
this.rgn.destroy(testId + "_" + id + "_" + key);
// don't count these as ops; they are tiny
--totalEntries;
}
catch (EntryNotFoundException enfe) {
}
catch (EntryDestroyedException ede) {
}
}
break;
default:
throw new IllegalStateException();
}
}
}
}
}