Store parsed mapping settings in IndexSettings (#57492)
There are several mapping settings that are currently re-parsed every time they are read. This can be quite frequent, for example within every document ingestion. This commit moves the parsed versions of these mapping settings to be stored in IndexSettings, just as other index settings are already. closes #57395
This commit is contained in:
parent
db5bf92acf
commit
7aad4f6470
|
@ -42,6 +42,12 @@ import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
import static org.elasticsearch.index.mapper.MapperService.INDEX_MAPPING_DEPTH_LIMIT_SETTING;
|
||||||
|
import static org.elasticsearch.index.mapper.MapperService.INDEX_MAPPING_FIELD_NAME_LENGTH_LIMIT_SETTING;
|
||||||
|
import static org.elasticsearch.index.mapper.MapperService.INDEX_MAPPING_NESTED_DOCS_LIMIT_SETTING;
|
||||||
|
import static org.elasticsearch.index.mapper.MapperService.INDEX_MAPPING_NESTED_FIELDS_LIMIT_SETTING;
|
||||||
|
import static org.elasticsearch.index.mapper.MapperService.INDEX_MAPPING_TOTAL_FIELDS_LIMIT_SETTING;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class encapsulates all index level settings and handles settings updates.
|
* This class encapsulates all index level settings and handles settings updates.
|
||||||
* It's created per index and available to all index level classes and allows them to retrieve
|
* It's created per index and available to all index level classes and allows them to retrieve
|
||||||
|
@ -402,6 +408,11 @@ public final class IndexSettings {
|
||||||
private volatile String defaultPipeline;
|
private volatile String defaultPipeline;
|
||||||
private volatile String requiredPipeline;
|
private volatile String requiredPipeline;
|
||||||
private volatile boolean searchThrottled;
|
private volatile boolean searchThrottled;
|
||||||
|
private volatile long mappingNestedFieldsLimit;
|
||||||
|
private volatile long mappingNestedDocsLimit;
|
||||||
|
private volatile long mappingTotalFieldsLimit;
|
||||||
|
private volatile long mappingDepthLimit;
|
||||||
|
private volatile long mappingFieldNameLengthLimit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The maximum number of refresh listeners allows on this shard.
|
* The maximum number of refresh listeners allows on this shard.
|
||||||
|
@ -523,6 +534,11 @@ public final class IndexSettings {
|
||||||
defaultPipeline = scopedSettings.get(DEFAULT_PIPELINE);
|
defaultPipeline = scopedSettings.get(DEFAULT_PIPELINE);
|
||||||
setTranslogRetentionAge(scopedSettings.get(INDEX_TRANSLOG_RETENTION_AGE_SETTING));
|
setTranslogRetentionAge(scopedSettings.get(INDEX_TRANSLOG_RETENTION_AGE_SETTING));
|
||||||
setTranslogRetentionSize(scopedSettings.get(INDEX_TRANSLOG_RETENTION_SIZE_SETTING));
|
setTranslogRetentionSize(scopedSettings.get(INDEX_TRANSLOG_RETENTION_SIZE_SETTING));
|
||||||
|
mappingNestedFieldsLimit = scopedSettings.get(INDEX_MAPPING_NESTED_FIELDS_LIMIT_SETTING);
|
||||||
|
mappingNestedDocsLimit = scopedSettings.get(INDEX_MAPPING_NESTED_DOCS_LIMIT_SETTING);
|
||||||
|
mappingTotalFieldsLimit = scopedSettings.get(INDEX_MAPPING_TOTAL_FIELDS_LIMIT_SETTING);
|
||||||
|
mappingDepthLimit = scopedSettings.get(INDEX_MAPPING_DEPTH_LIMIT_SETTING);
|
||||||
|
mappingFieldNameLengthLimit = scopedSettings.get(INDEX_MAPPING_FIELD_NAME_LENGTH_LIMIT_SETTING);
|
||||||
|
|
||||||
scopedSettings.addSettingsUpdateConsumer(MergePolicyConfig.INDEX_COMPOUND_FORMAT_SETTING, mergePolicyConfig::setNoCFSRatio);
|
scopedSettings.addSettingsUpdateConsumer(MergePolicyConfig.INDEX_COMPOUND_FORMAT_SETTING, mergePolicyConfig::setNoCFSRatio);
|
||||||
scopedSettings.addSettingsUpdateConsumer(MergePolicyConfig.INDEX_MERGE_POLICY_DELETES_PCT_ALLOWED_SETTING,
|
scopedSettings.addSettingsUpdateConsumer(MergePolicyConfig.INDEX_MERGE_POLICY_DELETES_PCT_ALLOWED_SETTING,
|
||||||
|
@ -576,6 +592,11 @@ public final class IndexSettings {
|
||||||
scopedSettings.addSettingsUpdateConsumer(INDEX_SOFT_DELETES_RETENTION_OPERATIONS_SETTING, this::setSoftDeleteRetentionOperations);
|
scopedSettings.addSettingsUpdateConsumer(INDEX_SOFT_DELETES_RETENTION_OPERATIONS_SETTING, this::setSoftDeleteRetentionOperations);
|
||||||
scopedSettings.addSettingsUpdateConsumer(INDEX_SEARCH_THROTTLED, this::setSearchThrottled);
|
scopedSettings.addSettingsUpdateConsumer(INDEX_SEARCH_THROTTLED, this::setSearchThrottled);
|
||||||
scopedSettings.addSettingsUpdateConsumer(INDEX_SOFT_DELETES_RETENTION_LEASE_PERIOD_SETTING, this::setRetentionLeaseMillis);
|
scopedSettings.addSettingsUpdateConsumer(INDEX_SOFT_DELETES_RETENTION_LEASE_PERIOD_SETTING, this::setRetentionLeaseMillis);
|
||||||
|
scopedSettings.addSettingsUpdateConsumer(INDEX_MAPPING_NESTED_FIELDS_LIMIT_SETTING, this::setMappingNestedFieldsLimit);
|
||||||
|
scopedSettings.addSettingsUpdateConsumer(INDEX_MAPPING_NESTED_DOCS_LIMIT_SETTING, this::setMappingNestedDocsLimit);
|
||||||
|
scopedSettings.addSettingsUpdateConsumer(INDEX_MAPPING_TOTAL_FIELDS_LIMIT_SETTING, this::setMappingTotalFieldsLimit);
|
||||||
|
scopedSettings.addSettingsUpdateConsumer(INDEX_MAPPING_DEPTH_LIMIT_SETTING, this::setMappingDepthLimit);
|
||||||
|
scopedSettings.addSettingsUpdateConsumer(INDEX_MAPPING_FIELD_NAME_LENGTH_LIMIT_SETTING, this::setMappingFieldNameLengthLimit);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setSearchIdleAfter(TimeValue searchIdleAfter) { this.searchIdleAfter = searchIdleAfter; }
|
private void setSearchIdleAfter(TimeValue searchIdleAfter) { this.searchIdleAfter = searchIdleAfter; }
|
||||||
|
@ -1065,4 +1086,44 @@ public final class IndexSettings {
|
||||||
private void setSearchThrottled(boolean searchThrottled) {
|
private void setSearchThrottled(boolean searchThrottled) {
|
||||||
this.searchThrottled = searchThrottled;
|
this.searchThrottled = searchThrottled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getMappingNestedFieldsLimit() {
|
||||||
|
return mappingNestedFieldsLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMappingNestedFieldsLimit(long value) {
|
||||||
|
this.mappingNestedFieldsLimit = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getMappingNestedDocsLimit() {
|
||||||
|
return mappingNestedDocsLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMappingNestedDocsLimit(long value) {
|
||||||
|
this.mappingNestedDocsLimit = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getMappingTotalFieldsLimit() {
|
||||||
|
return mappingTotalFieldsLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMappingTotalFieldsLimit(long value) {
|
||||||
|
this.mappingTotalFieldsLimit = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getMappingDepthLimit() {
|
||||||
|
return mappingDepthLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMappingDepthLimit(long value) {
|
||||||
|
this.mappingDepthLimit = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getMappingFieldNameLengthLimit() {
|
||||||
|
return mappingFieldNameLengthLimit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setMappingFieldNameLengthLimit(long value) {
|
||||||
|
this.mappingFieldNameLengthLimit = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -574,7 +574,7 @@ public class MapperService extends AbstractIndexComponent implements Closeable {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkNestedFieldsLimit(Map<String, ObjectMapper> fullPathObjectMappers) {
|
private void checkNestedFieldsLimit(Map<String, ObjectMapper> fullPathObjectMappers) {
|
||||||
long allowedNestedFields = indexSettings.getValue(INDEX_MAPPING_NESTED_FIELDS_LIMIT_SETTING);
|
long allowedNestedFields = indexSettings.getMappingNestedFieldsLimit();
|
||||||
long actualNestedFields = 0;
|
long actualNestedFields = 0;
|
||||||
for (ObjectMapper objectMapper : fullPathObjectMappers.values()) {
|
for (ObjectMapper objectMapper : fullPathObjectMappers.values()) {
|
||||||
if (objectMapper.nested().isNested()) {
|
if (objectMapper.nested().isNested()) {
|
||||||
|
@ -588,7 +588,7 @@ public class MapperService extends AbstractIndexComponent implements Closeable {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkTotalFieldsLimit(long totalMappers) {
|
private void checkTotalFieldsLimit(long totalMappers) {
|
||||||
long allowedTotalFields = indexSettings.getValue(INDEX_MAPPING_TOTAL_FIELDS_LIMIT_SETTING);
|
long allowedTotalFields = indexSettings.getMappingTotalFieldsLimit();
|
||||||
if (allowedTotalFields < totalMappers) {
|
if (allowedTotalFields < totalMappers) {
|
||||||
throw new IllegalArgumentException("Limit of total fields [" + allowedTotalFields + "] in index [" + index().getName()
|
throw new IllegalArgumentException("Limit of total fields [" + allowedTotalFields + "] in index [" + index().getName()
|
||||||
+ "] has been exceeded");
|
+ "] has been exceeded");
|
||||||
|
@ -596,7 +596,7 @@ public class MapperService extends AbstractIndexComponent implements Closeable {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkDepthLimit(Collection<String> objectPaths) {
|
private void checkDepthLimit(Collection<String> objectPaths) {
|
||||||
final long maxDepth = indexSettings.getValue(INDEX_MAPPING_DEPTH_LIMIT_SETTING);
|
final long maxDepth = indexSettings.getMappingDepthLimit();
|
||||||
for (String objectPath : objectPaths) {
|
for (String objectPath : objectPaths) {
|
||||||
checkDepthLimit(objectPath, maxDepth);
|
checkDepthLimit(objectPath, maxDepth);
|
||||||
}
|
}
|
||||||
|
@ -619,7 +619,7 @@ public class MapperService extends AbstractIndexComponent implements Closeable {
|
||||||
private void checkFieldNameSoftLimit(Collection<ObjectMapper> objectMappers,
|
private void checkFieldNameSoftLimit(Collection<ObjectMapper> objectMappers,
|
||||||
Collection<FieldMapper> fieldMappers,
|
Collection<FieldMapper> fieldMappers,
|
||||||
Collection<FieldAliasMapper> fieldAliasMappers) {
|
Collection<FieldAliasMapper> fieldAliasMappers) {
|
||||||
final long maxFieldNameLength = indexSettings.getValue(INDEX_MAPPING_FIELD_NAME_LENGTH_LIMIT_SETTING);
|
final long maxFieldNameLength = indexSettings.getMappingFieldNameLengthLimit();
|
||||||
|
|
||||||
Stream.of(objectMappers.stream(), fieldMappers.stream(), fieldAliasMappers.stream())
|
Stream.of(objectMappers.stream(), fieldMappers.stream(), fieldAliasMappers.stream())
|
||||||
.reduce(Stream::concat)
|
.reduce(Stream::concat)
|
||||||
|
|
|
@ -333,7 +333,7 @@ public abstract class ParseContext implements Iterable<ParseContext.Document>{
|
||||||
this.version = null;
|
this.version = null;
|
||||||
this.sourceToParse = source;
|
this.sourceToParse = source;
|
||||||
this.dynamicMappers = new ArrayList<>();
|
this.dynamicMappers = new ArrayList<>();
|
||||||
this.maxAllowedNumNestedDocs = indexSettings.getValue(MapperService.INDEX_MAPPING_NESTED_DOCS_LIMIT_SETTING);
|
this.maxAllowedNumNestedDocs = indexSettings.getMappingNestedDocsLimit();
|
||||||
this.numNestedDocs = 0L;
|
this.numNestedDocs = 0L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue