package net.sf.katta.integrationTest.lib.lucene; import net.sf.katta.client.NodeProxyManager; import net.sf.katta.client.ShardAccessException; import net.sf.katta.integrationTest.support.AbstractIntegrationTest; import net.sf.katta.lib.lucene.Hits; import net.sf.katta.lib.lucene.LuceneClient; import org.apache.lucene.analysis.KeywordAnalyzer; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Query; import org.apache.lucene.util.Version; import org.junit.Test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; public class LuceneClientFailoverTest extends AbstractIntegrationTest { public LuceneClientFailoverTest() { super(2); } @Test public void testSearchAndCount_NodeProxyDownAfterClientInitialization() throws Exception { deployTestIndices(1, getNodeCount()); // start search client LuceneClient luceneClient = new LuceneClient(_miniCluster.getZkConfiguration()); // shutdown proxy of node1 _miniCluster.getNode(0).getRpcServer().stop(); final Query query = new QueryParser(Version.LUCENE_35, "", new KeywordAnalyzer()).parse("content: the"); System.out.println("========================="); assertSearchResults(10, luceneClient.search(query, new String[] { INDEX_NAME }, 10)); assertEquals(937, luceneClient.count(query, new String[] { INDEX_NAME })); assertSearchResults(10, luceneClient.search(query, new String[] { INDEX_NAME }, 10)); assertEquals(937, luceneClient.count(query, new String[] { INDEX_NAME })); // search 2 time to ensure we get all availible nodes System.out.println("========================="); _miniCluster.shutdownNode(0); luceneClient.close(); } @Test public void testGetDetails_NodeProxyDownAfterClientInitialization() throws Exception { deployTestIndices(1, getNodeCount()); LuceneClient luceneClient = new LuceneClient(_miniCluster.getZkConfiguration()); ((NodeProxyManager) luceneClient.getClient().getProxyManager()).setSuccessiveProxyFailuresBeforeReestablishing(1); final Query query = new QueryParser(Version.LUCENE_35, "", new KeywordAnalyzer()).parse("content: the"); Hits hits = luceneClient.search(query, new String[] { INDEX_NAME }, 10); // shutdown proxy of node1 System.out.println("========================="); if (_miniCluster.getNode(0).getName().equals(hits.getHits().get(0).getNode())) { _miniCluster.shutdownNodeRpc(0); } else { _miniCluster.shutdownNodeRpc(1); } assertFalse(luceneClient.getDetails(hits.getHits().get(0)).isEmpty()); assertFalse(luceneClient.getDetails(hits.getHits().get(0)).isEmpty()); // search 2 time to ensure we get all available nodes System.out.println("========================="); shutdownNodes(); luceneClient.close(); } @Test public void testAllNodeProxyDownAfterClientInitialization() throws Exception { deployTestIndices(1, getNodeCount()); LuceneClient luceneClient = new LuceneClient(_miniCluster.getZkConfiguration()); final Query query = new QueryParser(Version.LUCENE_35, "", new KeywordAnalyzer()).parse("content: the"); for (int i = 0; i < _miniCluster.getRunningNodeCount(); i++) { _miniCluster.shutdownNodeRpc(i); } System.out.println("========================="); try { luceneClient.search(query, new String[] { INDEX_NAME }, 10); fail("should throw exception"); } catch (ShardAccessException e) { // expected } System.out.println("========================="); shutdownNodes(); luceneClient.close(); } private void assertSearchResults(int expectedResults, Hits hits) { assertNotNull(hits); assertEquals(expectedResults, hits.getHits().size()); } }