blob: cb6bef737c6b0fd76c685cdef45bd87635220e5d [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.File;
import java.util.Collections;
import java.util.HashSet;
import java.util.UUID;
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.DiskStore;
import com.gemstone.gemfire.cache.RegionShortcut;
import com.gemstone.gemfire.cache.Scope;
import com.gemstone.gemfire.internal.cache.TestUtils;
import com.gemstone.gemfire.internal.cache.persistence.DiskStoreID;
import com.gemstone.gemfire.internal.cache.persistence.PRPersistentConfig;
import com.gemstone.gemfire.internal.cache.persistence.PersistentMemberID;
import com.gemstone.gemfire.test.junit.categories.IntegrationTest;
/**
* Tests DiskRegion's IF file.
* @author darrel
*
*/
@Category(IntegrationTest.class)
public class DiskIFJUnitTest extends DiskRegionTestingBase
{
DiskRegionProperties diskProps = new DiskRegionProperties();
@Test
public void testEmptyIF() throws Exception {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testEmptyIF");
LocalRegion lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
DiskRegion dr = lr.getDiskRegion();
assertEquals(null, dr.getMyInitializingID());
PersistentMemberID myId = dr.getMyPersistentID();
assertNotNull(myId);
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
// do recovery
close(lr);
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(null, dr.getMyInitializingID());
assertEquals(myId, dr.getMyPersistentID());
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
dr.forceIFCompaction();
assertEquals(null, dr.getMyInitializingID());
assertEquals(myId, dr.getMyPersistentID());
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
// do recovery
close(lr);
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(null, dr.getMyInitializingID());
assertEquals(myId, dr.getMyPersistentID());
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
}
@Test
public void testMyPMID() throws Exception {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testMyPMID");
LocalRegion lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
DiskRegion dr = lr.getDiskRegion();
PersistentMemberID myId = createNewPMID();
assertEquals(null, dr.getMyInitializingID());
PersistentMemberID oldId = dr.getMyPersistentID();
dr.setInitializing(myId);
assertEquals(myId, dr.getMyInitializingID());
assertEquals(oldId, dr.getMyPersistentID());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(myId, dr.getMyInitializingID());
assertEquals(oldId, dr.getMyPersistentID());
dr.forceIFCompaction();
assertEquals(myId, dr.getMyInitializingID());
assertEquals(oldId, dr.getMyPersistentID());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(myId, dr.getMyInitializingID());
assertEquals(oldId, dr.getMyPersistentID());
dr.setInitialized();
assertEquals(null, dr.getMyInitializingID());
assertEquals(myId, dr.getMyPersistentID());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(null, dr.getMyInitializingID());
assertEquals(myId, dr.getMyPersistentID());
dr.forceIFCompaction();
assertEquals(null, dr.getMyInitializingID());
assertEquals(myId, dr.getMyPersistentID());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(null, dr.getMyInitializingID());
assertEquals(myId, dr.getMyPersistentID());
}
@Test
public void testMemberIdSets() throws Exception {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testMemberIdSets");
LocalRegion lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
DiskRegion dr = lr.getDiskRegion();
PersistentMemberID myOnId = createNewPMID();
PersistentMemberID myOnId2 = createNewPMID();
PersistentMemberID myOffId = createNewPMID();
PersistentMemberID myEqualsId = createNewPMID();
dr.memberOnline(myOnId);
dr.memberOnline(myOnId2);
dr.memberOffline(myOffId);
dr.memberOfflineAndEqual(myEqualsId);
assertEquals(TestUtils.asSet(myOnId, myOnId2), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualsId), dr.getOfflineAndEqualMembers());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(TestUtils.asSet(myOnId, myOnId2), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualsId), dr.getOfflineAndEqualMembers());
dr.forceIFCompaction();
assertEquals(TestUtils.asSet(myOnId, myOnId2), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualsId), dr.getOfflineAndEqualMembers());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(TestUtils.asSet(myOnId, myOnId2), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualsId), dr.getOfflineAndEqualMembers());
dr.memberOffline(myOnId);
dr.memberOfflineAndEqual(myOnId2);
HashSet<PersistentMemberID> expSet = new HashSet<PersistentMemberID>();
expSet.add(myOffId); expSet.add(myOnId);
assertTrue(dr.getOnlineMembers().isEmpty());
assertEquals(expSet, dr.getOfflineMembers());
HashSet<PersistentMemberID> expSet2 = new HashSet<PersistentMemberID>();
expSet2.add(myEqualsId); expSet2.add(myOnId2);
assertEquals(expSet2, dr.getOfflineAndEqualMembers());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertTrue(dr.getOnlineMembers().isEmpty());
assertEquals(expSet, dr.getOfflineMembers());
assertEquals(expSet2, dr.getOfflineAndEqualMembers());
dr.forceIFCompaction();
assertTrue(dr.getOnlineMembers().isEmpty());
assertEquals(expSet, dr.getOfflineMembers());
assertEquals(expSet2, dr.getOfflineAndEqualMembers());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertTrue(dr.getOnlineMembers().isEmpty());
assertEquals(expSet, dr.getOfflineMembers());
assertEquals(expSet2, dr.getOfflineAndEqualMembers());
dr.memberOnline(myOnId);
dr.memberOnline(myOnId2);
dr.memberOnline(myOffId);
dr.memberOnline(myEqualsId);
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
expSet.add(myEqualsId);
expSet.add(myOnId2);;
assertEquals(expSet, dr.getOnlineMembers());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertTrue(dr.getOfflineMembers().isEmpty());
assertEquals(expSet, dr.getOnlineMembers());
dr.forceIFCompaction();
assertTrue(dr.getOfflineMembers().isEmpty());
assertEquals(expSet, dr.getOnlineMembers());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertTrue(dr.getOfflineMembers().isEmpty());
assertEquals(expSet, dr.getOnlineMembers());
dr.memberOffline(myOffId);
dr.memberOfflineAndEqual(myEqualsId);
assertEquals(TestUtils.asSet(myOnId, myOnId2), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualsId), dr.getOfflineAndEqualMembers());
dr.memberRemoved(myOffId);
assertTrue(dr.getOfflineMembers().isEmpty());
assertEquals(TestUtils.asSet(myOnId, myOnId2), dr.getOnlineMembers());
assertEquals(Collections.singleton(myEqualsId), dr.getOfflineAndEqualMembers());
dr.memberRemoved(myOnId);
dr.memberRemoved(myOnId2);
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertEquals(Collections.singleton(myEqualsId), dr.getOfflineAndEqualMembers());
dr.memberRemoved(myEqualsId);
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
dr.forceIFCompaction();
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
}
@Test
public void testAboutToDestroy() throws Exception {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testAboutToDestroy");
LocalRegion lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
DiskRegion dr = lr.getDiskRegion();
PersistentMemberID myId = createNewPMID();
PersistentMemberID myOnId = createNewPMID();
PersistentMemberID myOffId = createNewPMID();
PersistentMemberID myEqualId = createNewPMID();
dr.setInitializing(myId);
dr.setInitialized();
dr.memberOnline(myOnId);
dr.memberOffline(myOffId);
dr.memberOfflineAndEqual(myEqualId);
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(null, dr.getMyInitializingID());
assertEquals(myId, dr.getMyPersistentID());
assertEquals(false, dr.wasAboutToDestroy());
dr.beginDestroy(lr);
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(myId, dr.getMyPersistentID());
assertEquals(true, dr.wasAboutToDestroy());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(myId, dr.getMyPersistentID());
assertEquals(true, dr.wasAboutToDestroy());
dr.forceIFCompaction();
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(myId, dr.getMyPersistentID());
assertEquals(true, dr.wasAboutToDestroy());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(myId, dr.getMyPersistentID());
assertEquals(true, dr.wasAboutToDestroy());
dr.endDestroy(lr);
assertEquals(Collections.emptySet(), dr.getOnlineMembers());
assertEquals(Collections.emptySet(), dr.getOfflineMembers());
assertEquals(Collections.emptySet(), dr.getOfflineAndEqualMembers());
assertEquals(false, dr.wasAboutToDestroy());
close(lr);
//do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(Collections.emptySet(), dr.getOnlineMembers());
assertEquals(Collections.emptySet(), dr.getOfflineMembers());
assertEquals(Collections.emptySet(), dr.getOfflineAndEqualMembers());
assertEquals(false, dr.wasAboutToDestroy());
dr.forceIFCompaction();
assertEquals(Collections.emptySet(), dr.getOnlineMembers());
assertEquals(Collections.emptySet(), dr.getOfflineMembers());
assertEquals(Collections.emptySet(), dr.getOfflineAndEqualMembers());
assertEquals(false, dr.wasAboutToDestroy());
close(lr);
assertEquals(Collections.emptySet(), dr.getOnlineMembers());
assertEquals(Collections.emptySet(), dr.getOfflineMembers());
assertEquals(Collections.emptySet(), dr.getOfflineAndEqualMembers());
assertEquals(false, dr.wasAboutToDestroy());
}
@Test
public void testAboutToPartialDestroy() throws Exception {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testAboutToPartialDestroy");
LocalRegion lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
DiskRegion dr = lr.getDiskRegion();
PersistentMemberID myId = createNewPMID();
PersistentMemberID myOnId = createNewPMID();
PersistentMemberID myOffId = createNewPMID();
PersistentMemberID myEqualId = createNewPMID();
dr.setInitializing(myId);
dr.setInitialized();
dr.memberOnline(myOnId);
dr.memberOffline(myOffId);
dr.memberOfflineAndEqual(myEqualId);
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(null, dr.getMyInitializingID());
assertEquals(myId, dr.getMyPersistentID());
assertEquals(false, dr.wasAboutToDestroy());
assertEquals(false, dr.wasAboutToDestroyDataStorage());
dr.beginDestroyDataStorage();
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(myId, dr.getMyPersistentID());
assertEquals(false, dr.wasAboutToDestroy());
assertEquals(true, dr.wasAboutToDestroyDataStorage());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(myId, dr.getMyPersistentID());
assertEquals(false, dr.wasAboutToDestroy());
assertEquals(true, dr.wasAboutToDestroyDataStorage());
dr.forceIFCompaction();
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(myId, dr.getMyPersistentID());
assertEquals(false, dr.wasAboutToDestroy());
assertEquals(true, dr.wasAboutToDestroyDataStorage());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(myId, dr.getMyPersistentID());
assertEquals(false, dr.wasAboutToDestroy());
assertEquals(true, dr.wasAboutToDestroyDataStorage());
dr.endDestroy(lr);
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(null, dr.getMyPersistentID());
assertEquals(false, dr.wasAboutToDestroy());
assertEquals(false, dr.wasAboutToDestroyDataStorage());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
PersistentMemberID newId = dr.getMyPersistentID();
if (myId.equals(newId)) {
fail("expected a new id but was: " + newId);
}
assertNotNull(newId);
assertEquals(false, dr.wasAboutToDestroy());
assertEquals(false, dr.wasAboutToDestroyDataStorage());
dr.forceIFCompaction();
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(newId, dr.getMyPersistentID());
assertEquals(false, dr.wasAboutToDestroy());
assertEquals(false, dr.wasAboutToDestroyDataStorage());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(Collections.singleton(myOnId), dr.getOnlineMembers());
assertEquals(Collections.singleton(myOffId), dr.getOfflineMembers());
assertEquals(Collections.singleton(myEqualId), dr.getOfflineAndEqualMembers());
assertEquals(newId, dr.getMyPersistentID());
assertEquals(false, dr.wasAboutToDestroy());
assertEquals(false, dr.wasAboutToDestroyDataStorage());
}
@Test
public void testRegionConfigDefaults() throws Exception {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRegionConfigDefaults");
LocalRegion lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
DiskRegion dr = lr.getDiskRegion();
assertEquals(false, dr.hasConfigChanged());
assertEquals(0, dr.getLruAlgorithm());
assertEquals(0, dr.getLruAction());
assertEquals(0, dr.getLruLimit());
assertEquals(16, dr.getConcurrencyLevel());
assertEquals(16, dr.getInitialCapacity());
assertEquals(0.75f, dr.getLoadFactor(), 0.01);
assertEquals(false, dr.getStatisticsEnabled());
assertEquals(false, dr.isBucket());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(false, dr.hasConfigChanged());
assertEquals(0, dr.getLruAlgorithm());
assertEquals(0, dr.getLruAction());
assertEquals(0, dr.getLruLimit());
assertEquals(16, dr.getConcurrencyLevel());
assertEquals(16, dr.getInitialCapacity());
assertEquals(0.75f, dr.getLoadFactor(), 0.01);
assertEquals(false, dr.getStatisticsEnabled());
assertEquals(false, dr.isBucket());
dr.forceIFCompaction();
assertEquals(false, dr.hasConfigChanged());
assertEquals(0, dr.getLruAlgorithm());
assertEquals(0, dr.getLruAction());
assertEquals(0, dr.getLruLimit());
assertEquals(16, dr.getConcurrencyLevel());
assertEquals(16, dr.getInitialCapacity());
assertEquals(0.75f, dr.getLoadFactor(), 0.01);
assertEquals(false, dr.getStatisticsEnabled());
assertEquals(false, dr.isBucket());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(false, dr.hasConfigChanged());
assertEquals(0, dr.getLruAlgorithm());
assertEquals(0, dr.getLruAction());
assertEquals(0, dr.getLruLimit());
assertEquals(16, dr.getConcurrencyLevel());
assertEquals(16, dr.getInitialCapacity());
assertEquals(0.75f, dr.getLoadFactor(), 0.01);
assertEquals(false, dr.getStatisticsEnabled());
assertEquals(false, dr.isBucket());
}
@Test
public void testRegionConfigNonDefaults() throws Exception {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRegionConfigNonDefaults");
diskProps.setOverFlowCapacity(42);
diskProps.setConcurrencyLevel(53);
diskProps.setInitialCapacity(64);
diskProps.setLoadFactor(0.31f);
diskProps.setStatisticsEnabled(true);
LocalRegion lr = (LocalRegion)DiskRegionHelperFactory.getSyncOverFlowAndPersistRegion(cache, diskProps);
DiskRegion dr = lr.getDiskRegion();
assertEquals(false, dr.hasConfigChanged());
assertEquals(1, dr.getLruAlgorithm());
assertEquals(2, dr.getLruAction());
assertEquals(42, dr.getLruLimit());
assertEquals(53, dr.getConcurrencyLevel());
assertEquals(64, dr.getInitialCapacity());
assertEquals(0.31f, dr.getLoadFactor(), 0.01);
assertEquals(true, dr.getStatisticsEnabled());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncOverFlowAndPersistRegion(cache, diskProps);
dr = lr.getDiskRegion();
assertEquals(false, dr.hasConfigChanged());
assertEquals(1, dr.getLruAlgorithm());
assertEquals(2, dr.getLruAction());
assertEquals(42, dr.getLruLimit());
assertEquals(53, dr.getConcurrencyLevel());
assertEquals(64, dr.getInitialCapacity());
assertEquals(0.31f, dr.getLoadFactor(), 0.01);
assertEquals(true, dr.getStatisticsEnabled());
dr.forceIFCompaction();
assertEquals(false, dr.hasConfigChanged());
assertEquals(1, dr.getLruAlgorithm());
assertEquals(2, dr.getLruAction());
assertEquals(42, dr.getLruLimit());
assertEquals(53, dr.getConcurrencyLevel());
assertEquals(64, dr.getInitialCapacity());
assertEquals(0.31f, dr.getLoadFactor(), 0.01);
assertEquals(true, dr.getStatisticsEnabled());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncOverFlowAndPersistRegion(cache, diskProps);
dr = lr.getDiskRegion();
assertEquals(false, dr.hasConfigChanged());
assertEquals(1, dr.getLruAlgorithm());
assertEquals(2, dr.getLruAction());
assertEquals(42, dr.getLruLimit());
assertEquals(53, dr.getConcurrencyLevel());
assertEquals(64, dr.getInitialCapacity());
assertEquals(0.31f, dr.getLoadFactor(), 0.01);
assertEquals(true, dr.getStatisticsEnabled());
// @todo test isBucket == true
}
@Test
public void testRegionConfigChange() throws Exception {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testRegionConfigChange");
diskProps.setOverFlowCapacity(42);
diskProps.setConcurrencyLevel(53);
diskProps.setInitialCapacity(64);
diskProps.setLoadFactor(0.31f);
diskProps.setStatisticsEnabled(true);
LocalRegion lr = (LocalRegion)DiskRegionHelperFactory.getSyncOverFlowAndPersistRegion(cache, diskProps);
DiskRegion dr = lr.getDiskRegion();
assertEquals(false, dr.hasConfigChanged());
assertEquals(1, dr.getLruAlgorithm());
assertEquals(2, dr.getLruAction());
assertEquals(42, dr.getLruLimit());
assertEquals(53, dr.getConcurrencyLevel());
assertEquals(64, dr.getInitialCapacity());
assertEquals(0.31f, dr.getLoadFactor(), 0.01);
assertEquals(true, dr.getStatisticsEnabled());
close(lr);
diskProps.setOverFlowCapacity(999);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncOverFlowAndPersistRegion(cache, diskProps);
dr = lr.getDiskRegion();
assertEquals(false, dr.hasConfigChanged());
assertEquals(1, dr.getLruAlgorithm());
assertEquals(2, dr.getLruAction());
assertEquals(999, dr.getLruLimit());
assertEquals(53, dr.getConcurrencyLevel());
assertEquals(64, dr.getInitialCapacity());
assertEquals(0.31f, dr.getLoadFactor(), 0.01);
assertEquals(true, dr.getStatisticsEnabled());
close(lr);
// do recovery
lr = (LocalRegion)DiskRegionHelperFactory.getSyncOverFlowAndPersistRegion(cache, diskProps);
dr = lr.getDiskRegion();
assertEquals(false, dr.hasConfigChanged());
assertEquals(1, dr.getLruAlgorithm());
assertEquals(2, dr.getLruAction());
assertEquals(999, dr.getLruLimit());
assertEquals(53, dr.getConcurrencyLevel());
assertEquals(64, dr.getInitialCapacity());
assertEquals(0.31f, dr.getLoadFactor(), 0.01);
assertEquals(true, dr.getStatisticsEnabled());
}
/**
* Make sure if we have multiple init file with the same ds name that ds creation fails.
* See bug 41883.
*/
@Test
public void testTwoIFFiles() throws Exception {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testTwoIFFiles");
diskProps.setDiskDirs(dirs);
LocalRegion lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
DiskRegion dr = lr.getDiskRegion();
assertEquals(null, dr.getMyInitializingID());
PersistentMemberID myId = dr.getMyPersistentID();
assertNotNull(myId);
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
// do recovery
close(lr);
assertEquals(true, (new File(dirs[0], "BACKUPtestTwoIFFiles.if")).exists());
File extraIF = new File(dirs[1], "BACKUPtestTwoIFFiles.if");
extraIF.createNewFile();
try {
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
fail("expected IllegalStateException");
} catch (IllegalStateException expected) {
} finally {
extraIF.delete();
}
}
/**
* See if we can find the init file if it is not in the first directory.
* See bug 41883.
*/
@Test
public void testIFFIleInSecondDir() throws Exception {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testIFFIleInSecondDir");
diskProps.setDiskDirs(dirs);
LocalRegion lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
DiskRegion dr = lr.getDiskRegion();
assertEquals(null, dr.getMyInitializingID());
PersistentMemberID myId = dr.getMyPersistentID();
assertNotNull(myId);
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
// do recovery
close(lr);
assertEquals(true, (new File(dirs[0], "BACKUPtestIFFIleInSecondDir.if")).exists());
// switch dir[]0 and dir[1]
File[] myDirs = new File[2];
myDirs[0] = dirs[1];
myDirs[1] = dirs[0];
diskProps.setDiskDirs(myDirs);
assertEquals(true, (new File(myDirs[1], "BACKUPtestIFFIleInSecondDir.if")).exists());
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
dr = lr.getDiskRegion();
assertEquals(null, dr.getMyInitializingID());
assertEquals(myId, dr.getMyPersistentID());
assertTrue(dr.getOnlineMembers().isEmpty());
assertTrue(dr.getOfflineMembers().isEmpty());
assertTrue(dr.getOfflineAndEqualMembers().isEmpty());
}
/**
* Make sure that disk store oplog files from another instance of a disk
* store are not allowed when loading the other disk store
*/
@Test
public void testTwoDiskStores() {
diskProps.setPersistBackup(true);
diskProps.setRegionName("testTwoDiskStores");
// create first instance in dir 0
File[] myDirs = new File[1];
myDirs[0] = dirs[0];
diskProps.setDiskDirs(myDirs);
LocalRegion lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
lr.put("key1", "value1");
close(lr);
assertEquals(true, (new File(dirs[0], "BACKUPtestTwoDiskStores.if")).exists());
assertEquals(true, (new File(dirs[0], "BACKUPtestTwoDiskStores_1.crf")).exists());
assertEquals(true, (new File(dirs[0], "BACKUPtestTwoDiskStores_1.drf")).exists());
// now create another instance in dir 1
myDirs = new File[1];
myDirs[0] = dirs[1];
diskProps.setDiskDirs(myDirs);
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
lr.put("key2", "value2");
close(lr);
assertEquals(true, (new File(dirs[1], "BACKUPtestTwoDiskStores.if")).exists());
assertEquals(true, (new File(dirs[1], "BACKUPtestTwoDiskStores_1.crf")).exists());
assertEquals(true, (new File(dirs[1], "BACKUPtestTwoDiskStores_1.drf")).exists());
// remove the second if file; we want to make sure that duplicate oplogs will
// cause recovery to fail
(new File(dirs[1], "BACKUPtestTwoDiskStores.if")).delete();
// now try to recover from with both dirs added. This should fail
myDirs = new File[2];
myDirs[0] = dirs[0];
myDirs[1] = dirs[1];
diskProps.setDiskDirs(myDirs);
try {
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
fail("expected DiskAccessException");
} catch (com.gemstone.gemfire.cache.DiskAccessException expected) {
if (!expected.getMessage().contains("two different directories")) {
fail("did not expect: " + expected + ". It should have contained: \"two different directories\"");
}
}
// now try to recover with just the wrong oplog files
(new File(dirs[0], "BACKUPtestTwoDiskStores_1.crf")).delete();
(new File(dirs[0], "BACKUPtestTwoDiskStores_1.drf")).delete();
try {
lr = (LocalRegion)DiskRegionHelperFactory.getSyncPersistOnlyRegion(cache, diskProps, Scope.LOCAL);
fail("expected DiskAccessException");
} catch (com.gemstone.gemfire.cache.DiskAccessException expected) {
if (!expected.getMessage().contains("does not belong")) {
fail("did not expect: " + expected + ". It should have contained: \"does not belong\"");
}
}
}
@Test
public void testPRConfig() throws Exception {
DiskStoreImpl store = (DiskStoreImpl) cache.createDiskStoreFactory().create("testStore");
PRPersistentConfig config = new PRPersistentConfig(5, "j");
store.addPersistentPR("pr1", config);
store.addPersistentPR("pr2", config);
store.removePersistentPR("pr1");
assertEquals(config, store.getPersistentPRConfig("pr2"));
assertEquals(null, store.getPersistentPRConfig("pr1"));
//recover the store
cache.close();
cache =createCache();
store = (DiskStoreImpl) cache.createDiskStoreFactory().create("testStore");
//Make sure the config is still the same.
assertEquals(config, store.getPersistentPRConfig("pr2"));
assertEquals(null, store.getPersistentPRConfig("pr1"));
store.forceIFCompaction();
assertEquals(config, store.getPersistentPRConfig("pr2"));
assertEquals(null, store.getPersistentPRConfig("pr1"));
//recover the store again
cache.close();
cache =createCache();
store = (DiskStoreImpl) cache.createDiskStoreFactory().create("testStore");
assertEquals(config, store.getPersistentPRConfig("pr2"));
assertEquals(null, store.getPersistentPRConfig("pr1"));
}
private void close(LocalRegion lr) {
lr.close();
lr.getDiskStore().close();
lr.getGemFireCache().removeDiskStore(lr.getDiskStore());
}
static long pmidCtr = 0;
static PersistentMemberID createNewPMID() {
return new PersistentMemberID(DiskStoreID.random(), null, null, ++pmidCtr, (short)0);
}
}