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();