blob: 526e31644c221e64b247718ce2a6353d5b2d5f90 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.internal.cache;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import java.util.concurrent.CountDownLatch;
import org.junit.Test;
import org.apache.geode.cache.EntryNotFoundException;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.Scope;
/**
* Disk LRU region recovery tests.
*/
public class DiskLruRegRecoveryJUnitTest extends DiskRegionTestingBase {
@Override
protected final void postTearDown() throws Exception {
DiskStoreObserver.setInstance(null);
}
private int getValuesInVM(Region region, int size) {
int valuesInVm = 0;
for (int i = 0; i < size; i++) {
try {
Object value = ((LocalRegion) region).getValueInVM(new Integer(i));
if (value != null) {
valuesInVm++;
}
} catch (EntryNotFoundException e) {
fail("Entry not found not expected but occurred ");
}
}
return valuesInVm;
}
private Region createNonLruRegion() {
DiskRegionProperties nonLruDiskProps = new DiskRegionProperties();
nonLruDiskProps.setDiskDirs(dirs);
nonLruDiskProps.setPersistBackup(true);
nonLruDiskProps.setRegionName("RecoveryTestNonLruRegion");
return DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, nonLruDiskProps, Scope.LOCAL);
}
private void createRegionAndIntiateRecovery(boolean lruEntryEviction,
boolean recoveryByCacheClose, boolean addNonLruRegion, int load, int expectedValues) {
DiskRegionProperties diskProps = new DiskRegionProperties();
Region nonLruRegion = null;
int numRegions = 1;
diskProps.setDiskDirs(dirs);
diskProps.setPersistBackup(true);
diskProps.setRegionName("RecoveryTestRegion");
if (lruEntryEviction) {
int overflowCapacity = 5;
diskProps.setOverFlowCapacity(overflowCapacity);
region = DiskRegionHelperFactory.getSyncOverFlowAndPersistRegion(cache, diskProps);
} else {
region = DiskRegionHelperFactory.getSyncHeapLruAndPersistRegion(cache, diskProps);
}
if (addNonLruRegion) {
numRegions++;
nonLruRegion = createNonLruRegion();
}
for (int i = 0; i < load; i++) {
region.put(new Integer(i), new Integer(i));
if (nonLruRegion != null) {
nonLruRegion.put(new Integer(i), new Integer(i));
}
}
if (recoveryByCacheClose) {
cache.close();
cache = createCache();
} else {
region.close();
if (nonLruRegion != null) {
nonLruRegion.close();
}
}
// Regions are created with its own disk store.
final CountDownLatch recoveryDone = new CountDownLatch(numRegions);
DiskStoreObserver.setInstance(new DiskStoreObserver() {
@Override
public void afterAsyncValueRecovery(DiskStoreImpl store) {
recoveryDone.countDown();
}
});
if (lruEntryEviction) {
region = DiskRegionHelperFactory.getSyncOverFlowAndPersistRegion(cache, diskProps);
} else {
region = DiskRegionHelperFactory.getSyncHeapLruAndPersistRegion(cache, diskProps);
}
if (addNonLruRegion) {
nonLruRegion = createNonLruRegion();
}
// Wait for recovery to finish.
try {
recoveryDone.await();
} catch (InterruptedException ie) {
fail("Found interrupted exception while waiting for recovery.");
}
int valuesInVm = getValuesInVM(region, load);
assertEquals("Values for lru regions should not be recovered from Disk.", expectedValues,
valuesInVm);
if (nonLruRegion != null) {
valuesInVm = getValuesInVM(nonLruRegion, load);
// The values should be recovered for non LRU regions.
assertEquals("Values for non lru regions are not recovered from Disk.", load, valuesInVm);
}
}
@Test
public void testValuesAreNotRecoveredForLruRegionWithCacheClose() {
createRegionAndIntiateRecovery(true, true, false, 10, 0);
}
@Test
public void testValuesAreNotRecoveredForLruRegionWithRegionClose() {
createRegionAndIntiateRecovery(true, false, false, 10, 0);
}
@Test
public void testValuesAreNotRecoveredForLruAndRecoveredForNonLru() {
createRegionAndIntiateRecovery(true, true, true, 10, 0);
}
@Test
public void testValuesAreNotRecoveredForLruAndRecoveredForNonLruWithRegionClose() {
createRegionAndIntiateRecovery(true, false, true, 10, 0);
}
@Test
public void testValuesAreNotRecoveredForHeapLruRegion() {
createRegionAndIntiateRecovery(false, true, true, 10, 0);
}
@Test
public void testValuesAreNotRecoveredForHeapLruRegionWithRegionClose() {
createRegionAndIntiateRecovery(false, false, true, 10, 0);
}
@Test
public void testValuesAreNotRecoveredForLruRegionWithReocoverValuePropertySet() {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "true");
try {
createRegionAndIntiateRecovery(true, true, true, 10, 0);
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
}
}
@Test
public void testValuesAreNotRecoveredForLruRegionWithReocoverValuePropertySetWithRegionClose() {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "true");
try {
createRegionAndIntiateRecovery(true, false, true, 10, 0);
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
}
}
@Test
public void testValuesAreRecoveredForLruRegionWithReocoverValueAndRecoverLruPropertySet() {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "true");
String lruOldValue = System.getProperty(DiskStoreImpl.RECOVER_LRU_VALUES_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_LRU_VALUES_PROPERTY_NAME, "true");
try {
createRegionAndIntiateRecovery(false, true, true, 10, 10);
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
if (lruOldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_LRU_VALUES_PROPERTY_NAME, lruOldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_LRU_VALUES_PROPERTY_NAME);
}
}
}
@Test
public void testValuesAreRecoveredForLruRegionWithReocoverValueAndRecoverLruPropertySetWithRegionClose() {
String oldValue = System.getProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, "true");
String lruOldValue = System.getProperty(DiskStoreImpl.RECOVER_LRU_VALUES_PROPERTY_NAME);
System.setProperty(DiskStoreImpl.RECOVER_LRU_VALUES_PROPERTY_NAME, "true");
try {
createRegionAndIntiateRecovery(false, false, true, 10, 10);
} finally {
if (oldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME, oldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_VALUE_PROPERTY_NAME);
}
if (lruOldValue != null) {
System.setProperty(DiskStoreImpl.RECOVER_LRU_VALUES_PROPERTY_NAME, lruOldValue);
} else {
System.clearProperty(DiskStoreImpl.RECOVER_LRU_VALUES_PROPERTY_NAME);
}
}
}
@Test
public void testBasicVerifyStats() {
DiskRegionProperties diskProps = new DiskRegionProperties();
final Integer key = 1;
diskProps.setDiskDirs(dirs);
diskProps.setPersistBackup(true);
diskProps.setRegionName("basicVerifyStats");
region = DiskRegionHelperFactory.getSyncOverFlowAndPersistRegion(cache, diskProps);
region.put(key, new Integer(1));
region.put(key, new Integer(2));
region.close();
final CountDownLatch recoveryDone = new CountDownLatch(1);
DiskStoreObserver.setInstance(new DiskStoreObserver() {
@Override
public void afterAsyncValueRecovery(DiskStoreImpl store) {
recoveryDone.countDown();
}
});
region = DiskRegionHelperFactory.getSyncOverFlowAndPersistRegion(cache, diskProps);
// Wait for recovery to finish.
try {
recoveryDone.await();
} catch (InterruptedException ie) {
fail("Found interrupted exception while waiting for recovery.");
}
DiskRegion dr = ((LocalRegion) region).getDiskRegion();
assertEquals(0, dr.getNumEntriesInVM());
assertEquals(1, dr.getNumOverflowOnDisk());
region.get(key);
assertEquals(1, dr.getNumEntriesInVM());
assertEquals(0, dr.getNumOverflowOnDisk());
region.clear();
assertEquals(0, dr.getNumEntriesInVM());
assertEquals(0, dr.getNumOverflowOnDisk());
}
}