blob: eecdb54f6c7b88d8ee41baf64c86fbea5b1842a0 [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.management;
import static org.apache.geode.management.MXBeanAwaitility.getSystemManagementService;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import java.lang.management.ManagementFactory;
import org.junit.Test;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.Region;
import org.apache.geode.cache.RegionFactory;
import org.apache.geode.cache.RegionShortcut;
import org.apache.geode.distributed.internal.InternalDistributedSystem;
import org.apache.geode.internal.NanoTimer;
import org.apache.geode.internal.cache.GemFireCacheImpl;
import org.apache.geode.internal.cache.InternalCache;
import org.apache.geode.internal.process.ProcessUtils;
import org.apache.geode.internal.statistics.HostStatSampler;
import org.apache.geode.internal.statistics.SampleCollector;
import org.apache.geode.test.awaitility.GeodeAwaitility;
import org.apache.geode.test.dunit.VM;
/**
* Distributed tests for {@link MemberMXBean} attributes.
*/
@SuppressWarnings({"serial", "unused"})
public class MemberMBeanAttributesDUnitTest extends ManagementTestBase {
private static final long BYTES_PER_MEGABYTE = 1024 * 1024;
@Test
public void testReplRegionAttributes() throws Exception {
initManagement(false);
setupForReplicateRegionAttributes(managedNodeList.get(0), 1);
setupForReplicateRegionAttributes(managedNodeList.get(1), 201);
sampleStatistics(managedNodeList.get(1));// Sample now
validateReplicateRegionAttributes(managedNodeList.get(1));
}
@Test
public void testPRRegionAttributes() throws Exception {
initManagement(false);
setupForPartitionedRegionAttributes(managedNodeList.get(0), 1);
sampleStatistics(managedNodeList.get(0));// Sample now
validatePartitionedRegionAttributes(managedNodeList.get(0));
}
@Test
public void testOSAttributes() throws Exception {
initManagement(false);
validateSystemAndOSAttributes(managedNodeList.get(0));
}
@Test
public void testConfigAttributes() throws Exception {
initManagement(false);
validateConfigAttributes(managedNodeList.get(0));
}
private void sampleStatistics(final VM vm) {
vm.invoke("sampleStatistics", () -> {
InternalDistributedSystem system = getInternalDistributedSystem();
HostStatSampler sampler = system.getStatSampler();
SampleCollector sampleCollector = sampler.getSampleCollector();
sampleCollector.sample(NanoTimer.getTime());
});
}
private void setupForReplicateRegionAttributes(final VM vm, final int offset) {
vm.invoke("setupForReplicateRegionAttributes", () -> {
Cache cache = getInternalCache();
RegionFactory regionFactory = cache.createRegionFactory(RegionShortcut.REPLICATE);
regionFactory.create("testRegion1");
regionFactory.create("testRegion2");
regionFactory.create("testRegion3");
Region region1 = cache.getRegion("/testRegion1");
regionFactory.createSubregion(region1, "testSubRegion1");
Region region2 = cache.getRegion("/testRegion2");
regionFactory.createSubregion(region2, "testSubRegion2");
Region region3 = cache.getRegion("/testRegion3");
regionFactory.createSubregion(region3, "testSubRegion3");
for (int i = offset; i < offset + 200; i++) {
region1.put(i, i);
region2.put(i, i);
region3.put(i, i);
}
});
}
private void setupForPartitionedRegionAttributes(final VM vm, final int offset) {
vm.invoke("setupForPartitionedRegionAttributes", () -> {
Cache cache = getInternalCache();
RegionFactory regionFactory = cache.createRegionFactory(RegionShortcut.PARTITION_REDUNDANT);
regionFactory.create("testPRRegion1");
regionFactory.create("testPRRegion2");
regionFactory.create("testPRRegion3");
Region region1 = cache.getRegion("/testPRRegion1");
Region region2 = cache.getRegion("/testPRRegion2");
Region region3 = cache.getRegion("/testPRRegion3");
for (int i = offset; i < offset + 200; i++) {
region1.put(i, i);
region2.put(i, i);
region3.put(i, i);
}
});
}
/**
* This will check all the attributes which does not depend on any distribution message.
*/
private void validatePartitionedRegionAttributes(final VM vm) {
vm.invoke("validatePartitionedRegionAttributes", () -> {
MemberMXBean memberMXBean = getSystemManagementService().getMemberMXBean();
assertEquals(3, memberMXBean.getPartitionRegionCount());
assertEquals(339, memberMXBean.getTotalBucketCount());
assertEquals(339, memberMXBean.getTotalPrimaryBucketCount());
});
}
/**
* This will check all the attributes which does not depend on any distribution message.
*/
private void validateReplicateRegionAttributes(final VM vm) {
vm.invoke("validateReplicateRegionAttributes", () -> {
MemberMXBean memberMXBean = getSystemManagementService().getMemberMXBean();
assertEquals(6, memberMXBean.getTotalRegionCount());
assertEquals(1200, memberMXBean.getTotalRegionEntryCount());
assertEquals(3, memberMXBean.getRootRegionNames().length);
assertEquals(600, memberMXBean.getInitialImageKeysReceived());
assertEquals(6, memberMXBean.listRegions().length);
});
}
/**
* This will check all the attributes which does not depend on any distribution message.
*/
private void validateSystemAndOSAttributes(final VM vm) {
vm.invoke("validateSystemAndOSAttributes", () -> {
MemberMXBean memberMXBean = getSystemManagementService().getMemberMXBean();
assertThat(memberMXBean.getProcessId()).isEqualTo(ProcessUtils.identifyPid());
assertThat(memberMXBean.getClassPath()).isEqualTo(getClassPath());
assertThat(memberMXBean.getCurrentTime()).isGreaterThan(0);
GeodeAwaitility.await()
.untilAsserted(() -> assertThat(memberMXBean.getMemberUpTime()).isGreaterThan(0));
assertThat(memberMXBean.getUsedMemory()).isGreaterThan(10);
assertThat(memberMXBean.getCurrentHeapSize()).isGreaterThan(10);
assertThat(memberMXBean.getFreeMemory()).isGreaterThan(0);
assertThat(memberMXBean.getFreeHeapSize()).isGreaterThan(0);
assertThat(memberMXBean.getMaxMemory()).isEqualTo(getHeapMemoryUsageMegabytes());
assertThat(memberMXBean.getMaximumHeapSize()).isEqualTo(getHeapMemoryUsageMegabytes());
assertThat(memberMXBean.fetchJvmThreads().length).isGreaterThan(0);
// TODO: provide better/more validation
// System.out.println(" CPU Usage is "+ bean.getCpuUsage());
// assertTrue(bean.getCpuUsage() > 0.0f);
// bean.getFileDescriptorLimit()
});
}
private void validateConfigAttributes(final VM vm) {
vm.invoke("validateConfigAttributes", () -> {
MemberMXBean memberMXBean = getSystemManagementService().getMemberMXBean();
assertFalse(memberMXBean.hasGatewayReceiver());
assertFalse(memberMXBean.hasGatewaySender());
assertFalse(memberMXBean.isLocator());
assertFalse(memberMXBean.isManager());
assertFalse(memberMXBean.isServer());
assertFalse(memberMXBean.isManagerCreated());
});
}
private String getClassPath() {
return ManagementFactory.getRuntimeMXBean().getClassPath();
}
private long getHeapMemoryUsageMegabytes() {
return ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getMax() / BYTES_PER_MEGABYTE;
}
private InternalDistributedSystem getInternalDistributedSystem() {
return InternalDistributedSystem.getConnectedInstance();
}
private InternalCache getInternalCache() {
return GemFireCacheImpl.getInstance();
}
}