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/01/29 02:53:14 UTC
[lucene-solr] 02/04: SOLR-13148: remove hard coded pointers to
TimeRoutedAlias
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 84fda4d88bd3a434a2a0c0d4dd7c8507684d34f6
Author: Moshe <mo...@mail.com>
AuthorDate: Mon Jan 28 02:41:40 2019 +0200
SOLR-13148: remove hard coded pointers to TimeRoutedAlias
---
.../solr/cloud/api/collections/AliasCmd.java | 2 +-
.../cloud/api/collections/CategoryRoutedAlias.java | 6 ++++-
.../solr/cloud/api/collections/CreateAliasCmd.java | 30 +++++++++++++---------
.../solr/cloud/api/collections/RoutedAlias.java | 13 ++++++++++
.../cloud/api/collections/TimeRoutedAlias.java | 25 ++++++++++++++++++
5 files changed, 62 insertions(+), 14 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/AliasCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/AliasCmd.java
index 3bc1d0b..c653569 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/AliasCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/AliasCmd.java
@@ -31,7 +31,7 @@ import org.apache.solr.handler.admin.CollectionsHandler;
import org.apache.solr.request.LocalSolrQueryRequest;
import static org.apache.solr.cloud.api.collections.RoutedAlias.ROUTED_ALIAS_NAME_CORE_PROP;
-import static org.apache.solr.cloud.api.collections.TimeRoutedAlias.CREATE_COLLECTION_PREFIX;
+import static org.apache.solr.cloud.api.collections.RoutedAlias.CREATE_COLLECTION_PREFIX;
import static org.apache.solr.common.params.CollectionAdminParams.COLL_CONF;
import static org.apache.solr.common.params.CommonParams.NAME;
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 3ac09c6..30b0747 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
@@ -20,7 +20,6 @@ package org.apache.solr.cloud.api.collections;
import java.time.Instant;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import org.apache.solr.cloud.ZkController;
import org.apache.solr.common.cloud.Aliases;
@@ -65,4 +64,9 @@ public class CategoryRoutedAlias implements RoutedAlias {
public String computeInitialCollectionName(String collection) {
return null;
}
+
+ @Override
+ public Map<String, String> getAliasMetadata() {
+ return aliasProperties;
+ }
}
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java
index dd8edc1..182eda3 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java
@@ -19,11 +19,11 @@ package org.apache.solr.cloud.api.collections;
import java.util.Collections;
import java.util.HashSet;
-import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
+import java.util.function.BiFunction;
import java.util.stream.Collectors;
import org.apache.solr.common.SolrException;
@@ -98,34 +98,40 @@ public class CreateAliasCmd extends AliasCmd {
private void callCreateRoutedAlias(ZkNodeProps message, String aliasName, ZkStateReader zkStateReader, ClusterState state) throws Exception {
// Validate we got everything we need
- if (!message.getProperties().keySet().containsAll(TimeRoutedAlias.REQUIRED_ROUTER_PARAMS)) {
- throw new SolrException(BAD_REQUEST, "A routed alias requires these params: " + TimeRoutedAlias.REQUIRED_ROUTER_PARAMS
+ if (!message.getProperties().keySet().containsAll(RoutedAlias.MINIMAL_REQUIRED_PARAMS)) {
+ throw new SolrException(BAD_REQUEST, "A routed alias requires these params: " + RoutedAlias.MINIMAL_REQUIRED_PARAMS
+ " plus some create-collection prefixed ones.");
}
- Map<String, String> aliasProperties = new LinkedHashMap<>();
- message.getProperties().entrySet().stream()
- .filter(entry -> TimeRoutedAlias.PARAM_IS_PROP.test(entry.getKey()))
- .forEach(entry -> aliasProperties.put(entry.getKey(), (String) entry.getValue())); // way easier than .collect
+ String aliasType = message.getStr(RoutedAlias.ROUTER_TYPE_NAME);
- RoutedAlias timeRoutedAlias = new TimeRoutedAlias(aliasName, aliasProperties); // validates as well
+ BiFunction<String, ZkNodeProps, RoutedAlias> aliasConstructor = RoutedAlias.constructorFactory.get(aliasType);
+
+ if (aliasConstructor == null) {
+ throw new SolrException(BAD_REQUEST, "Router name: " + aliasType + " is not in supported types, "
+ + String.join(", ", RoutedAlias.constructorFactory.keySet()));
+ }
+
+
+
+ RoutedAlias routedAlias = aliasConstructor.apply(aliasName, message);
String start = message.getStr(RoutedAlias.ROUTER_START);
if (start != null) {
- String initialCollectionName = timeRoutedAlias.computeInitialCollectionName(start);
+ String initialCollectionName = routedAlias.computeInitialCollectionName(start);
if (initialCollectionName != null) {
- ensureCollection(aliasName, zkStateReader, state, aliasProperties, initialCollectionName);
+ ensureCollection(aliasName, zkStateReader, state, routedAlias.getAliasMetadata(), initialCollectionName);
// Create/update the alias
zkStateReader.aliasesManager.applyModificationAndExportToZk(aliases -> aliases
.cloneWithCollectionAlias(aliasName, initialCollectionName)
- .cloneWithCollectionAliasProperties(aliasName, aliasProperties));
+ .cloneWithCollectionAliasProperties(aliasName, routedAlias.getAliasMetadata()));
return;
}
}
// Create/update the alias
zkStateReader.aliasesManager.applyModificationAndExportToZk(aliases -> aliases
- .cloneWithCollectionAliasProperties(aliasName, aliasProperties));
+ .cloneWithCollectionAliasProperties(aliasName, routedAlias.getAliasMetadata()));
}
private void ensureCollection(String aliasName, ZkStateReader zkStateReader, ClusterState state, Map<String, String> aliasProperties, String initialCollectionName) throws Exception {
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/RoutedAlias.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/RoutedAlias.java
index b004d79..1a607ba 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/RoutedAlias.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/RoutedAlias.java
@@ -21,15 +21,22 @@ import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.function.BiFunction;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import org.apache.solr.cloud.ZkController;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.Aliases;
+import org.apache.solr.common.cloud.ZkNodeProps;
import org.apache.solr.update.AddUpdateCommand;
public interface RoutedAlias {
+ Map<String, BiFunction<String, ZkNodeProps, RoutedAlias>> constructorFactory = ImmutableMap.<String, BiFunction<String, ZkNodeProps, RoutedAlias>>builder()
+ .put("time", TimeRoutedAlias::fromZkProps)
+ .build();
+
String ROUTER_PREFIX = "router.";
String ROUTER_TYPE_NAME = ROUTER_PREFIX + "name";
String ROUTER_FIELD = ROUTER_PREFIX + "field";
@@ -81,4 +88,10 @@ public interface RoutedAlias {
* newly created collection
*/
String createCollectionsIfRequired( AddUpdateCommand cmd);
+
+ /**
+ *
+ * @return get alias related metadata
+ */
+ Map<String, String> getAliasMetadata();
}
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
index 007e2ce..c8b0ebb 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
@@ -30,6 +30,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -41,6 +42,7 @@ import com.google.common.base.Objects;
import org.apache.solr.cloud.ZkController;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.Aliases;
+import org.apache.solr.common.cloud.ZkNodeProps;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.MapSolrParams;
import org.apache.solr.common.params.RequiredSolrParams;
@@ -177,6 +179,7 @@ public class TimeRoutedAlias implements RoutedAlias {
//
private final String aliasName;
+ private final Map<String, String> aliasMetadata;
private final String routeField;
private final String intervalMath; // ex: +1DAY
private final long maxFutureMs;
@@ -186,6 +189,7 @@ public class TimeRoutedAlias implements RoutedAlias {
public TimeRoutedAlias(String aliasName, Map<String, String> aliasMetadata) {
this.aliasName = aliasName;
+ this.aliasMetadata = aliasMetadata;
final MapSolrParams params = new MapSolrParams(aliasMetadata); // for convenience
final RequiredSolrParams required = params.required();
if (!"time".equals(required.get(ROUTER_TYPE_NAME))) {
@@ -371,6 +375,27 @@ public class TimeRoutedAlias implements RoutedAlias {
throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, e);
}
}
+
+ @Override
+ public Map<String, String> getAliasMetadata() {
+ return aliasMetadata;
+ }
+
+ static RoutedAlias fromZkProps(String aliasName, ZkNodeProps aliasProps) throws SolrException {
+ // Validate we got everything we need
+ if (!aliasProps.getProperties().keySet().containsAll(TimeRoutedAlias.REQUIRED_ROUTER_PARAMS)) {
+ throw new SolrException(BAD_REQUEST, "A time routed alias requires these params: " + TimeRoutedAlias.REQUIRED_ROUTER_PARAMS
+ + " plus some create-collection prefixed ones.");
+ }
+
+ Map<String, String> aliasProperties = new LinkedHashMap<>();
+ aliasProps.getProperties().entrySet().stream()
+ .filter(entry -> TimeRoutedAlias.PARAM_IS_PROP.test(entry.getKey()))
+ .forEach(entry -> aliasProperties.put(entry.getKey(), (String) entry.getValue())); // way easier than .collect
+
+ return new TimeRoutedAlias(aliasName, aliasProperties); // validates as well
+ }
+
/**
* Create as many collections as required. This method loops to allow for the possibility that the docTimestamp
* requires more than one collection to be created. Since multiple threads may be invoking maintain on separate