summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2019-04-23 14:54:05 +0200
committerGitHub <noreply@github.com>2019-04-23 14:54:05 +0200
commit13f29d40fc7e1a8a1c44faad7258460227ca4578 (patch)
treebfe16d58266499b0aa0670b8c169a8356081d262
parent979a2980aeaf89cc111f9dec74fa46cf191a8d8f (diff)
parentd16125a213fd74523f3a5249462306c8e5aa8f4c (diff)
Merge pull request #9152 from vespa-engine/balder/bypass-indexing-for-single-content-cluster-for-non-write-operations
Balder/bypass indexing for single content cluster for non write operations
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/routing/DocumentProtocol.java16
-rwxr-xr-xconfig-model/src/test/cfg/routing/replacehop/messagebus.cfg2
-rwxr-xr-xconfig-model/src/test/cfg/routing/replaceroute/messagebus.cfg2
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/content/ContentBaseTest.java12
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java88
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/content/IndexedTest.java11
6 files changed, 86 insertions, 45 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/routing/DocumentProtocol.java b/config-model/src/main/java/com/yahoo/vespa/model/routing/DocumentProtocol.java
index 97236222338..ecfa9a9e53e 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/routing/DocumentProtocol.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/routing/DocumentProtocol.java
@@ -34,9 +34,9 @@ import java.util.TreeMap;
public final class DocumentProtocol implements Protocol, DocumentrouteselectorpolicyConfig.Producer {
private static final String NAME = "document";
- private ApplicationSpec application;
- private RoutingTableSpec routingTable;
- ConfigModelRepo repo;
+ private final ApplicationSpec application;
+ private final RoutingTableSpec routingTable;
+ private final ConfigModelRepo repo;
public static String getIndexedRouteName(String configId) {
return configId + "-index";
@@ -51,7 +51,7 @@ public final class DocumentProtocol implements Protocol, Documentrouteselectorpo
*
* @param plugins The plugins to reflect on.
*/
- public DocumentProtocol(ConfigModelRepo plugins) {
+ DocumentProtocol(ConfigModelRepo plugins) {
application = createApplicationSpec(plugins);
routingTable = createRoutingTable(plugins);
this.repo = plugins;
@@ -249,7 +249,13 @@ public final class DocumentProtocol implements Protocol, Documentrouteselectorpo
route.addHop("indexing");
table.addRoute(route);
- table.addRoute(new RouteSpec("default-get").addHop("indexing"));
+ if (content.size() == 1) {
+ table.addRoute(new RouteSpec("default-get").addHop("[Content:cluster=" + content.get(0).getConfigId() + "]"));
+ } else {
+ //TODO This should ideally skip indexing and go directly to correct cluster.
+ // But will handle the single cluster for now.
+ table.addRoute(new RouteSpec("default-get").addHop("indexing"));
+ }
}
private static boolean indexingHopExists(RoutingTableSpec table) {
diff --git a/config-model/src/test/cfg/routing/replacehop/messagebus.cfg b/config-model/src/test/cfg/routing/replacehop/messagebus.cfg
index 12701af6db3..8717deb50a5 100755
--- a/config-model/src/test/cfg/routing/replacehop/messagebus.cfg
+++ b/config-model/src/test/cfg/routing/replacehop/messagebus.cfg
@@ -12,7 +12,7 @@ routingtable[0].hop[2].ignoreresult false
routingtable[0].route[0].name "default"
routingtable[0].route[0].hop[0] "indexing"
routingtable[0].route[1].name "default-get"
-routingtable[0].route[1].hop[0] "indexing"
+routingtable[0].route[1].hop[0] "[Content:cluster=music]"
routingtable[0].route[2].name "music"
routingtable[0].route[2].hop[0] "[MessageType:music]"
routingtable[0].route[3].name "music-direct"
diff --git a/config-model/src/test/cfg/routing/replaceroute/messagebus.cfg b/config-model/src/test/cfg/routing/replaceroute/messagebus.cfg
index d3af5b36c26..7eae6e8ebc5 100755
--- a/config-model/src/test/cfg/routing/replaceroute/messagebus.cfg
+++ b/config-model/src/test/cfg/routing/replaceroute/messagebus.cfg
@@ -9,7 +9,7 @@ routingtable[0].hop[1].ignoreresult false
routingtable[0].route[0].name "default"
routingtable[0].route[0].hop[0] "foo"
routingtable[0].route[1].name "default-get"
-routingtable[0].route[1].hop[0] "indexing"
+routingtable[0].route[1].hop[0] "[Content:cluster=music]"
routingtable[0].route[2].name "music"
routingtable[0].route[2].hop[0] "[MessageType:music]"
routingtable[0].route[3].name "music-direct"
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentBaseTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentBaseTest.java
index 0432b181c2c..f5642922d5b 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentBaseTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentBaseTest.java
@@ -1,6 +1,10 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.model.content;
+import com.yahoo.messagebus.routing.RouteSpec;
+
+import static org.junit.Assert.assertEquals;
+
public class ContentBaseTest {
public static String getHosts() {
return "<?xml version='1.0' encoding='utf-8' ?>" +
@@ -10,4 +14,12 @@ public class ContentBaseTest {
" </host>" +
"</hosts>";
}
+
+ static void assertRoute(RouteSpec r, String name, String... hops) {
+ assertEquals(name, r.getName());
+ assertEquals(hops.length, r.getNumHops());
+ for(int i = 0; i < hops.length; i++) {
+ assertEquals(hops[i], r.getHop(i));
+ }
+ }
}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java
index 0e200efd688..7c365859862 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/content/ContentClusterTest.java
@@ -10,6 +10,7 @@ import com.yahoo.config.model.test.TestRoot;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.RegionName;
import com.yahoo.config.provision.Zone;
+import com.yahoo.messagebus.routing.RoutingTableSpec;
import com.yahoo.metrics.MetricsmanagerConfig;
import com.yahoo.vespa.config.content.AllClustersBucketSpacesConfig;
import com.yahoo.vespa.config.content.FleetcontrollerConfig;
@@ -26,6 +27,8 @@ import com.yahoo.vespa.model.content.engines.ProtonEngine;
import com.yahoo.vespa.model.content.utils.ContentClusterBuilder;
import com.yahoo.vespa.model.content.utils.ContentClusterUtils;
import com.yahoo.vespa.model.content.utils.SearchDefinitionBuilder;
+import com.yahoo.vespa.model.routing.DocumentProtocol;
+import com.yahoo.vespa.model.routing.Routing;
import com.yahoo.vespa.model.test.utils.ApplicationPackageUtils;
import com.yahoo.vespa.model.test.utils.VespaModelCreatorWithMockPkg;
import org.junit.Rule;
@@ -853,44 +856,73 @@ public class ContentClusterTest extends ContentBaseTest {
}
}
- @Test
- public void all_clusters_bucket_spaces_config_contains_mappings_across_all_clusters() {
+ private VespaModel createDualContentCluster() {
String xml =
"<services>" +
- "<admin version=\"2.0\">" +
- " <adminserver hostalias=\"node0\"/>" +
- "</admin>" +
- "<content version=\"1.0\" id=\"foocluster\">" +
- " <redundancy>1</redundancy>" +
- " <documents>" +
- " <document type=\"bunnies\" mode=\"index\"/>" +
- " <document type=\"hares\" mode=\"index\"/>" +
- " </documents>" +
- " <group>" +
- " <node distribution-key=\"0\" hostalias=\"node0\"/>" +
- " </group>" +
- "</content>" +
- "<content version=\"1.0\" id=\"barcluster\">" +
- " <redundancy>1</redundancy>" +
- " <documents>" +
- " <document type=\"rabbits\" mode=\"index\" global=\"true\"/>" +
- " </documents>" +
- " <group>" +
- " <node distribution-key=\"0\" hostalias=\"node0\"/>" +
- " </group>" +
- "</content>" +
- "</services>";
+ "<admin version=\"2.0\">" +
+ " <adminserver hostalias=\"node0\"/>" +
+ "</admin>" +
+ "<content version=\"1.0\" id=\"foo_c\">" +
+ " <redundancy>1</redundancy>" +
+ " <documents>" +
+ " <document type=\"bunnies\" mode=\"index\"/>" +
+ " <document type=\"hares\" mode=\"index\"/>" +
+ " </documents>" +
+ " <group>" +
+ " <node distribution-key=\"0\" hostalias=\"node0\"/>" +
+ " </group>" +
+ "</content>" +
+ "<content version=\"1.0\" id=\"bar_c\">" +
+ " <redundancy>1</redundancy>" +
+ " <documents>" +
+ " <document type=\"rabbits\" mode=\"index\" global=\"true\"/>" +
+ " </documents>" +
+ " <group>" +
+ " <node distribution-key=\"0\" hostalias=\"node0\"/>" +
+ " </group>" +
+ "</content>" +
+ "</services>";
List<String> sds = ApplicationPackageUtils.generateSearchDefinitions("bunnies", "hares", "rabbits");
- VespaModel model = new VespaModelCreatorWithMockPkg(getHosts(), xml, sds).create();
+ return new VespaModelCreatorWithMockPkg(getHosts(), xml, sds).create();
+ }
+ @Test
+ public void all_clusters_bucket_spaces_config_contains_mappings_across_all_clusters() {
+ VespaModel model = createDualContentCluster();
AllClustersBucketSpacesConfig.Builder builder = new AllClustersBucketSpacesConfig.Builder();
model.getConfig(builder, "client");
AllClustersBucketSpacesConfig config = builder.build();
assertEquals(2, config.cluster().size());
- assertClusterHasBucketSpaceMappings(config, "foocluster", Arrays.asList("bunnies", "hares"), Collections.emptyList());
- assertClusterHasBucketSpaceMappings(config, "barcluster", Collections.emptyList(), Collections.singletonList("rabbits"));
+ assertClusterHasBucketSpaceMappings(config, "foo_c", Arrays.asList("bunnies", "hares"), Collections.emptyList());
+ assertClusterHasBucketSpaceMappings(config, "bar_c", Collections.emptyList(), Collections.singletonList("rabbits"));
+ }
+ @Test
+ public void test_routing_with_multiple_clusters() {
+ VespaModel model = createDualContentCluster();
+ Routing routing = model.getRouting();
+ assertNotNull(routing);
+ assertEquals("[]", routing.getErrors().toString());
+ assertEquals(1, routing.getProtocols().size());
+ DocumentProtocol protocol = (DocumentProtocol) routing.getProtocols().get(0);
+ RoutingTableSpec spec = protocol.getRoutingTableSpec();
+ assertEquals(3, spec.getNumHops());
+ assertEquals("docproc/cluster.bar_c.indexing/chain.indexing", spec.getHop(0).getName());
+ assertEquals("docproc/cluster.foo_c.indexing/chain.indexing", spec.getHop(1).getName());
+ assertEquals("indexing", spec.getHop(2).getName());
+
+ assertEquals(10, spec.getNumRoutes());
+ assertRoute(spec.getRoute(0), "bar_c", "[MessageType:bar_c]");
+ assertRoute(spec.getRoute(1), "bar_c-direct", "[Content:cluster=bar_c]");
+ assertRoute(spec.getRoute(2), "bar_c-index", "docproc/cluster.bar_c.indexing/chain.indexing", "[Content:cluster=bar_c]");
+ assertRoute(spec.getRoute(3), "default", "indexing");
+ assertRoute(spec.getRoute(4), "default-get", "indexing");
+ assertRoute(spec.getRoute(5), "foo_c", "[MessageType:foo_c]");
+ assertRoute(spec.getRoute(6), "foo_c-direct", "[Content:cluster=foo_c]");
+ assertRoute(spec.getRoute(7), "foo_c-index", "docproc/cluster.foo_c.indexing/chain.indexing", "[Content:cluster=foo_c]");
+ assertRoute(spec.getRoute(8), "storage/cluster.bar_c", "route:bar_c");
+ assertRoute(spec.getRoute(9), "storage/cluster.foo_c", "route:foo_c");
}
private ContentCluster createWithZone(String clusterXml, Zone zone) throws Exception {
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedTest.java
index bf8e2a353cf..919fec5be2f 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedTest.java
@@ -4,7 +4,6 @@ package com.yahoo.vespa.model.content;
import com.yahoo.cloud.config.ClusterListConfig;
import com.yahoo.config.model.deploy.DeployState;
import com.yahoo.documentmodel.NewDocumentType;
-import com.yahoo.messagebus.routing.RouteSpec;
import com.yahoo.messagebus.routing.RoutingTableSpec;
import com.yahoo.vespa.config.content.core.StorServerConfig;
import com.yahoo.vespa.config.search.core.ProtonConfig;
@@ -158,21 +157,13 @@ public class IndexedTest extends ContentBaseTest {
assertEquals("jdisc/chain.indexing", spec.getHop(1).getName());
assertRoute(spec.getRoute(0), "default", "indexing");
- assertRoute(spec.getRoute(1), "default-get", "indexing");
+ assertRoute(spec.getRoute(1), "default-get", "[Content:cluster=test]");
assertRoute(spec.getRoute(2), "storage/cluster.test", "route:test");
assertRoute(spec.getRoute(3), "test", "[MessageType:test]");
assertRoute(spec.getRoute(4), "test-direct", "[Content:cluster=test]");
assertRoute(spec.getRoute(5), "test-index", "jdisc/chain.indexing", "[Content:cluster=test]");
}
- private static void assertRoute(RouteSpec r, String name, String... hops) {
- assertEquals(name, r.getName());
- assertEquals(hops.length, r.getNumHops());
- for(int i = 0; i < hops.length; i++) {
- assertEquals(hops[i], r.getHop(i));
- }
- }
-
@Test
public void requireProtonStreamingOnly()
{