@Test public void testSchemataSM() throws Exception { String className = TestHelper.getTestClassName(); String methodName = TestHelper.getTestMethodName(); String clusterName = className + "_" + methodName; int n = 5; MockParticipant[] participants = new MockParticipant[n]; System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis())); TestHelper.setupCluster( clusterName, _zkaddr, 12918, // participant start port "localhost", // participant name prefix "TestSchemata", // resource name prefix 1, // resources 1, // partitions per resource n, // number of nodes 0, // replicas "STORAGE_DEFAULT_SM_SCHEMATA", false); // don't rebalance // rebalance ideal-state to use ANY_LIVEINSTANCE for preference list ZKHelixDataAccessor accessor = new ZKHelixDataAccessor(clusterName, _baseAccessor); PropertyKey.Builder keyBuilder = accessor.keyBuilder(); PropertyKey key = keyBuilder.idealStates("TestSchemata0"); IdealState idealState = accessor.getProperty(key); idealState.setReplicas(HelixConstants.StateModelToken.ANY_LIVEINSTANCE.toString()); idealState .getRecord() .setListField( "TestSchemata0_0", Arrays.asList(HelixConstants.StateModelToken.ANY_LIVEINSTANCE.toString())); accessor.setProperty(key, idealState); MockController controller = new MockController(_zkaddr, clusterName, "controller"); controller.syncStart(); // start n-1 participants for (int i = 1; i < n; i++) { String instanceName = "localhost_" + (12918 + i); participants[i] = new MockParticipant(_zkaddr, clusterName, instanceName); participants[i].syncStart(); } boolean result = ClusterStateVerifier.verifyByZkCallback( new BestPossAndExtViewZkVerifier(_zkaddr, clusterName)); Assert.assertTrue(result); // start the remaining 1 participant participants[0] = new MockParticipant(_zkaddr, clusterName, "localhost_12918"); participants[0].syncStart(); // make sure we have all participants in MASTER state result = ClusterStateVerifier.verifyByZkCallback( new BestPossAndExtViewZkVerifier(_zkaddr, clusterName)); Assert.assertTrue(result); key = keyBuilder.externalView("TestSchemata0"); ExternalView externalView = accessor.getProperty(key); Map<String, String> stateMap = externalView.getStateMap("TestSchemata0_0"); Assert.assertNotNull(stateMap); Assert.assertEquals(stateMap.size(), n, "all " + n + " participants should be in Master state"); for (int i = 0; i < n; i++) { String instanceName = "localhost_" + (12918 + i); Assert.assertNotNull(stateMap.get(instanceName)); Assert.assertEquals(stateMap.get(instanceName), "MASTER"); } // clean up controller.syncStop(); for (int i = 0; i < n; i++) { participants[i].syncStop(); } System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis())); }
@Test public void testSessionExpiryInTransition() throws Exception { String className = TestHelper.getTestClassName(); String methodName = TestHelper.getTestMethodName(); final String clusterName = className + "_" + methodName; int n = 1; CountDownLatch startCountdown = new CountDownLatch(1); CountDownLatch endCountdown = new CountDownLatch(1); System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis())); MockParticipant[] participants = new MockParticipant[n]; TestHelper.setupCluster( clusterName, _zkaddr, 12918, // participant port "localhost", // participant name prefix "TestDB", // resource name prefix 1, // resources 1, // partitions per resource n, // number of nodes 1, // replicas "MasterSlave", true); // do rebalance // start controller MockController controller = new MockController(_zkaddr, clusterName, "controller_0"); controller.syncStart(); // start participants for (int i = 0; i < n; i++) { String instanceName = "localhost_" + (12918 + i); participants[i] = new MockParticipant(_zkaddr, clusterName, instanceName); participants[i].setTransition(new SessionExpiryTransition(startCountdown, endCountdown)); participants[i].syncStart(); } // wait transition happens to trigger session expiry startCountdown.await(); String oldSessionId = participants[0].getSessionId(); System.out.println("oldSessionId: " + oldSessionId); ZkTestHelper.expireSession(participants[0].getZkClient()); boolean result = ClusterStateVerifier.verifyByZkCallback( new BestPossAndExtViewZkVerifier(_zkaddr, clusterName)); Assert.assertTrue(result); String newSessionId = participants[0].getSessionId(); Assert.assertNotSame(newSessionId, oldSessionId); // assert interrupt exception error in old session String errPath = PropertyPathConfig.getPath( PropertyType.ERRORS, clusterName, "localhost_12918", oldSessionId, "TestDB0", "TestDB0_0"); ZNRecord error = _zkclient.readData(errPath); Assert.assertNotNull( error, "InterruptedException should happen in old session since task is being cancelled during handleNewSession"); String errString = new String(new ZNRecordSerializer().serialize(error)); Assert.assertTrue(errString.indexOf("InterruptedException") != -1); // cleanup controller.syncStop(); for (int i = 0; i < n; i++) { participants[i].syncStop(); } System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis())); }
@Test public void testStandalone() throws Exception { String testName = TestUtil.getTestName(); String clusterName = testName; // className + "_standalone"; System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis())); final int nodeNr = 5; TestHelper.setupCluster( clusterName, _zkaddr, 12918, "localhost", "TestDB", 1, 20, nodeNr - 1, 3, "MasterSlave", true); MockParticipant[] participants = new MockParticipant[nodeNr]; for (int i = 0; i < nodeNr - 1; i++) { String instanceName = "localhost_" + (12918 + i); participants[i] = new MockParticipant(_zkaddr, clusterName, instanceName); participants[i].syncStart(); } MockController controller = new MockController(_zkaddr, clusterName, "controller_0"); controller.syncStart(); boolean result; result = ClusterStateVerifier.verifyByPolling( new ClusterStateVerifier.BestPossAndExtViewZkVerifier(_zkaddr, clusterName)); Assert.assertTrue(result); String msgPath = PropertyPathConfig.getPath(PropertyType.MESSAGES, clusterName, "localhost_12918"); result = checkHandlers(controller.getHandlers(), msgPath); Assert.assertTrue(result); _setupTool.addInstanceToCluster(clusterName, "localhost_12922"); _setupTool.rebalanceStorageCluster(clusterName, "TestDB0", 3); participants[nodeNr - 1] = new MockParticipant(_zkaddr, clusterName, "localhost_12922"); new Thread(participants[nodeNr - 1]).start(); result = ClusterStateVerifier.verifyByPolling( new ClusterStateVerifier.BestPossAndExtViewZkVerifier(_zkaddr, clusterName)); Assert.assertTrue(result); msgPath = PropertyPathConfig.getPath(PropertyType.MESSAGES, clusterName, "localhost_12922"); result = checkHandlers(controller.getHandlers(), msgPath); Assert.assertTrue(result); // clean up controller.syncStop(); for (int i = 0; i < nodeNr; i++) { participants[i].syncStop(); } System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis())); }
@Test public void simpleSessionExpiryTest() throws Exception { // Logger.getRootLogger().setLevel(Level.WARN); String className = TestHelper.getTestClassName(); String methodName = TestHelper.getTestMethodName(); final String clusterName = className + "_" + methodName; int n = 1; System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis())); MockParticipant[] participants = new MockParticipant[n]; TestHelper.setupCluster( clusterName, _zkaddr, 12918, // participant port "localhost", // participant name prefix "TestDB", // resource name prefix 1, // resources 1, // partitions per resource n, // number of nodes 1, // replicas "MasterSlave", true); // do rebalance // start controller MockController controller = new MockController(_zkaddr, clusterName, "controller_0"); controller.syncStart(); // start participants for (int i = 0; i < n; i++) { String instanceName = "localhost_" + (12918 + i); participants[i] = new MockParticipant(_zkaddr, clusterName, instanceName); participants[i].syncStart(); } boolean result = ClusterStateVerifier.verifyByZkCallback( new BestPossAndExtViewZkVerifier(_zkaddr, clusterName)); Assert.assertTrue(result); String oldSessionId = participants[0].getSessionId(); // expire zk-connection on localhost_12918 ZkTestHelper.expireSession(participants[0].getZkClient()); // wait until session expiry callback happens TimeUnit.MILLISECONDS.sleep(100); result = ClusterStateVerifier.verifyByZkCallback( new BestPossAndExtViewZkVerifier(_zkaddr, clusterName)); Assert.assertTrue(result); String newSessionId = participants[0].getSessionId(); Assert.assertNotSame(newSessionId, oldSessionId); // cleanup controller.syncStop(); for (int i = 0; i < n; i++) { participants[i].syncStop(); } System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis())); }
@Test() public void testPauseSignal() throws Exception { // Logger.getRootLogger().setLevel(Level.INFO); String className = TestHelper.getTestClassName(); String methodName = TestHelper.getTestMethodName(); final String clusterName = className + "_" + methodName; System.out.println("START " + clusterName + " at " + new Date(System.currentTimeMillis())); MockParticipant[] participants = new MockParticipant[5]; TestHelper.setupCluster( clusterName, _zkaddr, 12918, // participant port "localhost", // participant name prefix "TestDB", // resource name prefix 1, // resources 10, // partitions per resource 5, // number of nodes 3, // replicas "MasterSlave", true); // do rebalance // start controller MockController controller = new MockController(_zkaddr, clusterName, "controller_0"); controller.syncStart(); // start participants for (int i = 0; i < 5; i++) { String instanceName = "localhost_" + (12918 + i); participants[i] = new MockParticipant(_zkaddr, clusterName, instanceName); participants[i].syncStart(); } boolean result = ClusterStateVerifier.verifyByZkCallback( new BestPossAndExtViewZkVerifier(_zkaddr, clusterName)); Assert.assertTrue(result); // pause the cluster and make sure pause is persistent ZkClient zkClient = new ZkClient(_zkaddr); zkClient.setZkSerializer(new ZNRecordSerializer()); final HelixDataAccessor tmpAccessor = new ZKHelixDataAccessor(clusterName, new ZkBaseDataAccessor<ZNRecord>(zkClient)); String cmd = "-zkSvr " + _zkaddr + " -enableCluster " + clusterName + " false"; ClusterSetup.processCommandLineArgs(cmd.split(" ")); tmpAccessor.setProperty(tmpAccessor.keyBuilder().pause(), new PauseSignal("pause")); zkClient.close(); // wait for controller to be signaled by pause Thread.sleep(1000); // add a new resource group _setupTool.addResourceToCluster(clusterName, "TestDB1", 10, "MasterSlave"); _setupTool.rebalanceStorageCluster(clusterName, "TestDB1", 3); // make sure TestDB1 external view is empty TestHelper.verifyWithTimeout( "verifyEmptyCurStateAndExtView", 1000, clusterName, "TestDB1", TestHelper.<String>setOf( "localhost_12918", "localhost_12919", "localhost_12920", "localhost_12921", "localhost_12922"), _zkaddr); // resume controller cmd = "-zkSvr " + _zkaddr + " -enableCluster " + clusterName + " true"; ClusterSetup.processCommandLineArgs(cmd.split(" ")); result = ClusterStateVerifier.verifyByZkCallback( new BestPossAndExtViewZkVerifier(_zkaddr, clusterName)); Assert.assertTrue(result); // clean up controller.syncStop(); for (int i = 0; i < 5; i++) { participants[i].syncStop(); } System.out.println("END " + clusterName + " at " + new Date(System.currentTimeMillis())); }