| /*========================================================================= |
| * 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); |
| } |
| } |