/** * Copyright 2008 the original author or authors. * * Licensed 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 net.sf.katta.integrationTest.loadtest; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import java.io.File; import net.sf.katta.AbstractTest; import net.sf.katta.client.DeployClient; import net.sf.katta.client.IIndexDeployFuture; import net.sf.katta.integrationTest.support.KattaMiniCluster; import net.sf.katta.lib.lucene.LuceneServer; import net.sf.katta.protocol.InteractionProtocol; import net.sf.katta.testutil.TestIoUtil; import net.sf.katta.testutil.TestResources; import net.sf.katta.testutil.TestUtil; import net.sf.katta.tool.loadtest.LoadTestMasterOperation; import net.sf.katta.tool.loadtest.query.LuceneSearchExecutor; import net.sf.katta.util.FileUtil; import net.sf.katta.util.NodeConfiguration; import net.sf.katta.util.SleepServer; import net.sf.katta.util.ZkConfiguration; import net.sf.katta.util.ZkKattaUtil; import org.I0Itec.zkclient.ZkServer; import org.apache.log4j.Logger; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; public class LuceneLoadIntegrationTest extends AbstractTest { private static final int NODE_COUNT_LOADTEST = 3; private static final int NODE_COUNT_LUCENE = 5; protected static final Logger LOG = Logger.getLogger(LuceneLoadIntegrationTest.class); // @Rule // public PrintMethodNames _printMethodNames = new PrintMethodNames(); private static ZkServer _zkServer; private static KattaMiniCluster _luceneCluster; private static KattaMiniCluster _loadtestCluster; @BeforeClass public static void onBeforeClass() throws Exception { ZkConfiguration conf1 = new ZkConfiguration(); ZkConfiguration conf2 = new ZkConfiguration(); conf1.setZKRootPath("LuceneLoadIntegrationTest/luceneCluster"); conf2.setZKRootPath("LuceneLoadIntegrationTest/loadtestCluster"); cleanup(conf1); cleanup(conf2); FileUtil.deleteFolder(new NodeConfiguration().getShardFolder()); _zkServer = ZkKattaUtil.startZkServer(new ZkConfiguration()); _luceneCluster = new KattaMiniCluster(LuceneServer.class, conf1, NODE_COUNT_LUCENE, 30000); _loadtestCluster = new KattaMiniCluster(SleepServer.class, conf2, NODE_COUNT_LOADTEST, 40000); _luceneCluster.setZkServer(_zkServer); _loadtestCluster.setZkServer(_zkServer); _luceneCluster.start(); _loadtestCluster.start(); TestUtil.waitUntilLeaveSafeMode(_luceneCluster.getMaster()); TestUtil.waitUntilLeaveSafeMode(_loadtestCluster.getMaster()); TestUtil.waitUntilNumberOfLiveNode(_luceneCluster.getProtocol(), NODE_COUNT_LUCENE); TestUtil.waitUntilNumberOfLiveNode(_loadtestCluster.getProtocol(), NODE_COUNT_LOADTEST); LOG.info("Deploying indices"); deployIndex(_luceneCluster.getProtocol(), "index1", TestResources.INDEX1); // Verify setup. // LOG.info("\n\nLUCENE CLUSTER STRUCTURE:\n"); // _luceneCluster.getProtocol().showStructure(false); // LOG.info("\n\nLOADTEST CLUSTER STRUCTURE:\n"); // _loadtestCluster.getProtocol().showStructure(false); } private static void cleanup(ZkConfiguration conf) { FileUtil.deleteFolder(new File(conf.getZKDataDir())); FileUtil.deleteFolder(new File(conf.getZKDataLogDir())); } @AfterClass public static void onAfterClass() throws Exception { _luceneCluster.stop(false); _loadtestCluster.stop(false); _zkServer.shutdown(); } private static void deployIndex(InteractionProtocol protocol, String indexName, File index) throws InterruptedException { DeployClient deployClient1 = new DeployClient(protocol); IIndexDeployFuture deployment = deployClient1.addIndex(indexName, index.getAbsolutePath(), 1); LOG.info("Joining deployment on " + deployment.getClass().getName()); deployment.joinDeployment(); } @Test public void testLuceneLoadTest() throws Exception { File resultDir = _temporaryFolder.newFolder("results"); int startRate = 10; int endRate = 50; int step = 10; int runTime = 2000; LuceneSearchExecutor queryExecutor = new LuceneSearchExecutor(new String[] { "*" }, new String[] { "foo:bar", "notExists" }, _luceneCluster.getZkConfiguration(), 200); LoadTestMasterOperation loadTestOperation = new LoadTestMasterOperation(NODE_COUNT_LOADTEST, startRate, endRate, step, runTime, queryExecutor, resultDir); loadTestOperation.registerCompletion(_loadtestCluster.getProtocol()); _loadtestCluster.getProtocol().addMasterOperation(loadTestOperation); loadTestOperation.joinCompletion(_loadtestCluster.getProtocol()); assertEquals(2, resultDir.list().length); File[] listFiles = resultDir.listFiles(); File logFile; File resultFile; if (listFiles[0].getName().contains("-results-")) { resultFile = listFiles[0]; logFile = listFiles[1]; } else { resultFile = listFiles[1]; logFile = listFiles[0]; } assertThat(TestIoUtil.countLines(logFile), almostEquals(300, 50)); int iterations = 1 + (endRate - startRate) / step; assertEquals(1 + iterations, TestIoUtil.countLines(resultFile)); } }