Skip to content

Commit 142be2e

Browse files
committed
Make sure that field aliases count towards the total fields limit. (elastic#32222)
1 parent d65c8d1 commit 142be2e

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

server/src/main/java/org/elasticsearch/index/mapper/MapperService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ private synchronized Map<String, DocumentMapper> internalMerge(@Nullable Documen
460460
// the master node restoring mappings from disk or data nodes
461461
// deserializing cluster state that was sent by the master node,
462462
// this check will be skipped.
463-
checkTotalFieldsLimit(objectMappers.size() + fieldMappers.size());
463+
checkTotalFieldsLimit(objectMappers.size() + fieldMappers.size() + fieldAliasMappers.size());
464464
}
465465

466466
if (oldMapper == null && newMapper.parentFieldMapper().active()) {

server/src/test/java/org/elasticsearch/index/mapper/MapperServiceTests.java

+31
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,37 @@ public void testFieldAliasWithMismatchedNestedScope() throws Throwable {
365365
assertThat(e.getMessage(), containsString("Invalid [path] value [nested.field] for field alias [alias]"));
366366
}
367367

368+
public void testTotalFieldsLimitWithFieldAlias() throws Throwable {
369+
String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type")
370+
.startObject("properties")
371+
.startObject("alias")
372+
.field("type", "alias")
373+
.field("path", "field")
374+
.endObject()
375+
.startObject("field")
376+
.field("type", "text")
377+
.endObject()
378+
.endObject()
379+
.endObject().endObject());
380+
381+
DocumentMapper documentMapper = createIndex("test1").mapperService()
382+
.merge("type", new CompressedXContent(mapping), MergeReason.MAPPING_UPDATE, true);
383+
384+
// Set the total fields limit to the number of non-alias fields, to verify that adding
385+
// a field alias pushes the mapping over the limit.
386+
int numFields = documentMapper.mapping().metadataMappers.length + 2;
387+
int numNonAliasFields = numFields - 1;
388+
389+
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> {
390+
Settings settings = Settings.builder()
391+
.put(MapperService.INDEX_MAPPING_TOTAL_FIELDS_LIMIT_SETTING.getKey(), numNonAliasFields)
392+
.build();
393+
createIndex("test2", settings).mapperService()
394+
.merge("type", new CompressedXContent(mapping), MergeReason.MAPPING_UPDATE, true);
395+
});
396+
assertEquals("Limit of total fields [" + numNonAliasFields + "] in index [test2] has been exceeded", e.getMessage());
397+
}
398+
368399
public void testForbidMultipleTypes() throws IOException {
369400
String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type").endObject().endObject());
370401
MapperService mapperService = createIndex("test").mapperService();

0 commit comments

Comments
 (0)