You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by gu...@apache.org on 2019/02/19 14:53:38 UTC
[lucene-solr] 01/09: SOLR-13150: first version
This is an automated email from the ASF dual-hosted git repository.
gus pushed a commit to branch solr-13131
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git
commit e142e851159222be3d38958269c26fb86b6b8b65
Author: internet <in...@localhost.localdomain>
AuthorDate: Thu Feb 14 19:44:54 2019 +0200
SOLR-13150: first version
---
.../cloud/api/collections/CategoryRoutedAlias.java | 24 ++++++++++-
.../CategoryRoutedAliasUpdateProcessorTest.java | 48 ++++++++++++++++++++++
.../solrj/request/CollectionAdminRequest.java | 11 +++++
3 files changed, 81 insertions(+), 2 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CategoryRoutedAlias.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CategoryRoutedAlias.java
index 3de1e41..c337ed5 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CategoryRoutedAlias.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CategoryRoutedAlias.java
@@ -106,6 +106,27 @@ public class CategoryRoutedAlias implements RoutedAlias {
@Override
public void validateRouteValue(AddUpdateCommand cmd) throws SolrException {
//Mostly this will be filled out by SOLR-13150 and SOLR-13151
+ String maxCardinality = aliasMetadata.get(ROUTER_MAX_CARDINALITY);
+ if(maxCardinality == null) {
+ return;
+ }
+
+ if (this.parsedAliases == null) {
+ updateParsedCollectionAliases(cmd.getReq().getCore().getCoreContainer().getZkController());
+ }
+
+ String dataValue = String.valueOf(cmd.getSolrInputDocument().getFieldValue(getRouteField()));
+ String candidateCollectionName = buildCollectionNameFromValue(dataValue);
+ List<String> colls = getCollectionList(this.parsedAliases);
+
+ if (colls.contains(candidateCollectionName)) {
+ return;
+ }
+
+ if (colls.stream()
+ .filter(x -> !x.contains(UNINITIALIZED)).count() >= Integer.valueOf(maxCardinality)) {
+ throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "max cardinality can not be exceeded for a Category Routed Alias: " + maxCardinality);
+ }
}
/**
@@ -130,8 +151,7 @@ public class CategoryRoutedAlias implements RoutedAlias {
CoreContainer coreContainer = core.getCoreContainer();
CollectionsHandler collectionsHandler = coreContainer.getCollectionsHandler();
String dataValue = String.valueOf(cmd.getSolrInputDocument().getFieldValue(getRouteField()));
-
- String candidateCollectionName = buildCollectionNameFromValue(dataValue);
+ String candidateCollectionName = buildCollectionNameFromValue(dataValue);
try {
// Note: CRA's have no way to predict values that determine collection so preemptive async creation
diff --git a/solr/core/src/test/org/apache/solr/update/processor/CategoryRoutedAliasUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/CategoryRoutedAliasUpdateProcessorTest.java
index 566e27d..3df7784 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/CategoryRoutedAliasUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/CategoryRoutedAliasUpdateProcessorTest.java
@@ -31,6 +31,7 @@ import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.client.solrj.request.ConfigSetAdminRequest;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.cloud.api.collections.CategoryRoutedAlias;
+import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.request.SolrQueryRequest;
@@ -216,6 +217,53 @@ public class CategoryRoutedAliasUpdateProcessorTest extends RoutedAliasUpdatePro
private String noDollar(String ship) {
return ship.replaceAll("\\$", "_");
}
+ @Slow
+ @Test
+ public void testMaxCardinality() throws Exception {
+ String configName = getSaferTestName();
+ createConfigSet(configName);
+
+ final int maxCardinality = 2;
+
+ // Start with one collection manually created (and use higher numShards & replicas than we'll use for others)
+ // This tests we may pre-create the collection and it's acceptable.
+ final String colVogon = getAlias() + "__CRA__" + SHIPS[0];
+
+ // we expect changes ensuring a legal collection name.
+ final String colHoG = getAlias() + "__CRA__" + SHIPS[1].replaceAll("\\s", "_");
+
+ List<String> retrievedConfigSetNames = new ConfigSetAdminRequest.List().process(solrClient).getConfigSets();
+ List<String> expectedConfigSetNames = Arrays.asList("_default", configName);
+
+ // config sets leak between tests so we can't be any more specific than this on the next 2 asserts
+ assertTrue("We expect at least 2 configSets",
+ retrievedConfigSetNames.size() >= expectedConfigSetNames.size());
+ assertTrue("ConfigNames should include :" + expectedConfigSetNames, retrievedConfigSetNames.containsAll(expectedConfigSetNames));
+
+ CollectionAdminRequest.createCategoryRoutedAlias(getAlias(), categoryField,
+ CollectionAdminRequest.createCollection("_unused_", configName, 1, 1)
+ .setMaxShardsPerNode(2)).setMaxCardinality(2)
+ .process(solrClient);
+
+ // now we index a document
+ addDocsAndCommit(true, newDoc(SHIPS[0]));
+ //assertDocRoutedToCol(lastDocId, col23rd);
+
+ String uninitialized = getAlias() + "__CRA__" + CategoryRoutedAlias.UNINITIALIZED;
+ assertInvariants(colVogon, uninitialized);
+
+ addDocsAndCommit(true, newDoc(SHIPS[1]));
+
+ assertInvariants(colVogon, colHoG);
+
+ // should fail since max cardinality is reached
+ Throwable e = expectThrows(Throwable.class, () -> addDocsAndCommit(true, newDoc(SHIPS[2])));
+ assertTrue("update should fail because CRA max cardinality is reached",
+ e.getMessage().contains("max cardinality can not be exceeded for a Category Routed Alias"));
+ --lastDocId; // since last doc was not indexed
+ assertInvariants(colVogon, colHoG);
+ }
+
/**
* Test that the Update Processor Factory routes documents to leader shards and thus
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
index d0fc34b..eac1006 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/CollectionAdminRequest.java
@@ -1632,9 +1632,11 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
public static final String ROUTER_TYPE_NAME = "router.name";
public static final String ROUTER_FIELD = "router.field";
+ public static final String ROUTER_MAX_CARDINALITY = "router.maxCardinality";
private final String aliasName;
private final String routerField;
+ private Integer maxCardinality;
private final Create createCollTemplate;
@@ -1645,6 +1647,11 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
this.createCollTemplate = createCollTemplate;
}
+ public CreateCategoryRoutedAlias setMaxCardinality(int maxCardinality) {
+ this.maxCardinality = maxCardinality;
+ return this;
+ }
+
@Override
public SolrParams getParams() {
ModifiableSolrParams params = (ModifiableSolrParams) super.getParams();
@@ -1652,6 +1659,10 @@ public abstract class CollectionAdminRequest<T extends CollectionAdminResponse>
params.add(ROUTER_TYPE_NAME, "category");
params.add(ROUTER_FIELD, routerField);
+ if (maxCardinality != null) {
+ params.add(ROUTER_MAX_CARDINALITY, maxCardinality.toString());
+ }
+
// merge the above with collectionParams. Above takes precedence.
ModifiableSolrParams createCollParams = new ModifiableSolrParams(); // output target
final SolrParams collParams = createCollTemplate.getParams();