aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'config-model/src/main')
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java2
-rw-r--r--config-model/src/main/java/com/yahoo/schema/processing/AttributesImplicitWord.java6
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java18
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java4
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/Content.java48
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java13
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java25
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/routing/DocumentProtocol.java7
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java60
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/IndexingDocproc.java68
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/NodeResourcesTuning.java1
12 files changed, 153 insertions, 104 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java b/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java
index 4b993f8e244..ae9d696a9a3 100644
--- a/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java
+++ b/config-model/src/main/java/com/yahoo/config/model/provision/InMemoryProvisioner.java
@@ -160,7 +160,7 @@ public class InMemoryProvisioner implements HostProvisioner {
public List<HostSpec> prepare(ClusterSpec cluster, Capacity requested, ProvisionLogger logger) {
provisioned.add(cluster.id(), requested);
clusters.add(cluster);
- if (environment == Environment.dev) {
+ if (environment == Environment.dev && ! requested.isRequired()) {
requested = requested.withLimits(requested.minResources().withNodes(1),
requested.maxResources().withNodes(1));
}
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/AttributesImplicitWord.java b/config-model/src/main/java/com/yahoo/schema/processing/AttributesImplicitWord.java
index 415f23f2786..f0b673920da 100644
--- a/config-model/src/main/java/com/yahoo/schema/processing/AttributesImplicitWord.java
+++ b/config-model/src/main/java/com/yahoo/schema/processing/AttributesImplicitWord.java
@@ -44,10 +44,8 @@ public class AttributesImplicitWord extends Processor {
private boolean fieldImplicitlyWordMatch(ImmutableSDField field) {
// numeric types should not trigger exact-match query parsing
- DataType dt = field.getDataType().getPrimitiveType();
- if (dt != null && dt instanceof NumericDataType) {
- return false;
- }
+ if (field.getDataType().getPrimitiveType() instanceof NumericDataType) return false;
+
return (! field.hasIndex()
&& !field.getAttributes().isEmpty()
&& field.getIndices().isEmpty()
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java
index 362bc7b0964..a60d4d45317 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java
@@ -131,6 +131,11 @@ public class VespaMetricSet {
addMetric(metrics, ConfigServerMetrics.ZK_CONNECTIONS.last());
addMetric(metrics, ConfigServerMetrics.ZK_OUTSTANDING_REQUESTS.last());
+ addMetric(metrics, ConfigServerMetrics.CLUSTER_COST.last());
+ addMetric(metrics, ConfigServerMetrics.CLUSTER_LOAD_IDEAL_CPU.last());
+ addMetric(metrics, ConfigServerMetrics.CLUSTER_LOAD_IDEAL_MEMORY.last());
+ addMetric(metrics, ConfigServerMetrics.CLUSTER_LOAD_IDEAL_DISK.last());
+
return metrics;
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java
index 4ea74147aaf..475a4174f9a 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/QuotaValidator.java
@@ -53,8 +53,8 @@ public class QuotaValidator extends Validator {
}
throwIfBudgetNegative(actualSpend, budget, systemName);
- throwIfBudgetExceeded(actualSpend, budget, systemName);
- throwIfBudgetExceeded(maxSpend, budget, systemName);
+ throwIfBudgetExceeded(actualSpend, budget, systemName, true);
+ throwIfBudgetExceeded(maxSpend, budget, systemName, false);
}
private Set<ClusterSpec.Id> adminClusterIds(VespaModel model) {
@@ -86,18 +86,22 @@ public class QuotaValidator extends Validator {
private static void throwIfBudgetNegative(double spend, BigDecimal budget, SystemName systemName) {
if (budget.doubleValue() < 0) {
- throw new IllegalArgumentException(quotaMessage("Please free up some capacity.", systemName, spend, budget));
+ throw new IllegalArgumentException(quotaMessage("Please free up some capacity.", systemName, spend, budget, true));
}
}
- private static void throwIfBudgetExceeded(double spend, BigDecimal budget, SystemName systemName) {
+ private static void throwIfBudgetExceeded(double spend, BigDecimal budget, SystemName systemName, boolean actual) {
if (budget.doubleValue() < spend) {
- throw new IllegalArgumentException(quotaMessage("Contact support to upgrade your plan.", systemName, spend, budget));
+ throw new IllegalArgumentException(quotaMessage("Contact support to upgrade your plan.", systemName, spend, budget, actual));
}
}
- private static String quotaMessage(String message, SystemName system, double spend, BigDecimal budget) {
- String quotaDescription = String.format(Locale.ENGLISH, "The max resources specified cost $%.2f but your quota is $%.2f", spend, budget);
+ private static String quotaMessage(String message, SystemName system, double spend, BigDecimal budget, boolean actual) {
+ String quotaDescription = String.format(Locale.ENGLISH,
+ "The %s cost $%.2f but your quota is $%.2f",
+ actual ? "resources used" : "max resources specified",
+ spend,
+ budget);
return (system == SystemName.Public ? "" : system.value() + ": ") + quotaDescription + ": " + message;
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java
index 3cb0731c43a..e1d222e0546 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java
@@ -932,9 +932,11 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
int nodeCount = deployState.zone().environment().isProduction() ? 2 : 1;
deployState.getDeployLogger().logApplicationPackage(Level.INFO, "Using " + nodeCount + " nodes in " + cluster);
var nodesSpec = NodesSpecification.dedicated(nodeCount, context);
+ ClusterSpec.Id clusterId = ClusterSpec.Id.from(cluster.getName());
var hosts = nodesSpec.provision(hostSystem,
ClusterSpec.Type.container,
- ClusterSpec.Id.from(cluster.getName()),
+ clusterId,
+ zoneEndpoint(context, clusterId),
deployState.getDeployLogger(),
false,
context.clusterInfo().build());
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java b/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java
index e044b97546c..43f045940c9 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java
@@ -28,6 +28,7 @@ import com.yahoo.vespa.model.container.docproc.DocprocChain;
import com.yahoo.vespa.model.container.docproc.DocprocChains;
import com.yahoo.vespa.model.content.cluster.ContentCluster;
import com.yahoo.vespa.model.search.IndexedSearchCluster;
+import com.yahoo.vespa.model.search.IndexingDocproc;
import com.yahoo.vespa.model.search.IndexingDocprocChain;
import com.yahoo.vespa.model.search.SearchCluster;
import com.yahoo.vespa.model.search.SearchNode;
@@ -213,13 +214,17 @@ public class Content extends ConfigModel {
/** Select/creates and initializes the indexing cluster coupled to this */
private void buildIndexingClusters(Content content, ConfigModelContext modelContext,
ApplicationConfigProducerRoot root) {
- if ( ! content.getCluster().getSearch().hasIndexedCluster()) return;
-
- IndexedSearchCluster indexedSearchCluster = content.getCluster().getSearch().getIndexed();
- if (indexedSearchCluster.hasExplicitIndexingCluster()) {
- setExistingIndexingCluster(indexedSearchCluster, content.containers);
+ var search = content.getCluster().getSearch();
+ if (!search.getIndexingDocproc().isPresent()) {
+ return;
+ }
+ var indexingDocproc = search.getIndexingDocproc().get();
+ if (indexingDocproc.hasExplicitCluster()) {
+ setExistingIndexingCluster(content, indexingDocproc, content.containers);
} else {
- setContainerAsIndexingCluster(indexedSearchCluster, content, modelContext, root);
+ if (search.hasIndexedCluster()) {
+ setContainerAsIndexingCluster(search.getIndexed(), content, modelContext, root);
+ }
}
}
@@ -237,18 +242,19 @@ public class Content extends ConfigModel {
targetCluster = content.containers.iterator().next().getCluster();
addDocproc(targetCluster);
- indexedSearchCluster.setIndexingClusterName(targetCluster.getName());
- addIndexingChainsTo(targetCluster, indexedSearchCluster);
+ var indexingDocproc = indexedSearchCluster.getIndexingDocproc();
+ indexingDocproc.setClusterName(targetCluster.getName());
+ addIndexingChainsTo(targetCluster, content, indexingDocproc);
}
}
- private void setExistingIndexingCluster(IndexedSearchCluster cluster, Collection<ContainerModel> containers) {
- String indexingClusterName = cluster.getIndexingClusterName();
+ private void setExistingIndexingCluster(Content content, IndexingDocproc indexingDocproc, Collection<ContainerModel> containers) {
+ String indexingClusterName = indexingDocproc.getClusterName(content.getCluster().getName());
ContainerModel containerModel = findByName(indexingClusterName, containers);
if (containerModel == null)
- throw new IllegalArgumentException("Content cluster '" + cluster.getClusterName() + "' refers to docproc " +
+ throw new IllegalArgumentException("Content cluster '" + content.getCluster().getName() + "' refers to docproc " +
"cluster '" + indexingClusterName + "', but this cluster does not exist.");
- addIndexingChainsTo(containerModel.getCluster(), cluster);
+ addIndexingChainsTo(containerModel.getCluster(), content, indexingDocproc);
}
private ContainerModel findByName(String name, Collection<ContainerModel> containers) {
@@ -258,19 +264,19 @@ public class Content extends ConfigModel {
return null;
}
- private void addIndexingChainsTo(ContainerCluster<?> indexer, IndexedSearchCluster cluster) {
+ private void addIndexingChainsTo(ContainerCluster<?> indexer, Content content, IndexingDocproc indexingDocproc) {
addIndexingChain(indexer);
DocprocChain indexingChain;
ComponentRegistry<DocprocChain> allChains = indexer.getDocprocChains().allChains();
- if (cluster.hasExplicitIndexingChain()) {
- indexingChain = allChains.getComponent(cluster.getIndexingChainName());
+ if (indexingDocproc.hasExplicitChain() && !indexingDocproc.getChainName().equals(IndexingDocprocChain.NAME)) {
+ indexingChain = allChains.getComponent(indexingDocproc.getChainName());
if (indexingChain == null) {
- throw new IllegalArgumentException(cluster + " refers to docproc " +
- "chain '" + cluster.getIndexingChainName() +
+ throw new IllegalArgumentException(content.getCluster() + " refers to docproc " +
+ "chain '" + indexingDocproc.getChainName() +
"' for indexing, but this chain does not exist");
}
else if (indexingChain.getId().getName().equals("default")) {
- throw new IllegalArgumentException(cluster + " specifies the chain " +
+ throw new IllegalArgumentException(content.getCluster() + " specifies the chain " +
"'default' as indexing chain. As the 'default' chain is run by default, " +
"using it as the indexing chain will run it twice. " +
"Use a different name for the indexing chain.");
@@ -282,7 +288,7 @@ public class Content extends ConfigModel {
indexingChain = allChains.getComponent(IndexingDocprocChain.NAME);
}
- cluster.setIndexingChain(indexingChain);
+ indexingDocproc.setChain(indexingChain);
}
private TreeConfigProducer<AnyConfigProducer> getDocProc(ApplicationConfigProducerRoot root) {
@@ -301,7 +307,7 @@ public class Content extends ConfigModel {
Content content,
ConfigModelContext modelContext,
ApplicationConfigProducerRoot root) {
- String indexerName = cluster.getIndexingClusterName();
+ String indexerName = cluster.getIndexingDocproc().getClusterName(content.getCluster().getName());
TreeConfigProducer<AnyConfigProducer> parent = getDocProc(root);
ApplicationContainerCluster indexingCluster = new ApplicationContainerCluster(parent, "cluster." + indexerName, indexerName, modelContext.getDeployState());
ContainerModel indexingClusterModel = new ContainerModel(modelContext.withParent(parent).withId(indexingCluster.getSubId()));
@@ -334,7 +340,7 @@ public class Content extends ConfigModel {
indexingCluster.addContainers(nodes);
addIndexingChain(indexingCluster);
- cluster.setIndexingChain(indexingCluster.getDocprocChains().allChains().getComponent(IndexingDocprocChain.NAME));
+ cluster.getIndexingDocproc().setChain(indexingCluster.getDocprocChains().allChains().getComponent(IndexingDocprocChain.NAME));
}
private ContainerCluster<?> getContainerWithDocproc(Collection<ContainerModel> containers) {
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java
index a0240d28a3c..ec7acaf819f 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/ContentSearchCluster.java
@@ -16,6 +16,7 @@ import com.yahoo.vespa.model.builder.xml.dom.ModelElement;
import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder;
import com.yahoo.vespa.model.content.cluster.ContentCluster;
import com.yahoo.vespa.model.search.IndexedSearchCluster;
+import com.yahoo.vespa.model.search.IndexingDocproc;
import com.yahoo.vespa.model.search.NodeSpec;
import com.yahoo.vespa.model.search.SchemaDefinitionXMLHandler;
import com.yahoo.vespa.model.search.SearchCluster;
@@ -57,6 +58,7 @@ public class ContentSearchCluster extends TreeConfigProducer<AnyConfigProducer>
/** The single, indexed search cluster this sets up (supporting multiple document types), or null if none */
private IndexedSearchCluster indexedCluster;
+ private Optional<IndexingDocproc> indexingDocproc;
private Redundancy redundancy;
private final String clusterName;
@@ -206,6 +208,7 @@ public class ContentSearchCluster extends TreeConfigProducer<AnyConfigProducer>
double fractionOfMemoryReserved)
{
super(parent, "search");
+ this.indexingDocproc = Optional.empty();
this.clusterName = clusterName;
this.documentDefinitions = documentDefinitions;
this.globallyDistributedDocuments = globallyDistributedDocuments;
@@ -259,6 +262,10 @@ public class ContentSearchCluster extends TreeConfigProducer<AnyConfigProducer>
throw new IllegalArgumentException("Duplicate indexed cluster '" + indexedCluster.getClusterName() + "'");
}
indexedCluster = (IndexedSearchCluster)sc;
+ if (indexingDocproc.isPresent()) {
+ throw new IllegalArgumentException("Indexing docproc has previously been setup for streaming search");
+ }
+ indexingDocproc = Optional.of(indexedCluster.getIndexingDocproc());
}
clusters.put(sc.getClusterName(), sc);
}
@@ -458,6 +465,12 @@ public class ContentSearchCluster extends TreeConfigProducer<AnyConfigProducer>
public Map<String, SearchCluster> getClusters() { return clusters; }
public IndexedSearchCluster getIndexed() { return indexedCluster; }
public boolean hasIndexedCluster() { return indexedCluster != null; }
+ public Optional<IndexingDocproc> getIndexingDocproc() { return indexingDocproc; }
+ public void setupStreamingSearchIndexingDocProc() {
+ if (indexingDocproc.isEmpty()) {
+ indexingDocproc = Optional.of(new IndexingDocproc());
+ }
+ }
public String getClusterName() { return clusterName; }
@Override
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 66a99e1993c..dfdfa9303a7 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
@@ -203,19 +203,24 @@ public class ContentCluster extends TreeConfigProducer<AnyConfigProducer> implem
if (docprocCluster != null) {
docprocCluster = docprocCluster.trim();
}
- if (c.getSearch().hasIndexedCluster()) {
- if (docprocCluster != null && !docprocCluster.isEmpty()) {
- c.getSearch().getIndexed().setIndexingClusterName(docprocCluster);
- }
- }
-
String docprocChain = e.stringAttribute("chain");
if (docprocChain != null) {
docprocChain = docprocChain.trim();
}
- if (c.getSearch().hasIndexedCluster()) {
- if (docprocChain != null && !docprocChain.isEmpty()) {
- c.getSearch().getIndexed().setIndexingChainName(docprocChain);
+ if (docprocCluster != null && !docprocCluster.isEmpty()) {
+ if (!c.getSearch().hasIndexedCluster() && !c.getSearch().getIndexingDocproc().isPresent() &&
+ docprocChain != null && !docprocChain.isEmpty()) {
+ c.getSearch().setupStreamingSearchIndexingDocProc();
+ }
+ var indexingDocproc = c.getSearch().getIndexingDocproc();
+ if (indexingDocproc.isPresent()) {
+ indexingDocproc.get().setClusterName(docprocCluster);
+ }
+ }
+ if (docprocChain != null && !docprocChain.isEmpty()) {
+ var indexingDocproc = c.getSearch().getIndexingDocproc();
+ if (indexingDocproc.isPresent()) {
+ indexingDocproc.get().setChainName(docprocChain);
}
}
}
@@ -451,7 +456,7 @@ public class ContentCluster extends TreeConfigProducer<AnyConfigProducer> implem
@Override
public void getConfig(MessagetyperouteselectorpolicyConfig.Builder builder) {
- if ( ! getSearch().hasIndexedCluster()) return;
+ if ( ! getSearch().getIndexingDocproc().isPresent()) return;
DocumentProtocol.getConfig(builder, getConfigId());
}
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 ad0312705ca..6623efb599d 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
@@ -110,7 +110,7 @@ public final class DocumentProtocol implements Protocol,
for (ContentCluster cluster : Content.getContentClusters(repo)) {
DocumentProtocolPoliciesConfig.Cluster.Builder clusterBuilder = new DocumentProtocolPoliciesConfig.Cluster.Builder();
addSelector(cluster.getConfigId(), cluster.getRoutingSelector(), clusterBuilder);
- if (cluster.getSearch().hasIndexedCluster())
+ if (cluster.getSearch().getIndexingDocproc().isPresent())
addRoutes(getDirectRouteName(cluster.getConfigId()), getIndexedRouteName(cluster.getConfigId()), clusterBuilder);
else
clusterBuilder.defaultRoute(cluster.getConfigId());
@@ -227,10 +227,11 @@ public final class DocumentProtocol implements Protocol,
for (ContentCluster cluster : content) {
RouteSpec spec = new RouteSpec(cluster.getConfigId());
- if (cluster.getSearch().hasIndexedCluster()) {
+ if (cluster.getSearch().getIndexingDocproc().isPresent()) {
+ var indexingDocproc = cluster.getSearch().getIndexingDocproc().get();
table.addRoute(spec.addHop("[MessageType:" + cluster.getConfigId() + "]"));
table.addRoute(new RouteSpec(getIndexedRouteName(cluster.getConfigId()))
- .addHop(cluster.getSearch().getIndexed().getIndexingServiceName())
+ .addHop(indexingDocproc.getServiceName())
.addHop("[Content:cluster=" + cluster.getName() + "]"));
table.addRoute(new RouteSpec(getDirectRouteName(cluster.getConfigId()))
.addHop("[Content:cluster=" + cluster.getName() + "]"));
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java
index 670460a9f9f..080a2ca43dc 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexedSearchCluster.java
@@ -43,11 +43,7 @@ public class IndexedSearchCluster extends SearchCluster
DispatchNodesConfig.Producer,
ConfigInstance.Producer {
- private String indexingClusterName = null; // The name of the docproc cluster to run indexing, by config.
- private String indexingChainName = null;
-
- private DocprocChain indexingChain; // The actual docproc chain indexing for this.
-
+ private IndexingDocproc indexingDocproc;
private Tuning tuning;
private SearchCoverage searchCoverage;
@@ -77,6 +73,7 @@ public class IndexedSearchCluster extends SearchCluster
public IndexedSearchCluster(TreeConfigProducer<AnyConfigProducer> parent, String clusterName, int index, ModelContext.FeatureFlags featureFlags) {
super(parent, clusterName, index);
+ indexingDocproc = new IndexingDocproc();
documentDbsConfigProducer = new MultipleDocumentDatabasesConfigProducer(this, documentDbs);
rootDispatch = new DispatchGroup(this);
defaultDispatchPolicy = DispatchTuning.Builder.toDispatchPolicy(featureFlags.queryDispatchPolicy());
@@ -87,58 +84,7 @@ public class IndexedSearchCluster extends SearchCluster
@Override
protected IndexingMode getIndexingMode() { return IndexingMode.REALTIME; }
- public final boolean hasExplicitIndexingCluster() {
- return indexingClusterName != null;
- }
-
- public final boolean hasExplicitIndexingChain() {
- return indexingChainName != null;
- }
-
- /**
- * Returns the name of the docproc cluster running indexing for this search cluster. This is derived from the
- * services file on initialization, this can NOT be used at runtime to determine indexing chain. When initialization
- * is done, the {@link #getIndexingServiceName()} method holds the actual indexing docproc chain object.
- *
- * @return the name of the docproc cluster associated with this
- */
- public String getIndexingClusterName() {
- return hasExplicitIndexingCluster() ? indexingClusterName : getClusterName() + ".indexing";
- }
-
- public String getIndexingChainName() {
- return indexingChainName;
- }
-
- public void setIndexingChainName(String indexingChainName) {
- this.indexingChainName = indexingChainName;
- }
-
- /**
- * Sets the name of the docproc cluster running indexing for this search cluster. This is for initial configuration,
- * and will not reflect the actual indexing chain. See {@link #getIndexingClusterName} for more detail.
- *
- * @param name the name of the docproc cluster associated with this
- */
- public void setIndexingClusterName(String name) {
- indexingClusterName = name;
- }
-
- public String getIndexingServiceName() {
- return indexingChain.getServiceName();
- }
-
- /**
- * Sets the docproc chain that will be running indexing for this search cluster. This is set by the
- * {@link com.yahoo.vespa.model.content.Content} model during build.
- *
- * @param chain the chain that is to run indexing for this cluster
- * @return this, to allow chaining
- */
- public SearchCluster setIndexingChain(DocprocChain chain) {
- indexingChain = chain;
- return this;
- }
+ public IndexingDocproc getIndexingDocproc() { return indexingDocproc; }
public DispatchGroup getRootDispatch() { return rootDispatch; }
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/IndexingDocproc.java b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexingDocproc.java
new file mode 100644
index 00000000000..46f3e6f459d
--- /dev/null
+++ b/config-model/src/main/java/com/yahoo/vespa/model/search/IndexingDocproc.java
@@ -0,0 +1,68 @@
+package com.yahoo.vespa.model.search;
+
+import com.yahoo.vespa.model.container.docproc.DocprocChain;
+
+/**
+ * Utility class to track configuration for which indexing docproc to use by a search cluster.
+ */
+public class IndexingDocproc {
+ private String clusterName; // The name of the docproc cluster to run indexing, by config.
+ private String chainName;
+
+ private DocprocChain chain; // The actual docproc chain indexing for this.
+
+ public boolean hasExplicitCluster() {
+ return clusterName != null;
+ }
+
+ public boolean hasExplicitChain() {
+ return chainName != null;
+ }
+
+ /**
+ * Returns the name of the docproc cluster running indexing for this search cluster. This is derived from the
+ * services file on initialization, this can NOT be used at runtime to determine indexing chain. When initialization
+ * is done, the {@link #getServiceName()} method holds the actual indexing docproc chain object.
+ *
+ * @return the name of the docproc cluster associated with this
+ */
+ public String getClusterName(String searchClusterName) {
+ return hasExplicitCluster() ? clusterName : searchClusterName + ".indexing";
+ }
+
+ public String getChainName() {
+ return chainName;
+ }
+
+ public void setChainName(String name) {
+ chainName = name;
+ }
+
+ /**
+ * Sets the name of the docproc cluster running indexing for this search cluster. This is for initial configuration,
+ * and will not reflect the actual indexing chain. See {@link #getClusterName} for more detail.
+ *
+ * @param name the name of the docproc cluster associated with this
+ */
+ public void setClusterName(String name) {
+ clusterName = name;
+ }
+
+ public String getServiceName() {
+ return chain.getServiceName();
+ }
+
+ /**
+ * Sets the docproc chain that will be running indexing for this search cluster. This is set by the
+ * {@link com.yahoo.vespa.model.content.Content} model during build.
+ *
+ * @param chain the chain that is to run indexing for this cluster
+ */
+ public void setChain(DocprocChain chain) { this.chain = chain; }
+
+ public IndexingDocproc() {
+ clusterName = null;
+ chainName = null;
+ chain = null;
+ }
+}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/NodeResourcesTuning.java b/config-model/src/main/java/com/yahoo/vespa/model/search/NodeResourcesTuning.java
index 5b747b93268..981f6aa0d29 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/search/NodeResourcesTuning.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/search/NodeResourcesTuning.java
@@ -28,6 +28,7 @@ public class NodeResourcesTuning implements ProtonConfig.Producer {
private final double fractionOfMemoryReserved;
// "Reserve" 0.5GB of memory for other processes running on the content node (config-proxy, metrics-proxy).
+ // And 0.2GB for distributor and proton basics.
public static final double reservedMemoryGb = 0.7;
public NodeResourcesTuning(NodeResources resources,