use of org.apache.geode.internal.cache.PartitionedRegion in project geode by apache.
the class ResourceManagerDUnitTest method testCreateRedundantBucket.
/**
* Creates a bucket on two members. Then brings up a third member and creates an extra redundant
* copy of the bucket on it.
*/
@Test
public void testCreateRedundantBucket() {
final String[] regionPath = new String[] { getUniqueName() + "-PR-0" };
final int numBuckets = 1;
final int redundantCopies = 1;
final int localMaxMemory = 100;
// create the PartitionedRegion on the first two members
createRegion(Host.getHost(0).getVM(0), regionPath[0], localMaxMemory, numBuckets, redundantCopies);
createRegion(Host.getHost(0).getVM(1), regionPath[0], localMaxMemory, numBuckets, redundantCopies);
// create the bucket on the first two members
final Integer bucketKey = Integer.valueOf(0);
// 2 MB in size
final byte[] value = new byte[1];
createBucket(0, regionPath[0], bucketKey, value);
// identify the primaryVM and otherVM
final InternalDistributedMember[] members = new InternalDistributedMember[2];
final long[] memberSizes = new long[members.length];
final int[] memberBucketCounts = new int[members.length];
final int[] memberPrimaryCounts = new int[members.length];
fillValidationArrays(members, memberSizes, memberBucketCounts, memberPrimaryCounts, regionPath[0]);
int primaryVM = -1;
int otherVM = -1;
for (int i = 0; i < memberPrimaryCounts.length; i++) {
if (memberPrimaryCounts[i] == 0) {
otherVM = i;
} else if (memberPrimaryCounts[i] == 1) {
// found the primary
primaryVM = i;
}
}
assertTrue(primaryVM > -1);
assertTrue(otherVM > -1);
assertTrue(primaryVM != otherVM);
final int finalOtherVM = otherVM;
// make sure bucket exists on otherVM
Host.getHost(0).getVM(otherVM).invoke(new SerializableRunnable() {
public void run() {
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(regionPath[0]);
Bucket bucket = pr.getRegionAdvisor().getBucket(0);
assertNotNull("Bucket is null on SRC member", bucket);
BucketRegion bucketRegion = bucket.getBucketAdvisor().getProxyBucketRegion().getHostedBucketRegion();
assertTrue("SRC member is not hosting bucket", bucket.isHosting());
assertNotNull("BucketRegion is null on SRC member", bucketRegion);
int redundancy = bucket.getBucketAdvisor().getBucketRedundancy();
assertEquals("SRC member reports redundancy " + redundancy, redundantCopies, redundancy);
}
});
// create newVM to create extra redundant bucket on
final int finalNewVM = 2;
createRegion(Host.getHost(0).getVM(finalNewVM), regionPath[0], localMaxMemory, numBuckets, redundantCopies);
// create an extra redundant bucket on finalNewVM
Host.getHost(0).getVM(finalNewVM).invoke(new SerializableRunnable() {
public void run() {
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(regionPath[0]);
assertEquals(CreateBucketResult.CREATED, pr.getDataStore().createRedundantBucket(0, false, new InternalDistributedMember()));
Bucket bucket = pr.getRegionAdvisor().getBucket(0);
assertNotNull("Bucket is null on DST member", bucket);
BucketRegion bucketRegion = bucket.getBucketAdvisor().getProxyBucketRegion().getHostedBucketRegion();
assertTrue("DST member is not hosting bucket", bucket.isHosting());
assertNotNull("BucketRegion is null on DST member", bucketRegion);
assertEquals(redundantCopies + 1, bucket.getBucketAdvisor().getBucketRedundancy());
}
});
}
use of org.apache.geode.internal.cache.PartitionedRegion in project geode by apache.
the class ResourceManagerDUnitTest method testGetPartitionedRegionDetails.
/**
* Creates partitioned regions in multiple vms and fully exercises the getPartitionedRegionDetails
* API on ResourceManager.
*/
@Test
public void testGetPartitionedRegionDetails() {
// two regions
final String[] regionPath = new String[] { getUniqueName() + "-PR-0", getUniqueName() + "-PR-1" };
// numBuckets config for the two regions
final int[] numBuckets = new int[] { 100, 90 };
// redundantCopies config for the two regions
final int[] redundantCopies = new int[] { 1, 0 };
// localMaxMemory config to use for three members
final int[] localMaxMemory = new int[] { 50, 100, 0 };
// bucketKeys to use for making three buckets in first PR
final Integer[] bucketKeys = new Integer[] { Integer.valueOf(0), Integer.valueOf(42), Integer.valueOf(76) };
assertEquals(0, bucketKeys[0].hashCode());
assertEquals(42, bucketKeys[1].hashCode());
assertEquals(76, bucketKeys[2].hashCode());
createRegion(Host.getHost(0).getVM(0), regionPath[0], localMaxMemory[0], numBuckets[0], redundantCopies[0]);
createRegion(Host.getHost(0).getVM(1), regionPath[0], localMaxMemory[1], numBuckets[0], redundantCopies[0]);
createRegion(Host.getHost(0).getVM(2), regionPath[0], localMaxMemory[2], numBuckets[0], redundantCopies[0]);
createRegion(Host.getHost(0).getVM(0), regionPath[1], localMaxMemory[0], numBuckets[1], redundantCopies[1]);
// 2 MB in size
final byte[] value = new byte[1024 * 1024 * 2];
createBuckets(0, regionPath[0], bucketKeys, value);
// identify the members and their config values
final InternalDistributedMember[] members = new InternalDistributedMember[3];
final long[] memberSizes = new long[members.length];
final int[] memberBucketCounts = new int[members.length];
final int[] memberPrimaryCounts = new int[members.length];
fillValidationArrays(members, memberSizes, memberBucketCounts, memberPrimaryCounts, regionPath[0]);
// test everything here
for (int i = 0; i < localMaxMemory.length; i++) {
final int vm = i;
Host.getHost(0).getVM(vm).invoke(new SerializableRunnable() {
public void run() {
Set<PartitionRegionInfo> detailsSet = PartitionRegionHelper.getPartitionRegionInfo(getCache());
if (vm == 0) {
assertEquals(2, detailsSet.size());
} else {
assertEquals(1, detailsSet.size());
}
// iterate over each PartitionedRegionDetails
for (Iterator<PartitionRegionInfo> prIter = detailsSet.iterator(); prIter.hasNext(); ) {
PartitionRegionInfo details = prIter.next();
// NOTE: getRegionPath() contains the Region.SEPARATOR + regionPath
assertTrue("Unknown regionPath=" + details.getRegionPath(), details.getRegionPath().contains(regionPath[0]) || details.getRegionPath().contains(regionPath[1]));
if (details.getRegionPath().contains(regionPath[0])) {
assertEquals(numBuckets[0], details.getConfiguredBucketCount());
assertEquals(0, details.getLowRedundancyBucketCount());
assertEquals(redundantCopies[0], details.getConfiguredRedundantCopies());
assertEquals(redundantCopies[0], details.getActualRedundantCopies());
assertNull(details.getColocatedWith());
Set<PartitionMemberInfo> memberDetails = details.getPartitionMemberInfo();
assertNotNull(memberDetails);
assertEquals(localMaxMemory.length - 1, memberDetails.size());
// iterate over each PartitionMemberDetails (datastores only)
for (Iterator<PartitionMemberInfo> mbrIter = memberDetails.iterator(); mbrIter.hasNext(); ) {
PartitionMemberInfo mbrDetails = mbrIter.next();
assertNotNull(mbrDetails);
DistributedMember mbr = mbrDetails.getDistributedMember();
assertNotNull(mbr);
int membersIdx = -1;
for (int idx = 0; idx < members.length; idx++) {
if (mbr.equals(members[idx])) {
membersIdx = idx;
}
}
assertEquals(localMaxMemory[membersIdx] * (1024L * 1024L), mbrDetails.getConfiguredMaxMemory());
assertEquals(memberSizes[membersIdx], mbrDetails.getSize());
assertEquals(memberBucketCounts[membersIdx], mbrDetails.getBucketCount());
assertEquals(memberPrimaryCounts[membersIdx], mbrDetails.getPrimaryCount());
if (mbr.equals(getSystem().getDistributedMember())) {
// PartitionMemberDetails represents the local member
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(details.getRegionPath());
assertEquals(pr.getLocalMaxMemory() * (1024L * 1024L), mbrDetails.getConfiguredMaxMemory());
PartitionedRegionDataStore ds = pr.getDataStore();
assertNotNull(ds);
assertEquals(getSize(ds), mbrDetails.getSize());
assertEquals(ds.getBucketsManaged(), mbrDetails.getBucketCount());
assertEquals(ds.getNumberOfPrimaryBucketsManaged(), mbrDetails.getPrimaryCount());
}
}
} else {
// found the other PR which has only one datastore and we know
// this system memberId is the only entry in mbrDetails
assertEquals(numBuckets[1], details.getConfiguredBucketCount());
assertEquals(0, details.getLowRedundancyBucketCount());
assertEquals(redundantCopies[1], details.getConfiguredRedundantCopies());
assertEquals(redundantCopies[1], details.getActualRedundantCopies());
assertNull(details.getColocatedWith());
Set<PartitionMemberInfo> memberDetails = details.getPartitionMemberInfo();
assertNotNull(memberDetails);
assertEquals(1, memberDetails.size());
PartitionMemberInfo mbrDetails = memberDetails.iterator().next();
assertEquals(getSystem().getDistributedMember(), mbrDetails.getDistributedMember());
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(details.getRegionPath());
assertEquals(pr.getLocalMaxMemory() * (1024L * 1024L), mbrDetails.getConfiguredMaxMemory());
PartitionedRegionDataStore ds = pr.getDataStore();
assertNotNull(ds);
assertEquals(getSize(ds), mbrDetails.getSize());
assertEquals(ds.getBucketsManaged(), mbrDetails.getBucketCount());
assertEquals(ds.getNumberOfPrimaryBucketsManaged(), mbrDetails.getPrimaryCount());
}
}
}
});
}
destroyRegions(0, regionPath);
}
use of org.apache.geode.internal.cache.PartitionedRegion in project geode by apache.
the class ResourceManagerDUnitTest method testRemoveBucketMessage.
@Test
public void testRemoveBucketMessage() {
final String[] regionPath = new String[] { getUniqueName() + "-PR-0" };
final int[] numBuckets = new int[] { 1 };
final int[] redundantCopies = new int[] { 1 };
// localMaxMemory config to use for 2 members
final int[] localMaxMemory = new int[] { 100, 100 };
createRegion(Host.getHost(0).getVM(0), regionPath[0], localMaxMemory[0], numBuckets[0], redundantCopies[0]);
createRegion(Host.getHost(0).getVM(1), regionPath[0], localMaxMemory[1], numBuckets[0], redundantCopies[0]);
final Integer bucketKey = Integer.valueOf(0);
// 2 MB in size
final byte[] value = new byte[1];
createBucket(0, regionPath[0], bucketKey, value);
// identify the members and their config values
final InternalDistributedMember[] members = new InternalDistributedMember[2];
final long[] memberSizes = new long[members.length];
final int[] memberBucketCounts = new int[members.length];
final int[] memberPrimaryCounts = new int[members.length];
fillValidationArrays(members, memberSizes, memberBucketCounts, memberPrimaryCounts, regionPath[0]);
int primaryVM = -1;
int otherVM = -1;
for (int i = 0; i < memberPrimaryCounts.length; i++) {
if (memberPrimaryCounts[i] == 0) {
otherVM = i;
} else if (memberPrimaryCounts[i] == 1) {
// found the primary
primaryVM = i;
}
}
assertTrue(primaryVM > -1);
assertTrue(otherVM > -1);
assertTrue(primaryVM != otherVM);
final int finalOtherVM = otherVM;
Host.getHost(0).getVM(otherVM).invoke(new SerializableRunnable() {
public void run() {
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(regionPath[0]);
Bucket bucket = pr.getRegionAdvisor().getBucket(0);
assertTrue("Target member is not hosting bucket to remove", bucket.isHosting());
assertNotNull("Bucket is null on target member", bucket);
assertNotNull("BucketRegion is null on target member", bucket.getBucketAdvisor().getProxyBucketRegion().getHostedBucketRegion());
}
});
boolean sentRemoveBucket = ((Boolean) Host.getHost(0).getVM(primaryVM).invoke(new SerializableCallable() {
public Object call() {
InternalDistributedMember recipient = members[finalOtherVM];
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(regionPath[0]);
RemoveBucketResponse response = RemoveBucketMessage.send(recipient, pr, 0, false);
if (response != null) {
response.waitForRepliesUninterruptibly();
return true;
} else {
return Boolean.FALSE;
}
}
})).booleanValue();
assertTrue("Failed to get reply to RemoveBucketMessage", sentRemoveBucket);
Host.getHost(0).getVM(otherVM).invoke(new SerializableRunnable() {
public void run() {
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(regionPath[0]);
Bucket bucket = pr.getRegionAdvisor().getBucket(0);
BucketRegion bucketRegion = bucket.getBucketAdvisor().getProxyBucketRegion().getHostedBucketRegion();
assertFalse("Target member is still hosting removed bucket", bucket.isHosting());
assertNull("BucketRegion is not null on target member", bucketRegion);
}
});
}
use of org.apache.geode.internal.cache.PartitionedRegion in project geode by apache.
the class ResourceManagerDUnitTest method testGetInternalPRDetails.
/**
* Creates partitioned regions in multiple vms and fully exercises the internal-only
* getInternalPRDetails API on ResourceManager.
*/
@Test
public void testGetInternalPRDetails() {
// two regions
final String[] regionPath = new String[] { getUniqueName() + "-PR-0", getUniqueName() + "-PR-1" };
// numBuckets config for the two regions
final int[] numBuckets = new int[] { 100, 90 };
// redundantCopies config for the two regions
final int[] redundantCopies = new int[] { 1, 0 };
// localMaxMemory config to use for three members
final int[] localMaxMemory = new int[] { 50, 100, 0 };
// bucketKeys to use for making three bckets in first PR
final Integer[] bucketKeys = new Integer[] { Integer.valueOf(0), Integer.valueOf(42), Integer.valueOf(76) };
assertEquals(0, bucketKeys[0].hashCode());
assertEquals(42, bucketKeys[1].hashCode());
assertEquals(76, bucketKeys[2].hashCode());
createRegion(Host.getHost(0).getVM(0), regionPath[0], localMaxMemory[0], numBuckets[0], redundantCopies[0]);
createRegion(Host.getHost(0).getVM(1), regionPath[0], localMaxMemory[1], numBuckets[0], redundantCopies[0]);
createRegion(Host.getHost(0).getVM(2), regionPath[0], localMaxMemory[2], numBuckets[0], redundantCopies[0]);
createRegion(Host.getHost(0).getVM(0), regionPath[1], localMaxMemory[0], numBuckets[1], redundantCopies[1]);
// 2 MB in size
final byte[] value = new byte[1024 * 1024 * 2];
createBuckets(0, regionPath[0], bucketKeys, value);
// identify the members and their config values
final InternalDistributedMember[] members = new InternalDistributedMember[3];
final long[] memberSizes = new long[members.length];
final int[] memberBucketCounts = new int[members.length];
final int[] memberPrimaryCounts = new int[members.length];
for (int i = 0; i < members.length; i++) {
final int vm = i;
members[vm] = (InternalDistributedMember) Host.getHost(0).getVM(vm).invoke(new SerializableCallable() {
public Object call() {
return getSystem().getDistributedMember();
}
});
memberSizes[vm] = ((Long) Host.getHost(0).getVM(vm).invoke(new SerializableCallable() {
public Object call() {
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(regionPath[0]);
PartitionedRegionDataStore ds = pr.getDataStore();
if (ds == null) {
return Long.valueOf(0);
} else {
return Long.valueOf(getSize(ds));
}
}
})).longValue();
memberBucketCounts[vm] = ((Integer) Host.getHost(0).getVM(vm).invoke(new SerializableCallable() {
public Object call() {
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(regionPath[0]);
PartitionedRegionDataStore ds = pr.getDataStore();
if (ds == null) {
return new Integer(0);
} else {
return new Integer(ds.getBucketsManaged());
}
}
})).intValue();
memberPrimaryCounts[vm] = ((Integer) Host.getHost(0).getVM(vm).invoke(new SerializableCallable() {
public Object call() {
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(regionPath[0]);
PartitionedRegionDataStore ds = pr.getDataStore();
if (ds == null) {
return new Integer(0);
} else {
return new Integer(ds.getNumberOfPrimaryBucketsManaged());
}
}
})).intValue();
}
// test everything here
for (int i = 0; i < localMaxMemory.length; i++) {
final int vm = i;
Host.getHost(0).getVM(vm).invoke(new SerializableRunnable() {
public void run() {
Set<InternalPRInfo> detailsSet = new HashSet<InternalPRInfo>();
GemFireCacheImpl cache = (GemFireCacheImpl) getCache();
for (PartitionedRegion pr : cache.getPartitionedRegions()) {
InternalPRInfo info = pr.getRedundancyProvider().buildPartitionedRegionInfo(true, cache.getInternalResourceManager().getLoadProbe());
detailsSet.add(info);
}
if (vm == 0) {
assertEquals(2, detailsSet.size());
} else {
assertEquals(1, detailsSet.size());
}
// iterate over each InternalPRDetails
for (Iterator<InternalPRInfo> prIter = detailsSet.iterator(); prIter.hasNext(); ) {
InternalPRInfo details = prIter.next();
// NOTE: getRegionPath() contains the Region.SEPARATOR + regionPath
assertTrue("Unknown regionPath=" + details.getRegionPath(), details.getRegionPath().contains(regionPath[0]) || details.getRegionPath().contains(regionPath[1]));
if (details.getRegionPath().contains(regionPath[0])) {
assertEquals(numBuckets[0], details.getConfiguredBucketCount());
assertEquals(0, details.getLowRedundancyBucketCount());
assertEquals(redundantCopies[0], details.getConfiguredRedundantCopies());
assertEquals(redundantCopies[0], details.getActualRedundantCopies());
assertNull(details.getColocatedWith());
Set<InternalPartitionDetails> memberDetails = details.getInternalPartitionDetails();
assertNotNull(memberDetails);
assertEquals(localMaxMemory.length - 1, memberDetails.size());
// iterate over each InternalPartitionDetails (datastores only)
for (Iterator<InternalPartitionDetails> mbrIter = memberDetails.iterator(); mbrIter.hasNext(); ) {
InternalPartitionDetails mbrDetails = mbrIter.next();
assertNotNull(mbrDetails);
DistributedMember mbr = mbrDetails.getDistributedMember();
assertNotNull(mbr);
int membersIdx = -1;
for (int idx = 0; idx < members.length; idx++) {
if (mbr.equals(members[idx])) {
membersIdx = idx;
}
}
assertEquals(localMaxMemory[membersIdx] * 1024 * 1024, mbrDetails.getConfiguredMaxMemory());
assertEquals(memberSizes[membersIdx], mbrDetails.getSize());
assertEquals(memberBucketCounts[membersIdx], mbrDetails.getBucketCount());
assertEquals(memberPrimaryCounts[membersIdx], mbrDetails.getPrimaryCount());
PRLoad load = mbrDetails.getPRLoad();
assertNotNull(load);
assertEquals((float) localMaxMemory[membersIdx], load.getWeight(), 0);
int totalBucketBytes = 0;
int primaryCount = 0;
for (int bid = 0; bid < numBuckets[0]; bid++) {
long bucketBytes = mbrDetails.getBucketSize(bid);
assertTrue(bucketBytes >= 0);
totalBucketBytes += bucketBytes;
// validate against the PRLoad
assertEquals((float) bucketBytes, load.getReadLoad(bid), 0);
if (load.getWriteLoad(bid) > 0) {
// found a primary
primaryCount++;
}
}
// assertIndexDetailsEquals(memberSizes[membersIdx] * (1024* 1024),
// totalBucketBytes);
assertEquals(memberPrimaryCounts[membersIdx], primaryCount);
if (mbr.equals(getSystem().getDistributedMember())) {
// PartitionMemberDetails represents the local member
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(details.getRegionPath());
assertEquals(pr.getLocalMaxMemory() * (1024L * 1024L), mbrDetails.getConfiguredMaxMemory());
PartitionedRegionDataStore ds = pr.getDataStore();
assertNotNull(ds);
assertEquals(getSize(ds), mbrDetails.getSize());
assertEquals(ds.getBucketsManaged(), mbrDetails.getBucketCount());
assertEquals(ds.getNumberOfPrimaryBucketsManaged(), mbrDetails.getPrimaryCount());
}
}
} else {
// found the other PR which has only one datastore and we know
// this system memberId is the only entry in mbrDetails
assertEquals(numBuckets[1], details.getConfiguredBucketCount());
assertEquals(0, details.getLowRedundancyBucketCount());
assertEquals(redundantCopies[1], details.getConfiguredRedundantCopies());
assertEquals(redundantCopies[1], details.getActualRedundantCopies());
assertNull(details.getColocatedWith());
Set<PartitionMemberInfo> memberDetails = details.getPartitionMemberInfo();
assertNotNull(memberDetails);
assertEquals(1, memberDetails.size());
PartitionMemberInfo mbrDetails = memberDetails.iterator().next();
assertEquals(getSystem().getDistributedMember(), mbrDetails.getDistributedMember());
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(details.getRegionPath());
assertEquals(pr.getLocalMaxMemory() * (1024L * 1024L), mbrDetails.getConfiguredMaxMemory());
PartitionedRegionDataStore ds = pr.getDataStore();
assertNotNull(ds);
assertEquals(getSize(ds), mbrDetails.getSize());
assertEquals(ds.getBucketsManaged(), mbrDetails.getBucketCount());
assertEquals(ds.getNumberOfPrimaryBucketsManaged(), mbrDetails.getPrimaryCount());
}
}
}
});
}
destroyRegions(0, regionPath);
}
use of org.apache.geode.internal.cache.PartitionedRegion in project geode by apache.
the class ResourceManagerDUnitTest method fillValidationArrays.
private void fillValidationArrays(final InternalDistributedMember[] members, final long[] memberSizes, final int[] memberBucketCounts, final int[] memberPrimaryCounts, final String regionPath) {
for (int i = 0; i < members.length; i++) {
final int vm = i;
members[vm] = (InternalDistributedMember) Host.getHost(0).getVM(vm).invoke(new SerializableCallable() {
public Object call() {
return getSystem().getDistributedMember();
}
});
memberSizes[vm] = ((Long) Host.getHost(0).getVM(vm).invoke(new SerializableCallable() {
public Object call() {
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(regionPath);
PartitionedRegionDataStore ds = pr.getDataStore();
if (ds == null) {
return Long.valueOf(0);
} else {
return Long.valueOf(getSize(ds));
}
}
})).longValue();
memberBucketCounts[vm] = ((Integer) Host.getHost(0).getVM(vm).invoke(new SerializableCallable() {
public Object call() {
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(regionPath);
PartitionedRegionDataStore ds = pr.getDataStore();
if (ds == null) {
return new Integer(0);
} else {
return new Integer(ds.getBucketsManaged());
}
}
})).intValue();
memberPrimaryCounts[vm] = ((Integer) Host.getHost(0).getVM(vm).invoke(new SerializableCallable() {
public Object call() {
PartitionedRegion pr = (PartitionedRegion) getCache().getRegion(regionPath);
PartitionedRegionDataStore ds = pr.getDataStore();
if (ds == null) {
return new Integer(0);
} else {
return new Integer(ds.getNumberOfPrimaryBucketsManaged());
}
}
})).intValue();
}
}
Aggregations