diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2019-04-23 14:54:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-23 14:54:05 +0200 |
commit | 13f29d40fc7e1a8a1c44faad7258460227ca4578 (patch) | |
tree | bfe16d58266499b0aa0670b8c169a8356081d262 | |
parent | 979a2980aeaf89cc111f9dec74fa46cf191a8d8f (diff) | |
parent | d16125a213fd74523f3a5249462306c8e5aa8f4c (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
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() { |