package voldemort.client; import static org.junit.Assert.assertFalse; import static org.junit.Assert.fail; import java.lang.management.ManagementFactory; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Set; import javax.management.MBeanServer; import javax.management.ObjectName; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runners.Parameterized.Parameters; import voldemort.utils.JmxUtils; /** * * Smoke test to see how many Mbeans we create in each monitoring domain * */ public class SocketStoreClientFactoryMbeanTest extends SocketStoreClientFactoryTest { // there should one of these per store (that has a store client), per // factory private static String STATS_DOMAIN = "voldemort.store.stats"; private static String AGGREGATE_STATS_DOMAIN = "voldemort.store.stats.aggregate"; private static String PIPELINE_ROUTED_STATS_DOMAIN = "voldemort.store.routed"; // there should one of these per factory private static String CLIENT_DOMAIN = "voldemort.client"; private static String CLUSTER_FAILUREDETECTOR_DOMAIN = "voldemort.cluster.failuredetector"; // there should be one of these per factory per host in the cluster the // factory talks to (plus one aggregate) private static String CLIENT_REQUEST_DOMAIN = "voldemort.store.socket.clientrequest"; private MBeanServer mbServer = null; // list of factory objects to be closed at the end. private List<StoreClientFactory> factories; public SocketStoreClientFactoryMbeanTest(boolean useNio, boolean useLazy, boolean fetchAllStoresXml) { super(useNio, useLazy, fetchAllStoresXml); } @Override @Before public void setUp() throws Exception { super.setUp(); mbServer = ManagementFactory.getPlatformMBeanServer(); factories = new ArrayList<StoreClientFactory>(); } @Override @After public void tearDown() throws Exception { mbServer = null; for(StoreClientFactory factory: factories) factory.close(); super.tearDown(); } @Parameters public static Collection<Object[]> configs() { return Arrays.asList(new Object[][] { { true, false, false } }); } private void checkMbeanIdCount(String domain, String type, int maxMbeans, boolean unregister) { ObjectName oName = JmxUtils.createObjectName(domain, type); Set<ObjectName> objects = mbServer.queryNames(oName, null); String messagePrefix = "Domain " + domain + " expected Size " + maxMbeans + " actual size " + objects.size(); assertFalse(messagePrefix + ". Extra mbeans found", objects.size() > maxMbeans); assertFalse(messagePrefix + ". Fewer than expected mbeans found", objects.size() < maxMbeans); if(unregister) { try { for(ObjectName objName: objects) mbServer.unregisterMBean(objName); } catch(Exception e) { fail("Problem unregistering mbeans " + e.getMessage()); } } } private void bootStrap(List<DefaultStoreClient<Object, Object>> clients, int n) { for(int i = 0; i < n; i++) { for(DefaultStoreClient<Object, Object> client: clients) client.bootStrap(); } } @Test public void testMultipleDistinctClientsOnSingleFactory() { try { StoreClientFactory factory = getFactory(getValidBootstrapUrl()); List<DefaultStoreClient<Object, Object>> clients = new ArrayList<DefaultStoreClient<Object, Object>>(); clients.add((DefaultStoreClient<Object, Object>) factory.getStoreClient("test")); clients.add((DefaultStoreClient<Object, Object>) factory.getStoreClient("best")); factories.add(factory); // bootstrap a number of times bootStrap(clients, 10); checkMbeanIdCount(CLIENT_DOMAIN, "ClientThreadPool*", 1, true); checkMbeanIdCount(CLIENT_DOMAIN, "*StoreClient*", 2, true); checkMbeanIdCount(CLUSTER_FAILUREDETECTOR_DOMAIN, "ThresholdFailureDetector*", 1, true); checkMbeanIdCount(PIPELINE_ROUTED_STATS_DOMAIN, "*", 2, true); checkMbeanIdCount(CLIENT_REQUEST_DOMAIN, "aggregated*", 1, true); checkMbeanIdCount(CLIENT_REQUEST_DOMAIN, "stats_localhost*", 1, true); checkMbeanIdCount(AGGREGATE_STATS_DOMAIN, "aggregate-perf*", 1, true); checkMbeanIdCount(STATS_DOMAIN, "*", 2, true); } catch(Exception e) { fail("Unexpected error " + e.getMessage()); } } @Test public void testMultipleIndistinctClientsOnSingleFactory() { try { StoreClientFactory factory = getFactory(getValidBootstrapUrl()); List<DefaultStoreClient<Object, Object>> clients = new ArrayList<DefaultStoreClient<Object, Object>>(); clients.add((DefaultStoreClient<Object, Object>) factory.getStoreClient("test")); clients.add((DefaultStoreClient<Object, Object>) factory.getStoreClient("best")); clients.add((DefaultStoreClient<Object, Object>) factory.getStoreClient("test")); clients.add((DefaultStoreClient<Object, Object>) factory.getStoreClient("best")); factories.add(factory); // bootstrap a number of times bootStrap(clients, 10); checkMbeanIdCount(CLIENT_DOMAIN, "ClientThreadPool*", 1, true); checkMbeanIdCount(CLIENT_DOMAIN, "*StoreClient*", 2, true); checkMbeanIdCount(CLUSTER_FAILUREDETECTOR_DOMAIN, "ThresholdFailureDetector*", 1, true); checkMbeanIdCount(PIPELINE_ROUTED_STATS_DOMAIN, "*", 2, true); checkMbeanIdCount(CLIENT_REQUEST_DOMAIN, "aggregated*", 1, true); checkMbeanIdCount(CLIENT_REQUEST_DOMAIN, "stats_localhost*", 1, true); checkMbeanIdCount(AGGREGATE_STATS_DOMAIN, "aggregate-perf*", 1, true); checkMbeanIdCount(STATS_DOMAIN, "*", 2, true); } catch(Exception e) { fail("Unexpected error " + e.getMessage()); } } @Test public void testMultipleDistinctClientsOnMultipleFactories() { try { StoreClientFactory testfactory = getFactory(getValidBootstrapUrl()); List<DefaultStoreClient<Object, Object>> clients = new ArrayList<DefaultStoreClient<Object, Object>>(); clients.add((DefaultStoreClient<Object, Object>) testfactory.getStoreClient("test")); StoreClientFactory bestfactory = getFactory(getValidBootstrapUrl()); clients.add((DefaultStoreClient<Object, Object>) bestfactory.getStoreClient("best")); factories.add(testfactory); factories.add(bestfactory); // bootstrap a number of times bootStrap(clients, 10); checkMbeanIdCount(CLIENT_DOMAIN, "ClientThreadPool*", 2, true); checkMbeanIdCount(CLIENT_DOMAIN, "*StoreClient*", 2, true); checkMbeanIdCount(CLUSTER_FAILUREDETECTOR_DOMAIN, "ThresholdFailureDetector*", 2, true); checkMbeanIdCount(PIPELINE_ROUTED_STATS_DOMAIN, "*", 2, true); checkMbeanIdCount(CLIENT_REQUEST_DOMAIN, "aggregated*", 2, true); checkMbeanIdCount(CLIENT_REQUEST_DOMAIN, "stats_localhost*", 2, true); checkMbeanIdCount(AGGREGATE_STATS_DOMAIN, "aggregate-perf*", 2, true); checkMbeanIdCount(STATS_DOMAIN, "*", 2, true); } catch(Exception e) { fail("Unexpected error " + e.getMessage()); } } @Test public void testMultipleInDistinctClientsOnMultipleFactories() { try { StoreClientFactory factory1 = getFactory(getValidBootstrapUrl()); List<DefaultStoreClient<Object, Object>> clients = new ArrayList<DefaultStoreClient<Object, Object>>(); clients.add((DefaultStoreClient<Object, Object>) factory1.getStoreClient("test")); clients.add((DefaultStoreClient<Object, Object>) factory1.getStoreClient("test")); clients.add((DefaultStoreClient<Object, Object>) factory1.getStoreClient("best")); clients.add((DefaultStoreClient<Object, Object>) factory1.getStoreClient("best")); factories.add(factory1); StoreClientFactory factory2 = getFactory(getValidBootstrapUrl()); clients.add((DefaultStoreClient<Object, Object>) factory2.getStoreClient("test")); clients.add((DefaultStoreClient<Object, Object>) factory2.getStoreClient("test")); clients.add((DefaultStoreClient<Object, Object>) factory2.getStoreClient("best")); clients.add((DefaultStoreClient<Object, Object>) factory2.getStoreClient("best")); factories.add(factory2); // bootstrap a number of times bootStrap(clients, 10); checkMbeanIdCount(CLIENT_DOMAIN, "ClientThreadPool*", 2, true); checkMbeanIdCount(CLIENT_DOMAIN, "*StoreClient*", 2, true); checkMbeanIdCount(CLUSTER_FAILUREDETECTOR_DOMAIN, "ThresholdFailureDetector*", 2, true); checkMbeanIdCount(PIPELINE_ROUTED_STATS_DOMAIN, "*", 4, true); checkMbeanIdCount(CLIENT_REQUEST_DOMAIN, "aggregated*", 2, true); checkMbeanIdCount(CLIENT_REQUEST_DOMAIN, "stats_localhost*", 2, true); checkMbeanIdCount(AGGREGATE_STATS_DOMAIN, "aggregate-perf*", 2, true); checkMbeanIdCount(STATS_DOMAIN, "*", 4, true); } catch(Exception e) { fail("Unexpected error " + e.getMessage()); } } }