mirror of https://github.com/apache/lucene.git
SOLR-2592: test expected number of requests to servers
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1421644 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8295491e12
commit
2d4615acdb
|
@ -19,13 +19,17 @@ package org.apache.solr.client.solrj.embedded;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.HashMap;
|
import java.util.LinkedList;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
|
||||||
import javax.servlet.DispatcherType;
|
import javax.servlet.DispatcherType;
|
||||||
import javax.servlet.Filter;
|
import javax.servlet.Filter;
|
||||||
|
import javax.servlet.FilterChain;
|
||||||
|
import javax.servlet.FilterConfig;
|
||||||
|
import javax.servlet.ServletException;
|
||||||
|
import javax.servlet.ServletRequest;
|
||||||
|
import javax.servlet.ServletResponse;
|
||||||
import javax.servlet.http.HttpServlet;
|
import javax.servlet.http.HttpServlet;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
@ -53,6 +57,7 @@ public class JettySolrRunner {
|
||||||
Server server;
|
Server server;
|
||||||
|
|
||||||
FilterHolder dispatchFilter;
|
FilterHolder dispatchFilter;
|
||||||
|
FilterHolder debugFilter;
|
||||||
|
|
||||||
String context;
|
String context;
|
||||||
|
|
||||||
|
@ -73,6 +78,53 @@ public class JettySolrRunner {
|
||||||
|
|
||||||
private boolean stopAtShutdown;
|
private boolean stopAtShutdown;
|
||||||
|
|
||||||
|
public static class DebugFilter implements Filter {
|
||||||
|
public int requestsToKeep = 10;
|
||||||
|
private AtomicLong nRequests = new AtomicLong();
|
||||||
|
|
||||||
|
public long getTotalRequests() {
|
||||||
|
return nRequests.get();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: keep track of certain number of last requests
|
||||||
|
private LinkedList<HttpServletRequest> requests = new LinkedList<HttpServletRequest>();
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void init(FilterConfig filterConfig) throws ServletException {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
||||||
|
nRequests.incrementAndGet();
|
||||||
|
|
||||||
|
/***
|
||||||
|
HttpServletRequest req = (HttpServletRequest)servletRequest;
|
||||||
|
HttpServletResponse resp = (HttpServletResponse)servletResponse;
|
||||||
|
|
||||||
|
String path = req.getServletPath();
|
||||||
|
if( req.getPathInfo() != null ) {
|
||||||
|
// this lets you handle /update/commit when /update is a servlet
|
||||||
|
path += req.getPathInfo();
|
||||||
|
}
|
||||||
|
System.out.println("###################### FILTER request " + servletRequest);
|
||||||
|
System.out.println("\t\tgetServletPath="+req.getServletPath());
|
||||||
|
System.out.println("\t\tgetPathInfo="+req.getPathInfo());
|
||||||
|
***/
|
||||||
|
|
||||||
|
filterChain.doFilter(servletRequest, servletResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroy() {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public JettySolrRunner(String solrHome, String context, int port) {
|
public JettySolrRunner(String solrHome, String context, int port) {
|
||||||
this.init(solrHome, context, port, true);
|
this.init(solrHome, context, port, true);
|
||||||
}
|
}
|
||||||
|
@ -174,6 +226,7 @@ public class JettySolrRunner {
|
||||||
schemaFilename);
|
schemaFilename);
|
||||||
// SolrDispatchFilter filter = new SolrDispatchFilter();
|
// SolrDispatchFilter filter = new SolrDispatchFilter();
|
||||||
// FilterHolder fh = new FilterHolder(filter);
|
// FilterHolder fh = new FilterHolder(filter);
|
||||||
|
debugFilter = root.addFilter(DebugFilter.class, "*", EnumSet.of(DispatcherType.REQUEST) );
|
||||||
dispatchFilter = root.addFilter(SolrDispatchFilter.class, "*", EnumSet.of(DispatcherType.REQUEST) );
|
dispatchFilter = root.addFilter(SolrDispatchFilter.class, "*", EnumSet.of(DispatcherType.REQUEST) );
|
||||||
if (solrConfigFilename != null) System.clearProperty("solrconfig");
|
if (solrConfigFilename != null) System.clearProperty("solrconfig");
|
||||||
if (schemaFilename != null) System.clearProperty("schema");
|
if (schemaFilename != null) System.clearProperty("schema");
|
||||||
|
@ -295,6 +348,10 @@ public class JettySolrRunner {
|
||||||
return lastPort;
|
return lastPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DebugFilter getDebugFilter() {
|
||||||
|
return (DebugFilter)debugFilter.getFilter();
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------------
|
// --------------------------------------------------------------
|
||||||
// --------------------------------------------------------------
|
// --------------------------------------------------------------
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,13 @@ import java.util.Set;
|
||||||
|
|
||||||
|
|
||||||
public class ShardRoutingTest extends AbstractFullDistribZkTestBase {
|
public class ShardRoutingTest extends AbstractFullDistribZkTestBase {
|
||||||
|
|
||||||
|
String bucket1 = "shard1"; // shard1: top bits:10 80000000:bfffffff
|
||||||
|
String bucket2 = "shard2"; // shard2: top bits:11 c0000000:ffffffff
|
||||||
|
String bucket3 = "shard3"; // shard3: top bits:00 00000000:3fffffff
|
||||||
|
String bucket4 = "shard4"; // shard4: top bits:01 40000000:7fffffff
|
||||||
|
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void beforeShardHashingTest() throws Exception {
|
public static void beforeShardHashingTest() throws Exception {
|
||||||
// TODO: we use an fs based dir because something
|
// TODO: we use an fs based dir because something
|
||||||
|
@ -109,6 +116,7 @@ public class ShardRoutingTest extends AbstractFullDistribZkTestBase {
|
||||||
waitForRecoveriesToFinish(false);
|
waitForRecoveriesToFinish(false);
|
||||||
|
|
||||||
doHashingTest();
|
doHashingTest();
|
||||||
|
doTestNumRequests();
|
||||||
|
|
||||||
testFinished = true;
|
testFinished = true;
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -127,10 +135,6 @@ public class ShardRoutingTest extends AbstractFullDistribZkTestBase {
|
||||||
// for now, we know how ranges will be distributed to shards.
|
// for now, we know how ranges will be distributed to shards.
|
||||||
// may have to look it up in clusterstate if that assumption changes.
|
// may have to look it up in clusterstate if that assumption changes.
|
||||||
|
|
||||||
String bucket1 = "shard1"; // shard1: top bits:10 80000000:bfffffff
|
|
||||||
String bucket2 = "shard2"; // shard2: top bits:11 c0000000:ffffffff
|
|
||||||
String bucket3 = "shard3"; // shard3: top bits:00 00000000:3fffffff
|
|
||||||
String bucket4 = "shard4"; // shard4: top bits:01 40000000:7fffffff
|
|
||||||
|
|
||||||
doAddDoc("b!doc1");
|
doAddDoc("b!doc1");
|
||||||
doAddDoc("c!doc2");
|
doAddDoc("c!doc2");
|
||||||
|
@ -196,10 +200,73 @@ public class ShardRoutingTest extends AbstractFullDistribZkTestBase {
|
||||||
doAddDoc("e!doc4");
|
doAddDoc("e!doc4");
|
||||||
|
|
||||||
commit();
|
commit();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void doTestNumRequests() throws Exception {
|
||||||
|
|
||||||
|
List<CloudJettyRunner> runners = shardToJetty.get(bucket1);
|
||||||
|
CloudJettyRunner leader = shardToLeaderJetty.get(bucket1);
|
||||||
|
CloudJettyRunner replica = null;
|
||||||
|
for (CloudJettyRunner r : runners) {
|
||||||
|
if (r != leader) replica = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
long nStart = getNumRequests();
|
||||||
|
leader.client.solrClient.add( sdoc("id","b!doc1") );
|
||||||
|
long nEnd = getNumRequests();
|
||||||
|
assertEquals(2, nEnd - nStart); // one request to leader, which makes another to a replica
|
||||||
|
|
||||||
|
|
||||||
|
nStart = getNumRequests();
|
||||||
|
replica.client.solrClient.add( sdoc("id","b!doc1") );
|
||||||
|
nEnd = getNumRequests();
|
||||||
|
assertEquals(3, nEnd - nStart); // orig request + replica forwards to leader, which forward back to replica.
|
||||||
|
|
||||||
|
nStart = getNumRequests();
|
||||||
|
replica.client.solrClient.add( sdoc("id","b!doc1") );
|
||||||
|
nEnd = getNumRequests();
|
||||||
|
assertEquals(3, nEnd - nStart); // orig request + replica forwards to leader, which forward back to replica.
|
||||||
|
|
||||||
|
CloudJettyRunner leader2 = shardToLeaderJetty.get(bucket2);
|
||||||
|
|
||||||
|
|
||||||
|
nStart = getNumRequests();
|
||||||
|
replica.client.solrClient.query( params("q","*:*", "shards",bucket1) );
|
||||||
|
nEnd = getNumRequests();
|
||||||
|
assertEquals(1, nEnd - nStart); // short circuit should prevent distrib search
|
||||||
|
|
||||||
|
nStart = getNumRequests();
|
||||||
|
replica.client.solrClient.query( params("q","*:*", "shard.keys","b!") );
|
||||||
|
nEnd = getNumRequests();
|
||||||
|
assertEquals(1, nEnd - nStart); // short circuit should prevent distrib search
|
||||||
|
|
||||||
|
nStart = getNumRequests();
|
||||||
|
leader2.client.solrClient.query( params("q","*:*", "shard.keys","b!") );
|
||||||
|
nEnd = getNumRequests();
|
||||||
|
assertEquals(3, nEnd - nStart); // original + 2 phase distrib search. we could improve this!
|
||||||
|
|
||||||
|
nStart = getNumRequests();
|
||||||
|
leader2.client.solrClient.query( params("q","*:*") );
|
||||||
|
nEnd = getNumRequests();
|
||||||
|
assertEquals(9, nEnd - nStart); // original + 2 phase distrib search * 4 shards.
|
||||||
|
|
||||||
|
nStart = getNumRequests();
|
||||||
|
leader2.client.solrClient.query( params("q","*:*", "shard.keys","b!,d!") );
|
||||||
|
nEnd = getNumRequests();
|
||||||
|
assertEquals(5, nEnd - nStart); // original + 2 phase distrib search * 2 shards.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
long getNumRequests() {
|
||||||
|
long n = controlJetty.getDebugFilter().getTotalRequests();
|
||||||
|
for (JettySolrRunner jetty : jettys) {
|
||||||
|
n += jetty.getDebugFilter().getTotalRequests();
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void doAddDoc(String id) throws Exception {
|
void doAddDoc(String id) throws Exception {
|
||||||
index("id",id);
|
index("id",id);
|
||||||
// todo - target diff servers and use cloud clients as well as non-cloud clients
|
// todo - target diff servers and use cloud clients as well as non-cloud clients
|
||||||
|
|
Loading…
Reference in New Issue