diff options
38 files changed, 247 insertions, 615 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java b/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java index 8ef89626792..1cc5c93c28a 100644 --- a/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java +++ b/config-model/src/main/java/com/yahoo/config/model/ApplicationConfigProducerRoot.java @@ -9,8 +9,6 @@ import com.yahoo.cloud.config.ZookeepersConfig; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.config.provision.ApplicationId; import com.yahoo.component.Version; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; -import com.yahoo.vespa.config.content.DistributionConfig; import com.yahoo.vespa.config.content.LoadTypeConfig; import com.yahoo.cloud.config.ModelConfig.Hosts; import com.yahoo.cloud.config.ModelConfig.Hosts.Services; @@ -22,7 +20,6 @@ import com.yahoo.document.config.DocumentmanagerConfig; import com.yahoo.documentapi.messagebus.protocol.DocumentrouteselectorpolicyConfig; import com.yahoo.messagebus.MessagebusConfig; import com.yahoo.vespa.config.content.AllClustersBucketSpacesConfig; -import com.yahoo.vespa.config.content.StorDistributionConfig; import com.yahoo.vespa.configmodel.producers.DocumentManager; import com.yahoo.vespa.configmodel.producers.DocumentTypes; import com.yahoo.vespa.documentmodel.DocumentModel; @@ -44,9 +41,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; - -import static java.util.stream.Collectors.toList; /** @@ -171,13 +165,6 @@ public class ApplicationConfigProducerRoot extends AbstractConfigProducer<Abstra } @Override - public void getConfig(DocumentProtocolPoliciesConfig.Builder builder) { - if (routing != null) { - routing.getConfig(builder); - } - } - - @Override public void getConfig(MessagebusConfig.Builder builder) { if (routing != null) { routing.getConfig(builder); @@ -226,13 +213,6 @@ public class ApplicationConfigProducerRoot extends AbstractConfigProducer<Abstra } @Override - public void getConfig(DistributionConfig.Builder builder) { - for (ContentCluster cluster : ((VespaModel) getRoot()).getContentClusters().values()) { - cluster.getConfig(builder); - } - } - - @Override public void getConfig(AllClustersBucketSpacesConfig.Builder builder) { VespaModel model = (VespaModel) getRoot(); for (ContentCluster cluster : model.getContentClusters().values()) { diff --git a/config-model/src/main/java/com/yahoo/config/model/CommonConfigsProducer.java b/config-model/src/main/java/com/yahoo/config/model/CommonConfigsProducer.java index ff82b612e79..9dcd94bf455 100644 --- a/config-model/src/main/java/com/yahoo/config/model/CommonConfigsProducer.java +++ b/config-model/src/main/java/com/yahoo/config/model/CommonConfigsProducer.java @@ -2,8 +2,6 @@ package com.yahoo.config.model; import com.yahoo.cloud.config.ApplicationIdConfig; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; -import com.yahoo.vespa.config.content.DistributionConfig; import com.yahoo.vespa.config.content.LoadTypeConfig; import com.yahoo.cloud.config.log.LogdConfig; import com.yahoo.cloud.config.SlobroksConfig; @@ -27,13 +25,11 @@ public interface CommonConfigsProducer extends DocumentmanagerConfig.Producer, DocumenttypesConfig.Producer, MessagebusConfig.Producer, DocumentrouteselectorpolicyConfig.Producer, - DocumentProtocolPoliciesConfig.Producer, LogdConfig.Producer, SlobroksConfig.Producer, ZookeepersConfig.Producer, LoadTypeConfig.Producer, ClusterListConfig.Producer, - DistributionConfig.Producer, AllClustersBucketSpacesConfig.Producer, ModelConfig.Producer, ApplicationIdConfig.Producer { diff --git a/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java b/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java index 0cfe35a51b5..d6cccc9f2be 100644 --- a/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java +++ b/config-model/src/main/java/com/yahoo/config/model/provision/SingleNodeProvisioner.java @@ -10,6 +10,7 @@ import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.ProvisionLogger; import com.yahoo.net.HostName; +import com.yahoo.vespa.config.content.StorDistributionConfig; import java.util.ArrayList; import java.util.List; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java index a627e030156..7ec2dc67cf2 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java @@ -15,7 +15,6 @@ import com.yahoo.documentapi.messagebus.protocol.DocumentProtocol; import com.yahoo.documentmodel.NewDocumentType; import com.yahoo.metrics.MetricsmanagerConfig; import com.yahoo.vespa.config.content.AllClustersBucketSpacesConfig; -import com.yahoo.vespa.config.content.DistributionConfig; import com.yahoo.vespa.config.content.FleetcontrollerConfig; import com.yahoo.vespa.config.content.MessagetyperouteselectorpolicyConfig; import com.yahoo.vespa.config.content.StorDistributionConfig; @@ -68,8 +67,6 @@ import java.util.TreeMap; import java.util.logging.Level; import java.util.stream.Collectors; -import static java.util.stream.Collectors.toList; - /** * A content cluster. * @@ -77,7 +74,6 @@ import static java.util.stream.Collectors.toList; * @author bratseth */ public class ContentCluster extends AbstractConfigProducer implements - DistributionConfig.Producer, StorDistributionConfig.Producer, StorDistributormanagerConfig.Producer, FleetcontrollerConfig.Producer, @@ -752,39 +748,6 @@ public class ContentCluster extends AbstractConfigProducer implements } } - @Override - public void getConfig(DistributionConfig.Builder builder) { - DistributionConfig.Cluster.Builder clusterBuilder = new DistributionConfig.Cluster.Builder(); - StorDistributionConfig.Builder storDistributionBuilder = new StorDistributionConfig.Builder(); - getConfig(storDistributionBuilder); - StorDistributionConfig config = storDistributionBuilder.build(); - - clusterBuilder.active_per_leaf_group(config.active_per_leaf_group()); - clusterBuilder.ready_copies(config.ready_copies()); - clusterBuilder.redundancy(config.redundancy()); - clusterBuilder.initial_redundancy(config.initial_redundancy()); - - for (StorDistributionConfig.Group group : config.group()) { - DistributionConfig.Cluster.Group.Builder groupBuilder = new DistributionConfig.Cluster.Group.Builder(); - groupBuilder.index(group.index()) - .name(group.name()) - .capacity(group.capacity()) - .partitions(group.partitions()); - - for (var node : group.nodes()) { - DistributionConfig.Cluster.Group.Nodes.Builder nodesBuilder = new DistributionConfig.Cluster.Group.Nodes.Builder(); - nodesBuilder.index(node.index()) - .retired(node.retired()); - - groupBuilder.nodes(nodesBuilder); - } - - clusterBuilder.group(groupBuilder); - } - - builder.cluster(getConfigId(), clusterBuilder); - } - /** * Mark whether the config emitted by this cluster currently should be applied by clients already running with * a previous generation of it only by restarting the consuming processes. 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 3ff444b2f24..e6f4969f593 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 @@ -2,9 +2,8 @@ package com.yahoo.vespa.model.routing; import com.yahoo.config.model.ConfigModelRepo; -import com.yahoo.document.select.DocumentSelector; import com.yahoo.documentapi.messagebus.protocol.DocumentrouteselectorpolicyConfig; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; +import com.yahoo.document.select.DocumentSelector; import com.yahoo.messagebus.routing.ApplicationSpec; import com.yahoo.messagebus.routing.HopSpec; import com.yahoo.messagebus.routing.RouteSpec; @@ -13,9 +12,9 @@ import com.yahoo.vespa.model.container.Container; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.container.ContainerModel; import com.yahoo.vespa.model.container.docproc.ContainerDocproc; -import com.yahoo.vespa.model.container.docproc.DocprocChain; -import com.yahoo.vespa.model.content.Content; import com.yahoo.vespa.model.content.cluster.ContentCluster; +import com.yahoo.vespa.model.content.Content; +import com.yahoo.vespa.model.container.docproc.DocprocChain; import java.util.ArrayList; import java.util.Collection; @@ -32,9 +31,7 @@ import java.util.TreeMap; * * @author Simon Thoresen Hult */ -public final class DocumentProtocol implements Protocol, - DocumentrouteselectorpolicyConfig.Producer, - DocumentProtocolPoliciesConfig.Producer { +public final class DocumentProtocol implements Protocol, DocumentrouteselectorpolicyConfig.Producer { private static final String NAME = "document"; private final ApplicationSpec application; @@ -104,42 +101,6 @@ public final class DocumentProtocol implements Protocol, } } - @Override - public void getConfig(DocumentProtocolPoliciesConfig.Builder builder) { - for (ContentCluster cluster : Content.getContentClusters(repo)) { - DocumentProtocolPoliciesConfig.Cluster.Builder clusterBuilder = new DocumentProtocolPoliciesConfig.Cluster.Builder(); - addSelector(cluster.getConfigId(), cluster.getRoutingSelector(), clusterBuilder); - if (cluster.getSearch().hasIndexedCluster()) - addRoutes(getDirectRouteName(cluster.getConfigId()), getIndexedRouteName(cluster.getConfigId()), clusterBuilder); - - builder.cluster(cluster.getConfigId(), clusterBuilder); - } - } - - private static void addRoutes(String directRoute, String indexedRoute, DocumentProtocolPoliciesConfig.Cluster.Builder builder) { - builder.defaultRoute(directRoute) - .route(new DocumentProtocolPoliciesConfig.Cluster.Route.Builder() - .messageType(com.yahoo.documentapi.messagebus.protocol.DocumentProtocol.MESSAGE_PUTDOCUMENT) - .name(indexedRoute)) - .route(new DocumentProtocolPoliciesConfig.Cluster.Route.Builder() - .messageType(com.yahoo.documentapi.messagebus.protocol.DocumentProtocol.MESSAGE_REMOVEDOCUMENT) - .name(indexedRoute)) - .route(new DocumentProtocolPoliciesConfig.Cluster.Route.Builder() - .messageType(com.yahoo.documentapi.messagebus.protocol.DocumentProtocol.MESSAGE_UPDATEDOCUMENT) - .name(indexedRoute)); - } - - private static void addSelector(String clusterConfigId, String selector, DocumentProtocolPoliciesConfig.Cluster.Builder builder) { - try { - new DocumentSelector(selector); - } catch (com.yahoo.document.select.parser.ParseException e) { - throw new IllegalArgumentException("Failed to parse selector '" + selector + - "' for route '" + clusterConfigId + - "' in policy 'DocumentRouteSelector'."); - } - builder.selector(selector); - } - private static void addRoute(String clusterConfigId, String selector, DocumentrouteselectorpolicyConfig.Builder builder) { try { new DocumentSelector(selector); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/routing/Routing.java b/config-model/src/main/java/com/yahoo/vespa/model/routing/Routing.java index 513bc9a8c6a..36beb766f5b 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/routing/Routing.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/routing/Routing.java @@ -4,7 +4,6 @@ package com.yahoo.vespa.model.routing; import com.yahoo.config.model.ConfigModel; import com.yahoo.config.model.ConfigModelContext; import com.yahoo.config.model.ConfigModelRepo; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; import com.yahoo.messagebus.routing.*; import com.yahoo.messagebus.MessagebusConfig; import com.yahoo.documentapi.messagebus.protocol.DocumentrouteselectorpolicyConfig; @@ -83,14 +82,6 @@ public class Routing extends ConfigModel { } } - public void getConfig(DocumentProtocolPoliciesConfig.Builder builder) { - for (Protocol protocol : protocols) { - if (protocol instanceof DocumentProtocol) { - ((DocumentProtocol) protocol).getConfig(builder); - } - } - } - public void getConfig(DocumentrouteselectorpolicyConfig.Builder builder) { for (Protocol protocol : protocols) { if (protocol instanceof DocumentProtocol) { diff --git a/config-model/src/test/cfg/routing/defaultconfig/document-protocol-policies.cfg b/config-model/src/test/cfg/routing/defaultconfig/document-protocol-policies.cfg deleted file mode 100644 index 8b137891791..00000000000 --- a/config-model/src/test/cfg/routing/defaultconfig/document-protocol-policies.cfg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/config-model/src/test/cfg/routing/hopconfig/document-protocol-policies.cfg b/config-model/src/test/cfg/routing/hopconfig/document-protocol-policies.cfg deleted file mode 100644 index 8b137891791..00000000000 --- a/config-model/src/test/cfg/routing/hopconfig/document-protocol-policies.cfg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/config-model/src/test/cfg/routing/replacehop/document-protocol-policies.cfg b/config-model/src/test/cfg/routing/replacehop/document-protocol-policies.cfg deleted file mode 100644 index 68659362350..00000000000 --- a/config-model/src/test/cfg/routing/replacehop/document-protocol-policies.cfg +++ /dev/null @@ -1,8 +0,0 @@ -cluster{music}.defaultRoute "music-direct" -cluster{music}.route[0].name "music-index" -cluster{music}.route[0].messageType 100004 -cluster{music}.route[1].name "music-index" -cluster{music}.route[1].messageType 100005 -cluster{music}.route[2].name "music-index" -cluster{music}.route[2].messageType 100006 -cluster{music}.selector "(music)" diff --git a/config-model/src/test/cfg/routing/replaceroute/document-protocol-policies.cfg b/config-model/src/test/cfg/routing/replaceroute/document-protocol-policies.cfg deleted file mode 100644 index 68659362350..00000000000 --- a/config-model/src/test/cfg/routing/replaceroute/document-protocol-policies.cfg +++ /dev/null @@ -1,8 +0,0 @@ -cluster{music}.defaultRoute "music-direct" -cluster{music}.route[0].name "music-index" -cluster{music}.route[0].messageType 100004 -cluster{music}.route[1].name "music-index" -cluster{music}.route[1].messageType 100005 -cluster{music}.route[2].name "music-index" -cluster{music}.route[2].messageType 100006 -cluster{music}.selector "(music)" diff --git a/config-model/src/test/cfg/routing/routeconfig/document-protocol-policies.cfg b/config-model/src/test/cfg/routing/routeconfig/document-protocol-policies.cfg deleted file mode 100644 index 8b137891791..00000000000 --- a/config-model/src/test/cfg/routing/routeconfig/document-protocol-policies.cfg +++ /dev/null @@ -1 +0,0 @@ - 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 095434c8e04..9f17a1c4142 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 @@ -14,7 +14,6 @@ import com.yahoo.container.ComponentsConfig; import com.yahoo.messagebus.routing.RoutingTableSpec; import com.yahoo.metrics.MetricsmanagerConfig; import com.yahoo.vespa.config.content.AllClustersBucketSpacesConfig; -import com.yahoo.vespa.config.content.DistributionConfig; import com.yahoo.vespa.config.content.FleetcontrollerConfig; import com.yahoo.vespa.config.content.StorDistributionConfig; import com.yahoo.vespa.config.content.StorFilestorConfig; @@ -100,22 +99,12 @@ public class ContentClusterTest extends ContentBaseTest { " </group>" + "</content>" ); - DistributionConfig.Builder distributionBuilder = new DistributionConfig.Builder(); - cc.getConfig(distributionBuilder); - DistributionConfig distributionConfig = distributionBuilder.build(); - assertEquals(3, distributionConfig.cluster("storage").ready_copies()); - assertEquals(15, distributionConfig.cluster("storage").initial_redundancy()); - assertEquals(15, distributionConfig.cluster("storage").redundancy()); - assertEquals(4, distributionConfig.cluster("storage").group().size()); - assertEquals(1, distributionConfig.cluster().size()); - StorDistributionConfig.Builder storBuilder = new StorDistributionConfig.Builder(); cc.getConfig(storBuilder); StorDistributionConfig storConfig = new StorDistributionConfig(storBuilder); assertEquals(15, storConfig.initial_redundancy()); assertEquals(15, storConfig.redundancy()); assertEquals(3, storConfig.ready_copies()); - ProtonConfig.Builder protonBuilder = new ProtonConfig.Builder(); cc.getSearch().getConfig(protonBuilder); ProtonConfig protonConfig = new ProtonConfig(protonBuilder); @@ -143,20 +132,12 @@ public class ContentClusterTest extends ContentBaseTest { " </group>" + "</content>" ); - DistributionConfig.Builder distributionBuilder = new DistributionConfig.Builder(); - cc.getConfig(distributionBuilder); - DistributionConfig distributionConfig = distributionBuilder.build(); - assertEquals(3, distributionConfig.cluster("storage").ready_copies()); - assertEquals(4, distributionConfig.cluster("storage").initial_redundancy()); - assertEquals(5, distributionConfig.cluster("storage").redundancy()); - StorDistributionConfig.Builder storBuilder = new StorDistributionConfig.Builder(); cc.getConfig(storBuilder); StorDistributionConfig storConfig = new StorDistributionConfig(storBuilder); assertEquals(4, storConfig.initial_redundancy()); assertEquals(5, storConfig.redundancy()); assertEquals(3, storConfig.ready_copies()); - ProtonConfig.Builder protonBuilder = new ProtonConfig.Builder(); cc.getSearch().getConfig(protonBuilder); ProtonConfig protonConfig = new ProtonConfig(protonBuilder); @@ -182,7 +163,8 @@ public class ContentClusterTest extends ContentBaseTest { @Test public void testRedundancyDefaults() { - ContentCluster cc = parse( + StorDistributionConfig.Builder builder = new StorDistributionConfig.Builder(); + parse( "<content version=\"1.0\" id=\"storage\">\n" + " <documents/>" + " <group>" + @@ -191,15 +173,8 @@ public class ContentClusterTest extends ContentBaseTest { " <node hostalias=\"mockhost\" distribution-key=\"2\"/>\"" + " </group>" + "</content>" - ); - - DistributionConfig.Builder distributionBuilder = new DistributionConfig.Builder(); - cc.getConfig(distributionBuilder); - DistributionConfig distributionConfig = distributionBuilder.build(); - assertEquals(3, distributionConfig.cluster("storage").redundancy()); + ).getConfig(builder); - StorDistributionConfig.Builder builder = new StorDistributionConfig.Builder(); - cc.getConfig(builder); StorDistributionConfig config = new StorDistributionConfig(builder); assertEquals(2, config.initial_redundancy()); assertEquals(3, config.redundancy()); @@ -573,13 +548,6 @@ public class ContentClusterTest extends ContentBaseTest { "</content>" ); - DistributionConfig.Builder bob = new DistributionConfig.Builder(); - cluster.getConfig(bob); - DistributionConfig.Cluster.Group group = bob.build().cluster("test").group(0); - assertEquals("invalid", group.name()); - assertEquals("invalid", group.index()); - assertEquals(2, group.nodes().size()); - StorDistributionConfig.Builder builder = new StorDistributionConfig.Builder(); cluster.getConfig(builder); diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedHierarchicDistributionTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedHierarchicDistributionTest.java index 80ab6745b79..d290d4ec953 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedHierarchicDistributionTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/IndexedHierarchicDistributionTest.java @@ -2,6 +2,10 @@ package com.yahoo.vespa.model.content; import com.yahoo.vespa.config.content.StorDistributionConfig; +import com.yahoo.config.model.test.MockRoot; +import com.yahoo.vespa.model.Host; +import com.yahoo.vespa.model.HostResource; +import com.yahoo.vespa.model.SimpleConfigProducer; import com.yahoo.vespa.model.content.cluster.ContentCluster; import com.yahoo.vespa.model.search.DispatchGroup; import com.yahoo.vespa.model.search.SearchInterface; @@ -13,9 +17,9 @@ import java.util.List; import java.util.Optional; import static com.yahoo.config.model.test.TestUtil.joinLines; +import static org.hamcrest.Matchers.containsString; import static com.yahoo.vespa.model.content.utils.ContentClusterUtils.createCluster; import static com.yahoo.vespa.model.content.utils.ContentClusterUtils.createClusterXml; -import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; diff --git a/config-model/src/test/java/com/yahoo/vespa/model/content/StorageGroupTest.java b/config-model/src/test/java/com/yahoo/vespa/model/content/StorageGroupTest.java index b9495d45e08..cb457cabf6c 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/content/StorageGroupTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/content/StorageGroupTest.java @@ -2,14 +2,13 @@ package com.yahoo.vespa.model.content; import com.yahoo.config.model.test.MockRoot; -import com.yahoo.vespa.config.content.DistributionConfig; import com.yahoo.vespa.config.content.StorDistributionConfig; import com.yahoo.vespa.model.content.cluster.ContentCluster; import com.yahoo.vespa.model.content.utils.ContentClusterUtils; import org.junit.Test; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import static org.junit.Assert.assertTrue; /** * Test for storage groups. @@ -22,6 +21,7 @@ public class StorageGroupTest { @Test public void testSingleGroup() throws Exception { + StorDistributionConfig.Builder builder = new StorDistributionConfig.Builder(); ContentCluster cluster = parse( "<content id=\"storage\">\n" + " <documents/>" + @@ -32,6 +32,8 @@ public class StorageGroupTest { "</content>" ); + cluster.getConfig(builder); + assertEquals("content", cluster.getStorageNodes().getChildren().get("0").getServicePropertyString("clustertype")); assertEquals("storage", cluster.getStorageNodes().getChildren().get("0").getServicePropertyString("clustername")); assertEquals("0", cluster.getStorageNodes().getChildren().get("0").getServicePropertyString("index")); @@ -40,8 +42,6 @@ public class StorageGroupTest { assertEquals("storage", cluster.getDistributorNodes().getChildren().get("0").getServicePropertyString("clustername")); assertEquals("0", cluster.getDistributorNodes().getChildren().get("0").getServicePropertyString("index")); - StorDistributionConfig.Builder builder = new StorDistributionConfig.Builder(); - cluster.getConfig(builder); StorDistributionConfig config = new StorDistributionConfig(builder); assertEquals(1, config.group().size()); @@ -51,17 +51,6 @@ public class StorageGroupTest { assertEquals(0, config.group(0).nodes(0).index()); assertEquals(1, config.group(0).nodes(1).index()); //assertNotNull(cluster.getRootGroup().getNodes().get(0).getHost()); - - DistributionConfig.Builder distributionBuilder = new DistributionConfig.Builder(); - cluster.getConfig(distributionBuilder); - DistributionConfig.Cluster clusterConfig = distributionBuilder.build().cluster("storage"); - - assertEquals(1, clusterConfig.group().size()); - assertEquals("invalid", clusterConfig.group(0).index()); - assertEquals("invalid", clusterConfig.group(0).name()); - assertEquals(2, clusterConfig.group(0).nodes().size()); - assertEquals(0, clusterConfig.group(0).nodes(0).index()); - assertEquals(1, clusterConfig.group(0).nodes(1).index()); } @Test @@ -81,14 +70,15 @@ public class StorageGroupTest { " </group>\n" + "</cluster>" ); - fail(); + assertTrue(false); } catch (Exception e) { } } @Test public void testNestedGroups() throws Exception { - ContentCluster cluster = parse( + StorDistributionConfig.Builder builder = new StorDistributionConfig.Builder(); + parse( "<content version=\"1.0\" id=\"storage\">\n" + " <redundancy>4</redundancy>" + " <documents/>" + @@ -111,10 +101,8 @@ public class StorageGroupTest { " </group>\n" + " </group>\n" + "</content>" - ); + ).getConfig(builder); - StorDistributionConfig.Builder builder = new StorDistributionConfig.Builder(); - cluster.getConfig(builder); StorDistributionConfig config = new StorDistributionConfig(builder); assertEquals(5, config.group().size()); @@ -140,39 +128,12 @@ public class StorageGroupTest { assertEquals(5, config.group(4).nodes(1).index()); assertEquals("1|*", config.group(0).partitions()); - - DistributionConfig.Builder distributionBuilder = new DistributionConfig.Builder(); - cluster.getConfig(distributionBuilder); - DistributionConfig.Cluster clusterConfig = distributionBuilder.build().cluster("storage"); - - assertEquals(5, clusterConfig.group().size()); - assertEquals("invalid", clusterConfig.group(0).index()); - assertEquals("0", clusterConfig.group(1).index()); - assertEquals("1", clusterConfig.group(2).index()); - assertEquals("1.0", clusterConfig.group(3).index()); - assertEquals("1.1", clusterConfig.group(4).index()); - assertEquals("invalid", clusterConfig.group(0).name()); - assertEquals("sub1", clusterConfig.group(1).name()); - assertEquals("sub2", clusterConfig.group(2).name()); - assertEquals("sub3", clusterConfig.group(3).name()); - assertEquals("sub4", clusterConfig.group(4).name()); - assertEquals(2, clusterConfig.group(1).nodes().size()); - assertEquals(0, clusterConfig.group(1).nodes(0).index()); - assertEquals(1, clusterConfig.group(1).nodes(1).index()); - assertEquals(0, clusterConfig.group(2).nodes().size()); - assertEquals(2, clusterConfig.group(3).nodes().size()); - assertEquals(2, clusterConfig.group(3).nodes(0).index()); - assertEquals(3, clusterConfig.group(3).nodes(1).index()); - assertEquals(2, clusterConfig.group(4).nodes().size()); - assertEquals(4, clusterConfig.group(4).nodes(0).index()); - assertEquals(5, clusterConfig.group(4).nodes(1).index()); - - assertEquals("1|*", clusterConfig.group(0).partitions()); } @Test public void testGroupCapacity() throws Exception { - ContentCluster cluster = parse( + StorDistributionConfig.Builder builder = new StorDistributionConfig.Builder(); + parse( "<content version=\"1.0\" id=\"storage\">\n" + " <redundancy>2</redundancy>" + " <documents/>" + @@ -188,25 +149,13 @@ public class StorageGroupTest { " </group>\n" + " </group>\n" + "</content>" - ); + ).getConfig(builder); - StorDistributionConfig.Builder builder = new StorDistributionConfig.Builder(); - cluster.getConfig(builder); StorDistributionConfig config = new StorDistributionConfig(builder); assertEquals(3, config.group().size()); assertEquals(5.5, config.group(0).capacity(), 0.001); assertEquals(2, config.group(1).capacity(), 0.001); assertEquals(3.5, config.group(2).capacity(), 0.001); - - DistributionConfig.Builder distributionBuilder = new DistributionConfig.Builder(); - cluster.getConfig(distributionBuilder); - DistributionConfig.Cluster clusterConfig = distributionBuilder.build().cluster("storage"); - - assertEquals(3, clusterConfig.group().size()); - assertEquals(5.5, clusterConfig.group(0).capacity(), 0.001); - assertEquals(2, clusterConfig.group(1).capacity(), 0.001); - assertEquals(3.5, clusterConfig.group(2).capacity(), 0.001); } - } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/routing/test/RoutingTestCase.java b/config-model/src/test/java/com/yahoo/vespa/model/routing/test/RoutingTestCase.java index d2c66b92834..9e7370a933c 100755 --- a/config-model/src/test/java/com/yahoo/vespa/model/routing/test/RoutingTestCase.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/routing/test/RoutingTestCase.java @@ -5,20 +5,12 @@ import com.yahoo.config.ConfigInstance; import com.yahoo.documentapi.messagebus.protocol.DocumentrouteselectorpolicyConfig; import com.yahoo.io.IOUtils; import com.yahoo.messagebus.MessagebusConfig; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; import com.yahoo.vespa.model.VespaModel; import com.yahoo.vespa.model.test.utils.VespaModelCreatorWithFilePkg; import org.junit.Ignore; import org.junit.Test; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.PrintWriter; +import java.io.*; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -104,10 +96,6 @@ public class RoutingTestCase { model.getConfig(drB, ""); DocumentrouteselectorpolicyConfig dr = new DocumentrouteselectorpolicyConfig(drB); assertConfigFileContains(application, files, "documentrouteselectorpolicy.cfg", dr); - - DocumentProtocolPoliciesConfig.Builder policies = new DocumentProtocolPoliciesConfig.Builder(); - model.getConfig(policies, ""); - assertConfigFileContains(application, files, "document-protocol-policies.cfg", policies.build()); } else { StringBuilder msg = new StringBuilder(); for (String error : errors) { diff --git a/configdefinitions/src/vespa/distribution.def b/configdefinitions/src/vespa/distribution.def deleted file mode 100644 index d0cb4165ac9..00000000000 --- a/configdefinitions/src/vespa/distribution.def +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -namespace=vespa.config.content - -## -## Super config for distribution in each content cluster, keyed by cluster id. -## - -# If this is set to true, the distributor will try to enforce one active copy of -# buckets per hierarchical leaf group. This lets the top level dispatcher send -# queries only to the nodes of one group, saving computational effort. -# If used, hierarchical grouping can not be used for other purposes. -# Using this option implies that: -# - ready_copies == redundancy -# - Only one level of hierarchical grouping may be defined. -# - That level distributes copies to all defined groups. -cluster{}.active_per_leaf_group bool default=false - -# The number of copies that should be "ready" to be active. Maximum is redundancy. -cluster{}.ready_copies int default=0 - -# How many copies of a document are stored, across nodes. -cluster{}.redundancy int default=3 - -# Initial redundancy allows put-operations to return as completed after -# a subset of all copies have been stored. -# A value of 0 disable this, and causes normal redundancy behavior instead. -cluster{}.initial_redundancy int default=0 - -# Hierarchical grouping divides the nodes into a tree of groups. The index is the -# string representation of a path from the root node in this tree, e.g., "1.2.1". -cluster{}.group[].index string - -# Each group needs to have a name. Obviously. Duh. -cluster{}.group[].name string - -# Capacity of the given group. -cluster{}.group[].capacity double default=1 - -# Partitions define how copies are divided among child groups/nodes. -cluster{}.group[].partitions string default="" - -# Leaf groups will have a set of nodes within them. Branch groups will have none. -cluster{}.group[].nodes[].index int - -# Whether this node is retired, and data should migrate out of it. -cluster{}.group[].nodes[].retired bool default=false
\ No newline at end of file diff --git a/configdefinitions/src/vespa/document-protocol-policies.def b/configdefinitions/src/vespa/document-protocol-policies.def deleted file mode 100644 index e752a542cbd..00000000000 --- a/configdefinitions/src/vespa/document-protocol-policies.def +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -namespace=messagebus.documentapi - -## -## Super config for all policies in the document protocol, keyed by content cluster ids. -## Note: ContentPolicy also uses the "distribution" config. -## - -# -# Config used by MessageTypeRouteSelectorPolicy -# -# Default route if no override is set for a type. -cluster{}.defaultRoute string - -# The name of the route. -cluster{}.route[].name string - -# The document protocol message type triggering this route. -cluster{}.route[].messageType int - -# -# Config used by DocumentRouteSelectorPolicy -# -# The document selector for this cluster route. -cluster{}.selector string diff --git a/container-core/src/main/java/com/yahoo/container/core/documentapi/DocumentAccessProvider.java b/container-core/src/main/java/com/yahoo/container/core/documentapi/DocumentAccessProvider.java index e8962aa83c5..5e3f873bba9 100644 --- a/container-core/src/main/java/com/yahoo/container/core/documentapi/DocumentAccessProvider.java +++ b/container-core/src/main/java/com/yahoo/container/core/documentapi/DocumentAccessProvider.java @@ -7,8 +7,6 @@ import com.yahoo.component.AbstractComponent; import com.yahoo.container.di.componentgraph.Provider; import com.yahoo.document.config.DocumentmanagerConfig; import com.yahoo.messagebus.MessagebusConfig; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; -import com.yahoo.vespa.config.content.DistributionConfig; import com.yahoo.vespa.config.content.LoadTypeConfig; /** @@ -21,11 +19,10 @@ public class DocumentAccessProvider extends AbstractComponent implements Provide private final VespaDocumentAccess access; @Inject + // TODO jonmv: Have Slobrok and RPC config injected as well. public DocumentAccessProvider(DocumentmanagerConfig documentmanagerConfig, LoadTypeConfig loadTypeConfig, - SlobroksConfig slobroksConfig, MessagebusConfig messagebusConfig, - DocumentProtocolPoliciesConfig policiesConfig, DistributionConfig distributionConfig) { - this.access = new VespaDocumentAccess(documentmanagerConfig, loadTypeConfig, slobroksConfig, messagebusConfig, - policiesConfig, distributionConfig); + SlobroksConfig slobroksConfig, MessagebusConfig messagebusConfig) { + this.access = new VespaDocumentAccess(documentmanagerConfig, loadTypeConfig, slobroksConfig, messagebusConfig); } @Override diff --git a/container-core/src/main/java/com/yahoo/container/core/documentapi/VespaDocumentAccess.java b/container-core/src/main/java/com/yahoo/container/core/documentapi/VespaDocumentAccess.java index 6a106552a12..2918ffb2c80 100644 --- a/container-core/src/main/java/com/yahoo/container/core/documentapi/VespaDocumentAccess.java +++ b/container-core/src/main/java/com/yahoo/container/core/documentapi/VespaDocumentAccess.java @@ -20,8 +20,6 @@ import com.yahoo.documentapi.messagebus.MessageBusDocumentAccess; import com.yahoo.documentapi.messagebus.MessageBusParams; import com.yahoo.documentapi.messagebus.loadtypes.LoadTypeSet; import com.yahoo.messagebus.MessagebusConfig; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; -import com.yahoo.vespa.config.content.DistributionConfig; import com.yahoo.vespa.config.content.LoadTypeConfig; /** @@ -41,12 +39,9 @@ public class VespaDocumentAccess extends DocumentAccess { VespaDocumentAccess(DocumentmanagerConfig documentmanagerConfig, LoadTypeConfig loadTypeConfig, SlobroksConfig slobroksConfig, - MessagebusConfig messagebusConfig, - DocumentProtocolPoliciesConfig policiesConfig, - DistributionConfig distributionConfig) { + MessagebusConfig messagebusConfig) { super(new DocumentAccessParams().setDocumentmanagerConfig(documentmanagerConfig)); - this.parameters = new MessageBusParams(new LoadTypeSet(loadTypeConfig)) - .setDocumentProtocolPoliciesConfig(policiesConfig, distributionConfig); + this.parameters = new MessageBusParams(new LoadTypeSet(loadTypeConfig)); this.parameters.setDocumentmanagerConfig(documentmanagerConfig); this.parameters.getRPCNetworkParams().setSlobroksConfig(slobroksConfig); this.parameters.getMessageBusParams().setMessageBusConfig(messagebusConfig); diff --git a/documentapi/abi-spec.json b/documentapi/abi-spec.json index 2e04487f93d..39d6898215c 100644 --- a/documentapi/abi-spec.json +++ b/documentapi/abi-spec.json @@ -1128,7 +1128,6 @@ "public com.yahoo.documentapi.messagebus.MessageBusParams setRoutingConfigId(java.lang.String)", "public java.lang.String getProtocolConfigId()", "public com.yahoo.documentapi.messagebus.MessageBusParams setProtocolConfigId(java.lang.String)", - "public com.yahoo.documentapi.messagebus.MessageBusParams setDocumentProtocolPoliciesConfig(com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig, com.yahoo.vespa.config.content.DistributionConfig)", "public com.yahoo.documentapi.messagebus.MessageBusParams setRouteName(java.lang.String)", "public com.yahoo.documentapi.messagebus.MessageBusParams setRoute(java.lang.String)", "public com.yahoo.documentapi.messagebus.MessageBusParams setRouteNameForGet(java.lang.String)", @@ -1574,7 +1573,6 @@ "fields": [ "protected final java.lang.String clusterName", "protected final java.lang.String distributionConfigId", - "protected final com.yahoo.vespa.config.content.DistributionConfig distributionConfig", "protected final com.yahoo.documentapi.messagebus.protocol.ContentPolicy$SlobrokHostPatternGenerator slobrokHostPatternGenerator" ] }, @@ -1597,7 +1595,8 @@ "public" ], "methods": [ - "public void <init>(java.lang.String, com.yahoo.vespa.config.content.DistributionConfig)", + "public void <init>(java.lang.String)", + "public void <init>(java.util.Map)", "public void <init>(com.yahoo.documentapi.messagebus.protocol.ContentPolicy$Parameters)", "public void select(com.yahoo.messagebus.routing.RoutingContext)", "public void merge(com.yahoo.messagebus.routing.RoutingContext)", @@ -1807,7 +1806,6 @@ "public static com.yahoo.documentapi.messagebus.protocol.DocumentProtocol$Priority getPriorityByName(java.lang.String)", "public void <init>(com.yahoo.document.DocumentTypeManager)", "public void <init>(com.yahoo.document.DocumentTypeManager, java.lang.String)", - "public void <init>(com.yahoo.document.DocumentTypeManager, com.yahoo.documentapi.messagebus.loadtypes.LoadTypeSet, com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig, com.yahoo.vespa.config.content.DistributionConfig)", "public void <init>(com.yahoo.document.DocumentTypeManager, java.lang.String, com.yahoo.documentapi.messagebus.loadtypes.LoadTypeSet)", "public com.yahoo.documentapi.messagebus.protocol.DocumentProtocol putRoutingPolicyFactory(java.lang.String, com.yahoo.documentapi.messagebus.protocol.RoutingPolicyFactory)", "public com.yahoo.documentapi.messagebus.protocol.DocumentProtocol putRoutableFactory(int, com.yahoo.documentapi.messagebus.protocol.RoutableFactory, com.yahoo.component.VersionSpecification)", @@ -1930,7 +1928,6 @@ "public" ], "methods": [ - "public void <init>(com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig)", "public void <init>(java.lang.String)", "public synchronized java.lang.String getError()", "public void configure(com.yahoo.documentapi.messagebus.protocol.DocumentrouteselectorpolicyConfig)", @@ -2955,6 +2952,18 @@ ], "fields": [] }, + "com.yahoo.documentapi.messagebus.protocol.RoutingPolicyFactories": { + "superClass": "java.lang.Object", + "interfaces": [], + "attributes": [ + "public", + "abstract" + ], + "methods": [ + "public void <init>()" + ], + "fields": [] + }, "com.yahoo.documentapi.messagebus.protocol.RoutingPolicyFactory": { "superClass": "java.lang.Object", "interfaces": [], @@ -2964,7 +2973,8 @@ "abstract" ], "methods": [ - "public abstract com.yahoo.documentapi.messagebus.protocol.DocumentProtocolRoutingPolicy createPolicy(java.lang.String)" + "public abstract com.yahoo.documentapi.messagebus.protocol.DocumentProtocolRoutingPolicy createPolicy(java.lang.String)", + "public abstract void destroy()" ], "fields": [] }, diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/MessageBusParams.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/MessageBusParams.java index 824b1144a67..a838f3b8723 100755 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/MessageBusParams.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/MessageBusParams.java @@ -3,15 +3,8 @@ package com.yahoo.documentapi.messagebus; import com.yahoo.documentapi.DocumentAccessParams; import com.yahoo.documentapi.messagebus.loadtypes.LoadTypeSet; -import com.yahoo.documentapi.messagebus.protocol.DocumentProtocol; import com.yahoo.messagebus.SourceSessionParams; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; import com.yahoo.messagebus.network.rpc.RPCNetworkParams; -import com.yahoo.vespa.config.content.DistributionConfig; - -import java.util.Objects; - -import static java.util.Objects.requireNonNull; /** * @author Einar M R Rosenvinge @@ -20,8 +13,6 @@ public class MessageBusParams extends DocumentAccessParams { private String routingConfigId = null; private String protocolConfigId = null; - private DocumentProtocolPoliciesConfig policiesConfig = null; - private DistributionConfig distributionConfig = null; private String route = "route:default"; private String routeForGet = "route:default-get"; private int traceLevel = 0; @@ -88,14 +79,6 @@ public class MessageBusParams extends DocumentAccessParams { return this; } - /** Sets the config used by the {@link DocumentProtocol} policies. */ - public MessageBusParams setDocumentProtocolPoliciesConfig(DocumentProtocolPoliciesConfig policiesConfig, - DistributionConfig distributionConfig) { - this.policiesConfig = requireNonNull(policiesConfig); - this.distributionConfig = requireNonNull(distributionConfig); - return this; - } - /** * Sets the name of the route to send appropriate requests to. This is a convenience method for prefixing a route * with "route:", and using {@link #setRoute} instead. diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java index f8e6989bbfa..c03231543df 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/ContentPolicy.java @@ -6,6 +6,7 @@ import com.yahoo.document.BucketId; import com.yahoo.document.BucketIdFactory; import com.yahoo.jrt.slobrok.api.IMirror; import com.yahoo.jrt.slobrok.api.Mirror; +import java.util.logging.Level; import com.yahoo.messagebus.EmptyReply; import com.yahoo.messagebus.Error; import com.yahoo.messagebus.ErrorCode; @@ -21,7 +22,6 @@ import com.yahoo.vdslib.state.ClusterState; import com.yahoo.vdslib.state.Node; import com.yahoo.vdslib.state.NodeType; import com.yahoo.vdslib.state.State; -import com.yahoo.vespa.config.content.DistributionConfig; import java.util.ArrayList; import java.util.Collections; @@ -32,7 +32,6 @@ import java.util.Random; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import java.util.logging.Level; import java.util.logging.Logger; /** @@ -222,28 +221,18 @@ public class ContentPolicy extends SlobrokPolicy { /** Class parsing the semicolon separated parameter string and exposes the appropriate value to the policy. */ public static class Parameters { - protected final String clusterName; protected final String distributionConfigId; - protected final DistributionConfig distributionConfig; protected final SlobrokHostPatternGenerator slobrokHostPatternGenerator; public Parameters(Map<String, String> params) { - this(params, null); - } - - private Parameters(Map<String, String> params, DistributionConfig config) { clusterName = params.get("cluster"); - if (clusterName == null) - throw new IllegalArgumentException("Required parameter 'cluster', the name of the content cluster, not set"); - distributionConfig = config; - if (distributionConfig != null && distributionConfig.cluster(clusterName) == null) - throw new IllegalArgumentException("Distribution config for cluster '" + clusterName + "' not found"); distributionConfigId = params.get("clusterconfigid"); // TODO jonmv: remove slobrokHostPatternGenerator = createPatternGenerator(); + if (clusterName == null) throw new IllegalArgumentException("Required parameter 'cluster', the name of the content cluster, not set"); } - private String getDistributionConfigId() { + String getDistributionConfigId() { return distributionConfigId == null ? clusterName : distributionConfigId; } public String getClusterName() { @@ -256,8 +245,7 @@ public class ContentPolicy extends SlobrokPolicy { return new TargetCachingSlobrokHostFetcher(slobrokHostPatternGenerator, policy, percent); } public Distribution createDistribution(SlobrokPolicy policy) { - return distributionConfig == null ? new Distribution(getDistributionConfigId()) - : new Distribution(distributionConfig.cluster(clusterName)); + return new Distribution(getDistributionConfigId()); } /** @@ -560,8 +548,12 @@ public class ContentPolicy extends SlobrokPolicy { private final Parameters parameters; /** Constructor used in production. */ - public ContentPolicy(String param, DistributionConfig config) { - this(new Parameters(parse(param), config)); + public ContentPolicy(String param) { + this(parse(param)); + } + + public ContentPolicy(Map<String, String> params) { + this(new Parameters(params)); } /** Constructor specifying a bit more in detail, so we can override what needs to be overridden in tests */ diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocol.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocol.java index 0ce83a3c204..2680ed011af 100755 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocol.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentProtocol.java @@ -11,12 +11,10 @@ import com.yahoo.messagebus.ErrorCode; import com.yahoo.messagebus.Protocol; import com.yahoo.messagebus.Reply; import com.yahoo.messagebus.Routable; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; import com.yahoo.messagebus.routing.RoutingContext; import com.yahoo.messagebus.routing.RoutingNodeIterator; import com.yahoo.messagebus.routing.RoutingPolicy; import com.yahoo.text.Utf8String; -import com.yahoo.vespa.config.content.DistributionConfig; import java.util.Collections; import java.util.HashSet; @@ -26,8 +24,6 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import static java.util.Objects.requireNonNull; - /** * Implements the message bus protocol that is used by all components of Vespa. * @@ -247,36 +243,27 @@ public class DocumentProtocol implements Protocol { this(docMan, configId, new LoadTypeSet()); } - public DocumentProtocol(DocumentTypeManager documentTypeManager, LoadTypeSet loadTypes, - DocumentProtocolPoliciesConfig policiesConfig, DistributionConfig distributionConfig) { - this(requireNonNull(documentTypeManager), null, requireNonNull(loadTypes), - requireNonNull(policiesConfig), requireNonNull(distributionConfig)); - } - public DocumentProtocol(DocumentTypeManager docMan, String configId, LoadTypeSet set) { - this(docMan, configId == null ? "client" : configId, set, null, null); - } - - private DocumentProtocol(DocumentTypeManager docMan, String configId, LoadTypeSet set, - DocumentProtocolPoliciesConfig policiesConfig, DistributionConfig distributionConfig) { - if (docMan != null) + // Prepare config string for routing policy factories. + String cfg = (configId == null ? "client" : configId); + if (docMan != null) { this.docMan = docMan; - else { + } else { this.docMan = new DocumentTypeManager(); - DocumentTypeManagerConfigurer.configure(this.docMan, configId); + DocumentTypeManagerConfigurer.configure(this.docMan, cfg); } - this.routableRepository = new RoutableRepository(set); + routableRepository = new RoutableRepository(set); // When adding factories to this list, please KEEP THEM ORDERED alphabetically like they are now. putRoutingPolicyFactory("AND", new RoutingPolicyFactories.AndPolicyFactory()); - putRoutingPolicyFactory("Content", new RoutingPolicyFactories.ContentPolicyFactory(distributionConfig)); - putRoutingPolicyFactory("DocumentRouteSelector", new RoutingPolicyFactories.DocumentRouteSelectorPolicyFactory(configId, policiesConfig)); + putRoutingPolicyFactory("Content", new RoutingPolicyFactories.ContentPolicyFactory()); + putRoutingPolicyFactory("DocumentRouteSelector", new RoutingPolicyFactories.DocumentRouteSelectorPolicyFactory(cfg)); putRoutingPolicyFactory("Extern", new RoutingPolicyFactories.ExternPolicyFactory()); putRoutingPolicyFactory("LocalService", new RoutingPolicyFactories.LocalServicePolicyFactory()); - putRoutingPolicyFactory("MessageType", new RoutingPolicyFactories.MessageTypePolicyFactory(configId, policiesConfig)); + putRoutingPolicyFactory("MessageType", new RoutingPolicyFactories.MessageTypePolicyFactory(cfg)); putRoutingPolicyFactory("RoundRobin", new RoutingPolicyFactories.RoundRobinPolicyFactory()); putRoutingPolicyFactory("LoadBalancer", new RoutingPolicyFactories.LoadBalancerPolicyFactory()); - putRoutingPolicyFactory("Storage", new RoutingPolicyFactories.ContentPolicyFactory(distributionConfig)); + putRoutingPolicyFactory("Storage", new RoutingPolicyFactories.ContentPolicyFactory()); putRoutingPolicyFactory("SubsetService", new RoutingPolicyFactories.SubsetServicePolicyFactory()); // Prepare version specifications to use when adding routable factories. diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentRouteSelectorPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentRouteSelectorPolicy.java index 6151daf043f..8fbd1548f68 100755 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentRouteSelectorPolicy.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/DocumentRouteSelectorPolicy.java @@ -5,15 +5,13 @@ import com.yahoo.config.subscription.ConfigSubscriber; import com.yahoo.document.DocumentGet; import com.yahoo.document.select.DocumentSelector; import com.yahoo.document.select.Result; -import com.yahoo.document.select.parser.ParseException; +import java.util.logging.Level; import com.yahoo.messagebus.Message; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; import com.yahoo.messagebus.routing.Route; import com.yahoo.messagebus.routing.RoutingContext; import java.util.HashMap; import java.util.Map; -import java.util.logging.Level; import java.util.logging.Logger; /** @@ -32,24 +30,6 @@ public class DocumentRouteSelectorPolicy private String error = "Not configured."; private ConfigSubscriber subscriber; - /** This policy is constructed with the proper config at its time of creation. */ - public DocumentRouteSelectorPolicy(DocumentProtocolPoliciesConfig config) { - Map<String, DocumentSelector> selectors = new HashMap<>(); - config.cluster().forEach((name, cluster) -> { - try { - selectors.put(name, new DocumentSelector(cluster.selector())); - } - catch (ParseException e) { - throw new IllegalArgumentException("Error parsing selector '" + - cluster.selector() + - "' for route '" + name +"'", - e); - } - }); - this.config = Map.copyOf(selectors); - this.error = null; - } - /** * This policy is constructed with a configuration identifier that can be subscribed to for the document selector * config. If the string is either null or empty it will default to the proper one. diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/MessageTypePolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/MessageTypePolicy.java index 026a26cfc0c..4226c1e6cac 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/MessageTypePolicy.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/MessageTypePolicy.java @@ -2,17 +2,13 @@ package com.yahoo.documentapi.messagebus.protocol; import com.yahoo.config.subscription.ConfigSubscriber; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; import com.yahoo.messagebus.routing.Route; import com.yahoo.messagebus.routing.RoutingContext; import com.yahoo.vespa.config.content.MessagetyperouteselectorpolicyConfig; - import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; -import static java.util.stream.Collectors.toUnmodifiableMap; - /** * @author baldersheim */ @@ -22,13 +18,6 @@ public class MessageTypePolicy implements DocumentProtocolRoutingPolicy, ConfigS private ConfigSubscriber subscriber; private volatile Route defaultRoute; - MessageTypePolicy(DocumentProtocolPoliciesConfig.Cluster config) { - configRef.set(config.route().stream() - .collect(toUnmodifiableMap(route -> route.messageType(), - route -> Route.parse(route.name())))); - defaultRoute = Route.parse(config.defaultRoute()); - } - MessageTypePolicy(String configId) { subscriber = new ConfigSubscriber(); subscriber.subscribe(this, MessagetyperouteselectorpolicyConfig.class, configId); diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutingPolicyFactories.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutingPolicyFactories.java index 8535fa610dd..7b44a1a4f0d 100755 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutingPolicyFactories.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutingPolicyFactories.java @@ -1,72 +1,54 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.documentapi.messagebus.protocol; -import com.yahoo.messagebus.documentapi.DocumentProtocolPoliciesConfig; -import com.yahoo.vespa.config.content.DistributionConfig; - /** * @author Simon Thoresen Hult - * @author jonmv */ -class RoutingPolicyFactories { - - private RoutingPolicyFactories() { } +public abstract class RoutingPolicyFactories { static class AndPolicyFactory implements RoutingPolicyFactory { public DocumentProtocolRoutingPolicy createPolicy(String param) { return new ANDPolicy(param); } + + + public void destroy() { + } } static class ContentPolicyFactory implements RoutingPolicyFactory { - private final DistributionConfig distributionConfig; - public ContentPolicyFactory(DistributionConfig config) { this.distributionConfig = config; } public DocumentProtocolRoutingPolicy createPolicy(String param) { - return new ContentPolicy(param, distributionConfig); + return new ContentPolicy(param); + } + + public void destroy() { } } static class MessageTypePolicyFactory implements RoutingPolicyFactory { - private final String configId; - private final DocumentProtocolPoliciesConfig config; - public MessageTypePolicyFactory(String configId, DocumentProtocolPoliciesConfig config) { + public MessageTypePolicyFactory(String configId) { this.configId = configId; - this.config = config; } - public DocumentProtocolRoutingPolicy createPolicy(String param) { - if (config != null) { - if (config.cluster(param) == null) - return new ErrorPolicy("No message type config for cluster '" + param + "'"); + return new MessageTypePolicy((param == null || param.isEmpty()) ? configId : param); + } - return new MessageTypePolicy(config.cluster(param)); - } - return new MessageTypePolicy(param == null || param.isEmpty() ? configId : param); + public void destroy() { } } static class DocumentRouteSelectorPolicyFactory implements RoutingPolicyFactory { private final String configId; - private final DocumentProtocolPoliciesConfig config; - public DocumentRouteSelectorPolicyFactory(String configId, DocumentProtocolPoliciesConfig config) { + public DocumentRouteSelectorPolicyFactory(String configId) { this.configId = configId; - this.config = config; } public DocumentProtocolRoutingPolicy createPolicy(String param) { - if (config != null) { - try { - return new DocumentRouteSelectorPolicy(config); - } - catch (IllegalArgumentException e) { - return new ErrorPolicy(e.getMessage()); - } - } - DocumentRouteSelectorPolicy ret = new DocumentRouteSelectorPolicy(param == null || param.isEmpty() ? + DocumentRouteSelectorPolicy ret = new DocumentRouteSelectorPolicy((param == null || param.isEmpty()) ? configId : param); String error = ret.getError(); if (error != null) { @@ -74,6 +56,10 @@ class RoutingPolicyFactories { } return ret; } + + + public void destroy() { + } } static class ExternPolicyFactory implements RoutingPolicyFactory { @@ -85,30 +71,49 @@ class RoutingPolicyFactories { } return ret; } + + + public void destroy() { + } } static class LocalServicePolicyFactory implements RoutingPolicyFactory { public DocumentProtocolRoutingPolicy createPolicy(String param) { return new LocalServicePolicy(param); } + + + public void destroy() { + } } static class RoundRobinPolicyFactory implements RoutingPolicyFactory { public DocumentProtocolRoutingPolicy createPolicy(String param) { return new RoundRobinPolicy(); } + + + public void destroy() { + } } static class LoadBalancerPolicyFactory implements RoutingPolicyFactory { public DocumentProtocolRoutingPolicy createPolicy(String param) { return new LoadBalancerPolicy(param); } + + + public void destroy() { + } } static class SubsetServicePolicyFactory implements RoutingPolicyFactory { public DocumentProtocolRoutingPolicy createPolicy(String param) { return new SubsetServicePolicy(param); } - } + + public void destroy() { + } + } } diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutingPolicyFactory.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutingPolicyFactory.java index 3e368832c98..6ea5020607e 100755 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutingPolicyFactory.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/RoutingPolicyFactory.java @@ -24,6 +24,11 @@ public interface RoutingPolicyFactory { * @param param The parameter to use when creating the policy. * @return The created routing policy. */ - DocumentProtocolRoutingPolicy createPolicy(String param); + public DocumentProtocolRoutingPolicy createPolicy(String param); + /** + * Destroys this factory and frees up any resources it has held. Making further calls on a destroyed + * factory causes a runtime exception. + */ + public void destroy(); } diff --git a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/SlobrokPolicy.java b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/SlobrokPolicy.java index 1ffce622d78..f4e1bb33dd1 100644 --- a/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/SlobrokPolicy.java +++ b/documentapi/src/main/java/com/yahoo/documentapi/messagebus/protocol/SlobrokPolicy.java @@ -10,10 +10,10 @@ import java.util.Map; import java.util.TreeMap; /** - * Abstract class for policies that allow you to specify which slobrok to use for the routing. + * Abstract class for policies that allow you to specify which slobrok to use for the + * routing. */ public abstract class SlobrokPolicy implements DocumentProtocolRoutingPolicy { - private boolean firstTry = true; protected List<Mirror.Entry> lookup(RoutingContext context, String pattern) { diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/ContentPolicyTest.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/ContentPolicyTest.java index 5aa3994a757..f324245b612 100644 --- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/ContentPolicyTest.java +++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/ContentPolicyTest.java @@ -5,7 +5,6 @@ import org.junit.Ignore; import org.junit.Test; public class ContentPolicyTest extends Simulator { - /** * Verify that a resent message with failures doesn't ruin overall performance. (By dumping the cached state too often * so other requests are sent to wrong target) @@ -18,7 +17,6 @@ public class ContentPolicyTest extends Simulator { + "Last correctnode 99, wrongnode 1, downnode 0, worked 92, failed 8", new PersistentFailureTestParameters().addBadNode(new BadNode(3, FailureType.TRANSIENT_ERROR))); } - /** * Verify that a resent message with failures doesn't ruin overall performance. (By dumping the cached state too often * so other requests are sent to wrong target) @@ -31,7 +29,6 @@ public class ContentPolicyTest extends Simulator { + "Last correctnode 99, wrongnode 1, downnode 0, worked 92, failed 8", new PersistentFailureTestParameters().addBadNode(new BadNode(3, FailureType.FATAL_ERROR))); } - /** * Verify that a node responding with old cluster state doesn't ruin overall performance (By dumping/switching cached * state too often) @@ -44,7 +41,6 @@ public class ContentPolicyTest extends Simulator { + "Last correctnode 100, wrongnode 0, downnode 0, worked 100, failed 0", new PersistentFailureTestParameters().addBadNode(new BadNode(3, FailureType.OLD_CLUSTER_STATE).setDownInCurrentState())); } - /** * Verify that a reset cluster state version doesn't keep sending requests to the wrong node. * We expect a few failures in first half. We should have detected the issue before second half, so there all should be fine. @@ -56,7 +52,6 @@ public class ContentPolicyTest extends Simulator { + "Last correctnode .*, wrongnode 0, downnode 0, worked .*, failed 0", new PersistentFailureTestParameters().addBadNode(new BadNode(3, FailureType.RESET_CLUSTER_STATE).setDownInCurrentState())); } - /** * Verify that a reset cluster state version doesn't keep sending requests to the wrong node. * We expect a few failures in first half. We should have detected the issue before second half, so there all should be fine. @@ -75,7 +70,6 @@ public class ContentPolicyTest extends Simulator { + "Last correctnode .*, wrongnode 100, downnode 100, worked 0, failed 100", new PersistentFailureTestParameters().addBadNode(new BadNode(3, FailureType.RESET_CLUSTER_STATE_NO_GOOD_NODES).setDownInCurrentState())); } - /** * Verify that a reset cluster state version doesn't keep sending requests to the wrong node. * We expect a few failures in first half. We should have detected the issue before second half, so there all should be fine. @@ -92,7 +86,6 @@ public class ContentPolicyTest extends Simulator { + "Last correctnode .*, wrongnode 91, downnode 0, worked 0, failed 100", new PersistentFailureTestParameters().addBadNode(new BadNode(3, FailureType.RESET_CLUSTER_STATE_NO_GOOD_NODES))); } - /** * Verify that a reset cluster state version doesn't keep sending requests to the wrong node. * Another scenario where we have a node coming up in correct state. @@ -105,7 +98,6 @@ public class ContentPolicyTest extends Simulator { + "Last correctnode .*, wrongnode 0, downnode 0, worked .*, failed 0", new PersistentFailureTestParameters().newNodeAdded().addBadNode(new BadNode(3, FailureType.RESET_CLUSTER_STATE).setDownInCurrentState())); } - /** Test node that is not in slobrok. Until fleetcontroller detects this, we expect 10% of the requests to go to wrong node. */ @Test @Ignore // FIXME test has been implicitly disabled for ages, figure out and fix diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/ContentPolicyTestEnvironment.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/ContentPolicyTestEnvironment.java index 6d2477e1871..479e0b0f422 100644 --- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/ContentPolicyTestEnvironment.java +++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/ContentPolicyTestEnvironment.java @@ -34,13 +34,11 @@ import java.util.TreeSet; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; public abstract class ContentPolicyTestEnvironment { - protected ContentPolicyTestFactory policyFactory; + protected StoragePolicyTestFactory policyFactory; protected PolicyTestFrame frame; private Set<Integer> nodes; protected static int[] bucketOneNodePreference = new int[]{ 3, 5, 7, 6, 8, 0, 9, 2, 1, 4 }; @@ -53,7 +51,7 @@ public abstract class ContentPolicyTestEnvironment { frame = new PolicyTestFrame(manager); nodes = new TreeSet<>(); DocumentProtocol protocol = (DocumentProtocol) frame.getMessageBus().getProtocol((Utf8Array)DocumentProtocol.NAME); - policyFactory = new ContentPolicyTestFactory(nodes); + policyFactory = new StoragePolicyTestFactory(nodes); protocol.putRoutingPolicyFactory("storage", policyFactory); frame.setMessage(createMessage("id:ns:testdoc:n=1:foo")); frame.setHop(new HopSpec("test", "[storage:cluster=foo]")); @@ -106,7 +104,7 @@ public abstract class ContentPolicyTestEnvironment { public static class TestHostFetcher extends ContentPolicy.HostFetcher { private final String clusterName; - private final RandomGen randomizer = new RandomGen(1234); + private RandomGen randomizer = new RandomGen(1234); private final Set<Integer> nodes; private Integer avoidPickingAtRandom = null; @@ -123,14 +121,13 @@ public abstract class ContentPolicyTestEnvironment { try{ if (distributor == null) { if (nodes.size() == 1) { - assertNotSame(avoidPickingAtRandom, nodes.iterator().next()); + assertTrue(avoidPickingAtRandom != nodes.iterator().next()); distributor = nodes.iterator().next(); } else { Iterator<Integer> it = nodes.iterator(); for (int i = 0, n = randomizer.nextInt(nodes.size() - 1); i<n; ++i) it.next(); distributor = it.next(); - if (avoidPickingAtRandom != null && avoidPickingAtRandom.equals(distributor)) - distributor = it.next(); + if (avoidPickingAtRandom != null && distributor == avoidPickingAtRandom) distributor = it.next(); } } if (nodes.contains(distributor)) { @@ -140,7 +137,8 @@ public abstract class ContentPolicyTestEnvironment { } } catch (RuntimeException e) { e.printStackTrace(); - throw new AssertionError(e.getMessage()); + assertTrue(e.getMessage(), false); + throw e; } } } @@ -162,12 +160,12 @@ public abstract class ContentPolicyTestEnvironment { public Distribution createDistribution(SlobrokPolicy policy) { return distribution; } } - public static class ContentPolicyTestFactory implements RoutingPolicyFactory { + public static class StoragePolicyTestFactory implements RoutingPolicyFactory { private Set<Integer> nodes; - private final LinkedList<TestParameters> parameterInstances = new LinkedList<>(); + private final LinkedList<TestParameters> parameterInstances = new LinkedList<TestParameters>(); private Integer avoidPickingAtRandom = null; - public ContentPolicyTestFactory(Set<Integer> nodes) { + public StoragePolicyTestFactory(Set<Integer> nodes) { this.nodes = nodes; } public DocumentProtocolRoutingPolicy createPolicy(String parameters) { diff --git a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/Simulator.java b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/Simulator.java index be880e69781..d23dd9ea998 100644 --- a/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/Simulator.java +++ b/documentapi/src/test/java/com/yahoo/documentapi/messagebus/protocol/test/storagepolicy/Simulator.java @@ -31,7 +31,7 @@ public abstract class Simulator extends ContentPolicyTestEnvironment { RESET_CLUSTER_STATE_NO_GOOD_NODES, NODE_NOT_IN_SLOBROK }; - private int getIdealTarget(String idString, String clusterState) { + private Integer getIdealTarget(String idString, String clusterState) { DocumentId did = new DocumentId(idString); BucketIdFactory factory = new BucketIdFactory(); BucketId bid = factory.getBucketId(did); @@ -145,7 +145,6 @@ public abstract class Simulator extends ContentPolicyTestEnvironment { return currentClusterState; } } - public void runSimulation(String expected, PersistentFailureTestParameters params) { params.validate(); // Set nodes in slobrok @@ -158,16 +157,16 @@ public abstract class Simulator extends ContentPolicyTestEnvironment { replyWrongDistribution(target, "foo", null, params.getInitialClusterState().toString()); } RandomGen randomizer = new RandomGen(432121); - int[] correctnode = new int[2], - wrongnode = new int[2], - failed = new int[2], - worked = new int[2], - downnode = new int[2]; + int correctnode[] = new int[2], + wrongnode[] = new int[2], + failed[] = new int[2], + worked[] = new int[2], + downnode[] = new int[2]; for (int step = 0, steps = (params.getTotalRequests() / params.getParallellRequests()); step < steps; ++step) { int half = (step < steps / 2 ? 0 : 1); if (debug) System.err.println("Starting step " + step + " in half " + half); - String[] docId = new String[params.getParallellRequests()]; - RoutingNode[] targets = new RoutingNode[params.getParallellRequests()]; + String docId[] = new String[params.getParallellRequests()]; + RoutingNode targets[] = new RoutingNode[params.getParallellRequests()]; for (int i=0; i<params.getParallellRequests(); ++i) { docId[i] = "id:ns:testdoc::" + (step * params.getParallellRequests() + i); frame.setMessage(createMessage(docId[i])); @@ -207,6 +206,7 @@ public abstract class Simulator extends ContentPolicyTestEnvironment { } } StringBuilder actual = new StringBuilder(); + String result[][] = new String[2][]; for (int i=0; i<2; ++i) { actual.append(i == 0 ? "First " : " Last ") .append("correctnode ").append(correctnode[i]) @@ -215,7 +215,7 @@ public abstract class Simulator extends ContentPolicyTestEnvironment { .append(", worked ").append(worked[i]) .append(", failed ").append(failed[i]); } - if ( ! Pattern.matches(expected, actual.toString())) { + if (!Pattern.matches(expected, actual.toString())) { assertEquals(expected, actual.toString()); } } diff --git a/messagebus/src/main/java/com/yahoo/messagebus/test/SimpleMessage.java b/messagebus/src/main/java/com/yahoo/messagebus/test/SimpleMessage.java index f87bcdbe1bb..0e77d94497e 100644 --- a/messagebus/src/main/java/com/yahoo/messagebus/test/SimpleMessage.java +++ b/messagebus/src/main/java/com/yahoo/messagebus/test/SimpleMessage.java @@ -5,7 +5,7 @@ import com.yahoo.messagebus.Message; import com.yahoo.text.Utf8String; /** - * @author havardpe + * @author <a href="mailto:havardpe@yahoo-inc.com">Haavard Pettersen</a> */ public class SimpleMessage extends Message { diff --git a/messagebus/src/test/java/com/yahoo/messagebus/DynamicThrottlePolicyTest.java b/messagebus/src/test/java/com/yahoo/messagebus/DynamicThrottlePolicyTest.java index 63747803e75..7f48edfd48c 100644 --- a/messagebus/src/test/java/com/yahoo/messagebus/DynamicThrottlePolicyTest.java +++ b/messagebus/src/test/java/com/yahoo/messagebus/DynamicThrottlePolicyTest.java @@ -101,7 +101,7 @@ public class DynamicThrottlePolicyTest { CustomTimer timer = new CustomTimer(); DynamicThrottlePolicy policy = new DynamicThrottlePolicy(timer); int scaleFactor = (int) Math.pow(10, i); - long operations = 3_000L * scaleFactor; + long operations = 3_000 * scaleFactor; int workPerSuccess = 6; int numberOfWorkers = 1; int maximumTasksPerWorker = 100000; @@ -124,7 +124,7 @@ public class DynamicThrottlePolicyTest { CustomTimer timer = new CustomTimer(); DynamicThrottlePolicy policy = new DynamicThrottlePolicy(timer); int scaleFactor = (int) Math.pow(10, i); - long operations = 5_000L * scaleFactor; + long operations = 5_000 * scaleFactor; // workPerSuccess determines the latency of the simulated server, which again determines the impact of the // synthetic attractors of the algorithm, around latencies which give (close to) integer log10(1 / latency). // With a value of 5, the impact is that the algorithm is pushed upwards slightly above 10k window size, @@ -319,6 +319,7 @@ public class DynamicThrottlePolicyTest { .collect(toUnmodifiableList()); } + /** Performs a tick, and returns whether work was done. */ void tick() { for (int i = 0; i < numberOfWorkers; i++) tick(i); diff --git a/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java b/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java index accf3942e4d..c9acd625373 100644 --- a/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java +++ b/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java @@ -9,7 +9,6 @@ import com.yahoo.vdslib.state.Node; import com.yahoo.vdslib.state.NodeState; import com.yahoo.vdslib.state.NodeType; import com.yahoo.vdslib.state.State; -import com.yahoo.vespa.config.content.DistributionConfig; import com.yahoo.vespa.config.content.StorDistributionConfig; import com.yahoo.document.BucketId; @@ -41,6 +40,7 @@ public class Distribution { private final boolean distributorAutoOwnershipTransferOnWholeGroupDown; } + private final int[] distributionBitMasks = new int[65]; private ConfigSubscriber configSub; private final AtomicReference<Config> config = new AtomicReference<>(new Config(null, 1, false)); @@ -52,103 +52,67 @@ public class Distribution { return config.getAcquire().redundancy; } - private static int[] getGroupPath(String path) { - if (path.equals("invalid")) { return new int[0]; } - StringTokenizer st = new StringTokenizer(path, "."); - int[] p = new int[st.countTokens()]; - for (int i=0; i<p.length; ++i) { - p[i] = Integer.valueOf(st.nextToken()); - } - return p; - } - - // NOTE: keep in sync with the below - private ConfigSubscriber.SingleSubscriber<StorDistributionConfig> configSubscriber = config -> { - try { - Group root = null; - for (int i=0; i<config.group().size(); ++i) { - StorDistributionConfig.Group cg = config.group(i); - int[] path = new int[0]; - if (root != null) { - path = getGroupPath(cg.index()); - } - boolean isLeafGroup = (cg.nodes().size() > 0); - Group group; - int index = (path.length == 0 ? 0 : path[path.length - 1]); - if (isLeafGroup) { - group = new Group(index, cg.name()); - List<ConfiguredNode> nodes = new ArrayList<>(); - for (StorDistributionConfig.Group.Nodes node : cg.nodes()) { - nodes.add(new ConfiguredNode(node.index(), node.retired())); - } - group.setNodes(nodes); - } else { - group = new Group(index, cg.name(), new Group.Distribution(cg.partitions(), config.redundancy())); - } - group.setCapacity(cg.capacity()); - if (path.length == 0) { - root = group; - } else { - Group parent = root; - for (int j=0; j<path.length - 1; ++j) { - parent = parent.getSubgroups().get(path[j]); - } - parent.addSubGroup(group); - } + private ConfigSubscriber.SingleSubscriber<StorDistributionConfig> configSubscriber = new ConfigSubscriber.SingleSubscriber<>() { + private int[] getGroupPath(String path) { + if (path.equals("invalid")) { return new int[0]; } + StringTokenizer st = new StringTokenizer(path, "."); + int[] p = new int[st.countTokens()]; + for (int i=0; i<p.length; ++i) { + p[i] = Integer.valueOf(st.nextToken()); } - if (root == null) - throw new IllegalStateException("Config does not specify a root group"); - root.calculateDistributionHashValues(); - Distribution.this.config.setRelease(new Config(root, config.redundancy(), config.distributor_auto_ownership_transfer_on_whole_group_down())); - } catch (ParseException e) { - throw new IllegalStateException("Failed to parse config", e); + return p; } - }; - // TODO jonmv: De-dupe with this.configSubscriber once common config is used - private void configure(DistributionConfig.Cluster config) { - try { - Group root = null; - for (int i=0; i<config.group().size(); ++i) { - DistributionConfig.Cluster.Group cg = config.group(i); - int[] path = new int[0]; - if (root != null) { - path = getGroupPath(cg.index()); - } - boolean isLeafGroup = (cg.nodes().size() > 0); - Group group; - int index = (path.length == 0 ? 0 : path[path.length - 1]); - if (isLeafGroup) { - group = new Group(index, cg.name()); - List<ConfiguredNode> nodes = new ArrayList<>(); - for (DistributionConfig.Cluster.Group.Nodes node : cg.nodes()) { - nodes.add(new ConfiguredNode(node.index(), node.retired())); + @Override + public void configure(StorDistributionConfig config) { + try{ + Group root = null; + for (int i=0; i<config.group().size(); ++i) { + StorDistributionConfig.Group cg = config.group().get(i); + int[] path = new int[0]; + if (root != null) { + path = getGroupPath(cg.index()); } - group.setNodes(nodes); - } else { - group = new Group(index, cg.name(), new Group.Distribution(cg.partitions(), config.redundancy())); - } - group.setCapacity(cg.capacity()); - if (path.length == 0) { - root = group; - } else { - Group parent = root; - for (int j=0; j<path.length - 1; ++j) { - parent = parent.getSubgroups().get(path[j]); + boolean isLeafGroup = (cg.nodes().size() > 0); + Group group; + int index = (path.length == 0 ? 0 : path[path.length - 1]); + if (isLeafGroup) { + group = new Group(index, cg.name()); + List<ConfiguredNode> nodes = new ArrayList<>(); + for (StorDistributionConfig.Group.Nodes node : cg.nodes()) { + nodes.add(new ConfiguredNode(node.index(), node.retired())); + } + group.setNodes(nodes); + } else { + group = new Group(index, cg.name(), new Group.Distribution(cg.partitions(), config.redundancy())); + } + group.setCapacity(cg.capacity()); + if (path.length == 0) { + root = group; + } else { + Group parent = root; + for (int j=0; j<path.length - 1; ++j) { + parent = parent.getSubgroups().get(path[j]); + } + parent.addSubGroup(group); } - parent.addSubGroup(group); } + if (root == null) + throw new IllegalStateException("Config does not specify a root group"); + root.calculateDistributionHashValues(); + Distribution.this.config.setRelease(new Config(root, config.redundancy(), config.distributor_auto_ownership_transfer_on_whole_group_down())); + } catch (ParseException e) { + throw new IllegalStateException("Failed to parse config", e); } - if (root == null) - throw new IllegalStateException("Config does not specify a root group"); - root.calculateDistributionHashValues(); - Distribution.this.config.setRelease(new Config(root, config.redundancy(), true)); - } catch (ParseException e) { - throw new IllegalStateException("Failed to parse config", e); } - } + }; public Distribution(String configId) { + int mask = 0; + for (int i=0; i<=64; ++i) { + distributionBitMasks[i] = mask; + mask = (mask << 1) | 1; + } try { configSub = new ConfigSubscriber(); configSub.subscribe(configSubscriber, StorDistributionConfig.class, configId); @@ -159,20 +123,14 @@ public class Distribution { } public Distribution(StorDistributionConfig config) { + int mask = 0; + for (int i=0; i<=64; ++i) { + distributionBitMasks[i] = mask; + mask = (mask << 1) | 1; + } configSubscriber.configure(config); } - public Distribution(DistributionConfig.Cluster config) { - configure(config); - } - - private static long lastNBits(long value, int n) { - if (n < 0 || n > 63) - throw new IllegalArgumentException("n must be in [0, 63], but was " + n); - - return value & ((1L << n) - 1); - } - public void close() { if (configSub!=null) { configSub.close(); @@ -182,21 +140,22 @@ public class Distribution { } private int getGroupSeed(BucketId bucket, ClusterState state, Group group) { - int seed = (int) lastNBits(bucket.getRawId(), state.getDistributionBitCount()); + int seed = ((int) bucket.getRawId()) & distributionBitMasks[state.getDistributionBitCount()]; seed ^= group.getDistributionHash(); return seed; } private int getDistributorSeed(BucketId bucket, ClusterState state) { - return (int) lastNBits(bucket.getRawId(), state.getDistributionBitCount()); + return ((int) bucket.getRawId()) & distributionBitMasks[state.getDistributionBitCount()]; } private int getStorageSeed(BucketId bucket, ClusterState state) { - int seed = (int) lastNBits(bucket.getRawId(), state.getDistributionBitCount()); + int seed = ((int) bucket.getRawId()) & distributionBitMasks[state.getDistributionBitCount()]; if (bucket.getUsedBits() > 33) { int usedBits = bucket.getUsedBits() - 1; - seed ^= lastNBits(bucket.getRawId() >> 32, usedBits - 32) << 6; + seed ^= (distributionBitMasks[usedBits - 32] + & (bucket.getRawId() >> 32)) << 6; } return seed; } @@ -213,7 +172,6 @@ public class Distribution { return Double.compare(o.score, score); } } - private static class ScoredNode { int index; int reliability; @@ -221,7 +179,6 @@ public class Distribution { ScoredNode(int index, int reliability, double score) { this.index = index; this.reliability = reliability; this.score = score; } } - private static boolean allDistributorsDown(Group g, ClusterState clusterState) { if (g.isLeafGroup()) { for (ConfiguredNode node : g.getNodes()) { @@ -235,7 +192,6 @@ public class Distribution { } return true; } - private Group getIdealDistributorGroup(boolean distributorAutoOwnershipTransferOnWholeGroupDown, BucketId bucket, ClusterState clusterState, Group parent, int redundancy) { if (parent.isLeafGroup()) { @@ -264,7 +220,6 @@ public class Distribution { } return getIdealDistributorGroup(distributorAutoOwnershipTransferOnWholeGroupDown, bucket, clusterState, results.first().group, redundancyArray[0]); } - private static class ResultGroup implements Comparable<ResultGroup> { Group group; int redundancy; @@ -279,7 +234,6 @@ public class Distribution { return group.compareTo(o.group); } } - private void getIdealGroups(BucketId bucketId, ClusterState clusterState, Group parent, int redundancy, List<ResultGroup> results) { if (parent.isLeafGroup()) { @@ -470,13 +424,11 @@ public class Distribution { super(message); } } - public static class NoDistributorsAvailableException extends Exception { NoDistributorsAvailableException(String message) { super(message); } } - public int getIdealDistributorNode(ClusterState state, BucketId bucket, String upStates) throws TooFewBucketBitsInUseException, NoDistributorsAvailableException { if (bucket.getUsedBits() < state.getDistributionBitCount()) { throw new TooFewBucketBitsInUseException("Cannot get ideal state for bucket " + bucket + " using " + bucket.getUsedBits() @@ -522,7 +474,6 @@ public class Distribution { } return node.index; } - private boolean visitGroups(GroupVisitor visitor, Map<Integer, Group> groups) { for (Group g : groups.values()) { if (!visitor.visitGroup(g)) return false; @@ -534,14 +485,12 @@ public class Distribution { } return true; } - public void visitGroups(GroupVisitor visitor) { Map<Integer, Group> groups = new TreeMap<>(); Group nodeGraph = config.getAcquire().nodeGraph; groups.put(nodeGraph.getIndex(), nodeGraph); visitGroups(visitor, groups); } - public Set<ConfiguredNode> getNodes() { final Set<ConfiguredNode> nodes = new HashSet<>(); GroupVisitor visitor = new GroupVisitor() { @@ -575,11 +524,9 @@ public class Distribution { sb.append("disk_distribution ").append(diskDistribution.toString()).append("\n"); return sb.toString(); } - public static String getSimpleGroupConfig(int redundancy, int nodeCount) { return getSimpleGroupConfig(redundancy, nodeCount, StorDistributionConfig.Disk_distribution.Enum.MODULO_BID); } - private static String getSimpleGroupConfig(int redundancy, int nodeCount, StorDistributionConfig.Disk_distribution.Enum diskDistribution) { StringBuilder sb = new StringBuilder(); sb.append("raw:redundancy ").append(redundancy).append("\n").append("group[4]\n"); @@ -614,5 +561,6 @@ public class Distribution { sb.append("disk_distribution ").append(diskDistribution.toString()).append("\n"); return sb.toString(); } - } + + diff --git a/vdslib/src/main/java/com/yahoo/vdslib/distribution/Group.java b/vdslib/src/main/java/com/yahoo/vdslib/distribution/Group.java index 458ab6e291c..680021893f7 100644 --- a/vdslib/src/main/java/com/yahoo/vdslib/distribution/Group.java +++ b/vdslib/src/main/java/com/yahoo/vdslib/distribution/Group.java @@ -196,7 +196,7 @@ public class Group implements Comparable<Group> { /** * The distribution class keeps precalculated arrays for distributions for all legal redundancies. The class is - * immutable, such that it can be returned safely out from the group object. (Actually, it's not immutable.) + * immutable, such that it can be returned safely out from the group object. */ public static class Distribution { diff --git a/vdslib/src/test/java/com/yahoo/vdslib/distribution/CrossPlatformTestFactory.java b/vdslib/src/test/java/com/yahoo/vdslib/distribution/CrossPlatformTestFactory.java index 7dadd9560b5..94f7d7a8c94 100644 --- a/vdslib/src/test/java/com/yahoo/vdslib/distribution/CrossPlatformTestFactory.java +++ b/vdslib/src/test/java/com/yahoo/vdslib/distribution/CrossPlatformTestFactory.java @@ -1,10 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vdslib.distribution; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; +import java.io.*; /** * Helper class to implement unit tests that should produce the same result in different implementations. diff --git a/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java b/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java index 0d34cd70953..8c877704169 100644 --- a/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java +++ b/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java @@ -418,5 +418,4 @@ public class DistributionTestCase { Distribution distr = new Distribution(new StorDistributionConfig(config)); distr.getIdealDistributorNode(clusterState, new BucketId(16, 0), "uim"); } - } diff --git a/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedErrorMessage.java b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedErrorMessage.java new file mode 100644 index 00000000000..1d7e8535909 --- /dev/null +++ b/vespaclient-container-plugin/src/main/java/com/yahoo/vespa/http/server/FeedErrorMessage.java @@ -0,0 +1,43 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.http.server; + +import com.yahoo.document.DocumentId; +import com.yahoo.messagebus.Message; +import com.yahoo.text.Utf8String; + +import java.util.Arrays; + +public class FeedErrorMessage extends Message { + + private long sequenceId; + + public FeedErrorMessage(String operationId) { + try { + DocumentId id = new DocumentId(operationId); + sequenceId = Arrays.hashCode(id.getGlobalId()); + } catch (Exception e) { + sequenceId = 0; + } + } + + @Override + public Utf8String getProtocol() { + return new Utf8String("vespa-feed-handler-internal-bogus-protocol"); + } + + @Override + public int getType() { + return 1234; + } + + @Override + public boolean hasSequenceId() { + return true; + } + + @Override + public long getSequenceId() { + return sequenceId; + } + +} |