mirror of https://github.com/apache/lucene.git
SOLR-2957: collection URLs in a cluster
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1242800 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8a50cefc6b
commit
76f0587508
|
@ -25,6 +25,8 @@ import java.io.OutputStreamWriter;
|
|||
import java.io.ByteArrayInputStream;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Set;
|
||||
import java.util.WeakHashMap;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
@ -42,6 +44,10 @@ import javax.servlet.http.HttpServletResponse;
|
|||
import org.apache.solr.common.SolrException;
|
||||
import org.apache.solr.common.util.NamedList;
|
||||
import org.apache.solr.common.util.SimpleOrderedMap;
|
||||
import org.apache.solr.common.cloud.CloudState;
|
||||
import org.apache.solr.common.cloud.Slice;
|
||||
import org.apache.solr.common.cloud.ZkNodeProps;
|
||||
import org.apache.solr.common.cloud.ZkStateReader;
|
||||
import org.apache.solr.common.params.CommonParams;
|
||||
import org.apache.solr.common.util.FastWriter;
|
||||
import org.apache.solr.common.util.ContentStreamBase;
|
||||
|
@ -178,10 +184,24 @@ public class SolrDispatchFilter implements Filter
|
|||
}
|
||||
}
|
||||
if (core == null) {
|
||||
corename = "";
|
||||
core = cores.getCore("");
|
||||
if (cores.isZooKeeperAware() && corename.length() == 0) {
|
||||
core = cores.getCore("");
|
||||
} else if (!cores.isZooKeeperAware()) {
|
||||
core = cores.getCore("");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (core == null && cores.isZooKeeperAware()) {
|
||||
// we couldn't find the core - lets make sure a collection was not specified instead
|
||||
core = getCoreByCollection(cores, core, corename, path);
|
||||
|
||||
if (core != null) {
|
||||
// we found a core, update the path
|
||||
path = path.substring( idx );
|
||||
}
|
||||
// TODO: if we couldn't find it locally, look on other nodes
|
||||
}
|
||||
|
||||
// With a valid core...
|
||||
if( core != null ) {
|
||||
|
@ -280,6 +300,48 @@ public class SolrDispatchFilter implements Filter
|
|||
chain.doFilter(request, response);
|
||||
}
|
||||
|
||||
private SolrCore getCoreByCollection(CoreContainer cores, SolrCore core,
|
||||
String corename, String path) {
|
||||
String collection = corename;
|
||||
ZkStateReader zkStateReader = cores.getZkController().getZkStateReader();
|
||||
|
||||
CloudState cloudState = zkStateReader.getCloudState();
|
||||
Map<String,Slice> slices = cloudState.getSlices(collection);
|
||||
// look for a core on this node
|
||||
Set<Entry<String,Slice>> entries = slices.entrySet();
|
||||
done:
|
||||
for (Entry<String,Slice> entry : entries) {
|
||||
// first see if we have the leader
|
||||
ZkNodeProps leaderProps = cloudState.getLeader(collection, entry.getKey());
|
||||
core = checkProps(cores, core, path, leaderProps);
|
||||
if (core != null) {
|
||||
break done;
|
||||
}
|
||||
|
||||
// check everyone then
|
||||
Map<String,ZkNodeProps> shards = entry.getValue().getShards();
|
||||
Set<Entry<String,ZkNodeProps>> shardEntries = shards.entrySet();
|
||||
for (Entry<String,ZkNodeProps> shardEntry : shardEntries) {
|
||||
ZkNodeProps zkProps = shardEntry.getValue();
|
||||
core = checkProps(cores, core, path, zkProps);
|
||||
if (core != null) {
|
||||
break done;
|
||||
}
|
||||
}
|
||||
}
|
||||
return core;
|
||||
}
|
||||
|
||||
private SolrCore checkProps(CoreContainer cores, SolrCore core, String path,
|
||||
ZkNodeProps zkProps) {
|
||||
String corename;
|
||||
if (cores.getZkController().getNodeName().equals(zkProps.get(ZkStateReader.NODE_NAME_PROP))) {
|
||||
corename = zkProps.get(ZkStateReader.CORE_NAME_PROP);
|
||||
core = cores.getCore(corename);
|
||||
}
|
||||
return core;
|
||||
}
|
||||
|
||||
private void handleAdminRequest(HttpServletRequest req, ServletResponse response, SolrRequestHandler handler,
|
||||
SolrQueryRequest solrReq) throws IOException {
|
||||
SolrQueryResponse solrResp = new SolrQueryResponse();
|
||||
|
|
|
@ -62,6 +62,7 @@ public class BasicDistributedZkTest extends AbstractDistributedZkTestCase {
|
|||
|
||||
private Map<String,List<SolrServer>> otherCollectionClients = new HashMap<String,List<SolrServer>>();
|
||||
private Map<String,List<SolrServer>> oneInstanceCollectionClients = new HashMap<String,List<SolrServer>>();
|
||||
private String oneInstanceCollection = "oneInstanceCollection";;
|
||||
|
||||
public BasicDistributedZkTest() {
|
||||
fixShardCount = true;
|
||||
|
@ -245,27 +246,39 @@ public class BasicDistributedZkTest extends AbstractDistributedZkTestCase {
|
|||
|
||||
testMultipleCollections();
|
||||
testANewCollectionInOneInstance();
|
||||
testSearchByCollectionName();
|
||||
// Thread.sleep(10000000000L);
|
||||
if (DEBUG) {
|
||||
super.printLayout();
|
||||
}
|
||||
}
|
||||
|
||||
private void testSearchByCollectionName() throws SolrServerException {
|
||||
SolrServer client = clients.get(0);
|
||||
String baseUrl = ((CommonsHttpSolrServer) client).getBaseURL();
|
||||
|
||||
// the cores each have different names, but if we add the collection name to the url
|
||||
// we should get mapped to the right core
|
||||
SolrServer client1 = createNewSolrServer(oneInstanceCollection, baseUrl);
|
||||
SolrQuery query = new SolrQuery("*:*");
|
||||
long oneDocs = client1.query(query).getResults().getNumFound();
|
||||
assertEquals(3, oneDocs);
|
||||
}
|
||||
|
||||
private void testANewCollectionInOneInstance() throws Exception {
|
||||
String collection = "oneInstanceCollection";
|
||||
List<SolrServer> collectionClients = new ArrayList<SolrServer>();
|
||||
SolrServer client = clients.get(0);
|
||||
oneInstanceCollectionClients.put(collection, collectionClients);
|
||||
oneInstanceCollectionClients.put(oneInstanceCollection , collectionClients);
|
||||
String baseUrl = ((CommonsHttpSolrServer) client).getBaseURL();
|
||||
createCollection(collection, collectionClients, baseUrl, 1);
|
||||
createCollection(collection, collectionClients, baseUrl, 2);
|
||||
createCollection(collection, collectionClients, baseUrl, 3);
|
||||
createCollection(collection, collectionClients, baseUrl, 4);
|
||||
createCollection(oneInstanceCollection, collectionClients, baseUrl, 1);
|
||||
createCollection(oneInstanceCollection, collectionClients, baseUrl, 2);
|
||||
createCollection(oneInstanceCollection, collectionClients, baseUrl, 3);
|
||||
createCollection(oneInstanceCollection, collectionClients, baseUrl, 4);
|
||||
|
||||
SolrServer client1 = createNewSolrServer(collection + "1", baseUrl);
|
||||
SolrServer client2 = createNewSolrServer(collection + "2", baseUrl);
|
||||
SolrServer client3 = createNewSolrServer(collection + "3", baseUrl);
|
||||
SolrServer client4 = createNewSolrServer(collection + "4", baseUrl);
|
||||
SolrServer client1 = createNewSolrServer(oneInstanceCollection + "1", baseUrl);
|
||||
SolrServer client2 = createNewSolrServer(oneInstanceCollection + "2", baseUrl);
|
||||
SolrServer client3 = createNewSolrServer(oneInstanceCollection + "3", baseUrl);
|
||||
SolrServer client4 = createNewSolrServer(oneInstanceCollection + "4", baseUrl);
|
||||
|
||||
client2.add(getDoc(id, "1"));
|
||||
client3.add(getDoc(id, "2"));
|
||||
|
@ -279,7 +292,7 @@ public class BasicDistributedZkTest extends AbstractDistributedZkTestCase {
|
|||
long threeDocs = client3.query(query).getResults().getNumFound();
|
||||
long fourDocs = client4.query(query).getResults().getNumFound();
|
||||
|
||||
query.set("collection", collection);
|
||||
query.set("collection", oneInstanceCollection);
|
||||
query.set("distrib", true);
|
||||
long allDocs = solrj.query(query).getResults().getNumFound();
|
||||
|
||||
|
|
Loading…
Reference in New Issue