Skip to content

Commit 09a78ac

Browse files
committed
Merge branch 'master' into byte-size-value-setting-limit-error-message
* master: Add awaits fix for a query analyzer test Check presence of multi-types before validating new mapping (elastic#29316)
2 parents 7b59f95 + a19fd56 commit 09a78ac

File tree

5 files changed

+42
-54
lines changed

5 files changed

+42
-54
lines changed

modules/percolator/src/test/java/org/elasticsearch/percolator/QueryAnalyzerTests.java

+1
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ public void testExtractQueryMetadata_booleanQueryWithMustNot() {
384384
assertThat(terms.get(1).bytes(), equalTo(phraseQuery.getTerms()[1].bytes()));
385385
}
386386

387+
@AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/29363")
387388
public void testExactMatch_booleanQuery() {
388389
BooleanQuery.Builder builder = new BooleanQuery.Builder();
389390
TermQuery termQuery1 = new TermQuery(new Term("_field", "_term1"));

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

+10-9
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,16 @@ private synchronized Map<String, DocumentMapper> internalMerge(@Nullable Documen
385385
results.put(DEFAULT_MAPPING, defaultMapper);
386386
}
387387

388+
if (indexSettings.isSingleType()) {
389+
Set<String> actualTypes = new HashSet<>(mappers.keySet());
390+
documentMappers.forEach(mapper -> actualTypes.add(mapper.type()));
391+
actualTypes.remove(DEFAULT_MAPPING);
392+
if (actualTypes.size() > 1) {
393+
throw new IllegalArgumentException(
394+
"Rejecting mapping update to [" + index().getName() + "] as the final mapping would have more than 1 type: " + actualTypes);
395+
}
396+
}
397+
388398
for (DocumentMapper mapper : documentMappers) {
389399
// check naming
390400
validateTypeName(mapper.type());
@@ -478,15 +488,6 @@ private synchronized Map<String, DocumentMapper> internalMerge(@Nullable Documen
478488
}
479489
}
480490

481-
if (indexSettings.isSingleType()) {
482-
Set<String> actualTypes = new HashSet<>(mappers.keySet());
483-
actualTypes.remove(DEFAULT_MAPPING);
484-
if (actualTypes.size() > 1) {
485-
throw new IllegalArgumentException(
486-
"Rejecting mapping update to [" + index().getName() + "] as the final mapping would have more than 1 type: " + actualTypes);
487-
}
488-
}
489-
490491
// make structures immutable
491492
mappers = Collections.unmodifiableMap(mappers);
492493
results = Collections.unmodifiableMap(results);

server/src/test/java/org/elasticsearch/action/admin/indices/create/CreateIndexIT.java

-19
Original file line numberDiff line numberDiff line change
@@ -264,25 +264,6 @@ public void onFailure(Exception e) {
264264
logger.info("total: {}", expected.getHits().getTotalHits());
265265
}
266266

267-
/**
268-
* Asserts that the root cause of mapping conflicts is readable.
269-
*/
270-
public void testMappingConflictRootCause() throws Exception {
271-
CreateIndexRequestBuilder b = prepareCreate("test");
272-
b.addMapping("type1", jsonBuilder().startObject().startObject("properties")
273-
.startObject("text")
274-
.field("type", "text")
275-
.field("analyzer", "standard")
276-
.field("search_analyzer", "whitespace")
277-
.endObject().endObject().endObject());
278-
b.addMapping("type2", jsonBuilder().humanReadable(true).startObject().startObject("properties")
279-
.startObject("text")
280-
.field("type", "text")
281-
.endObject().endObject().endObject());
282-
IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> b.get());
283-
assertThat(e.getMessage(), containsString("Mapper for [text] conflicts with existing mapping:"));
284-
}
285-
286267
public void testRestartIndexCreationAfterFullClusterRestart() throws Exception {
287268
client().admin().cluster().prepareUpdateSettings().setTransientSettings(Settings.builder().put("cluster.routing.allocation.enable",
288269
"none")).get();

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

+18-2
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ public void testMappingDepthExceedsLimit() throws Throwable {
164164
indexService2.mapperService().merge("type", objectMapping, MergeReason.MAPPING_UPDATE);
165165

166166
IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
167-
() -> indexService1.mapperService().merge("type2", objectMapping, MergeReason.MAPPING_UPDATE));
167+
() -> indexService1.mapperService().merge("type", objectMapping, MergeReason.MAPPING_UPDATE));
168168
assertThat(e.getMessage(), containsString("Limit of mapping depth [1] in index [test1] has been exceeded"));
169169
}
170170

@@ -255,7 +255,6 @@ public void testPartitionedConstraints() {
255255
// partitioned index cannot have parent/child relationships
256256
IllegalArgumentException parentException = expectThrows(IllegalArgumentException.class, () -> {
257257
client().admin().indices().prepareCreate("test-index")
258-
.addMapping("parent", "{\"parent\":{\"_routing\":{\"required\":true}}}", XContentType.JSON)
259258
.addMapping("child", "{\"child\": {\"_routing\":{\"required\":true}, \"_parent\": {\"type\": \"parent\"}}}",
260259
XContentType.JSON)
261260
.setSettings(Settings.builder()
@@ -307,6 +306,23 @@ public void testForbidMultipleTypes() throws IOException {
307306
assertThat(e.getMessage(), Matchers.startsWith("Rejecting mapping update to [test] as the final mapping would have more than 1 type: "));
308307
}
309308

309+
/**
310+
* This test checks that the multi-type validation is done before we do any other kind of validation on the mapping that's added,
311+
* see https://github.com/elastic/elasticsearch/issues/29313
312+
*/
313+
public void testForbidMultipleTypesWithConflictingMappings() throws IOException {
314+
String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type")
315+
.startObject("properties").startObject("field1").field("type", "integer_range").endObject().endObject().endObject().endObject());
316+
MapperService mapperService = createIndex("test").mapperService();
317+
mapperService.merge("type", new CompressedXContent(mapping), MergeReason.MAPPING_UPDATE);
318+
319+
String mapping2 = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type2")
320+
.startObject("properties").startObject("field1").field("type", "integer").endObject().endObject().endObject().endObject());
321+
IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
322+
() -> mapperService.merge("type2", new CompressedXContent(mapping2), MergeReason.MAPPING_UPDATE));
323+
assertThat(e.getMessage(), Matchers.startsWith("Rejecting mapping update to [test] as the final mapping would have more than 1 type: "));
324+
}
325+
310326
public void testDefaultMappingIsRejectedOn7() throws IOException {
311327
String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("_default_").endObject().endObject());
312328
MapperService mapperService = createIndex("test").mapperService();

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

+13-24
Original file line numberDiff line numberDiff line change
@@ -117,34 +117,25 @@ public void testConflictSameType() throws Exception {
117117
}
118118

119119
public void testConflictNewType() throws Exception {
120-
XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("type1")
120+
XContentBuilder mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
121121
.startObject("properties").startObject("foo").field("type", "long").endObject()
122122
.endObject().endObject().endObject();
123-
MapperService mapperService = createIndex("test", Settings.builder().build(), "type1", mapping).mapperService();
123+
MapperService mapperService = createIndex("test", Settings.builder().build(), "type", mapping).mapperService();
124124

125-
XContentBuilder update = XContentFactory.jsonBuilder().startObject().startObject("type2")
125+
XContentBuilder update = XContentFactory.jsonBuilder().startObject().startObject("type")
126126
.startObject("properties").startObject("foo").field("type", "double").endObject()
127127
.endObject().endObject().endObject();
128128

129129
try {
130-
mapperService.merge("type2", new CompressedXContent(Strings.toString(update)), MapperService.MergeReason.MAPPING_UPDATE);
131-
fail();
132-
} catch (IllegalArgumentException e) {
133-
// expected
134-
assertTrue(e.getMessage(), e.getMessage().contains("mapper [foo] cannot be changed from type [long] to [double]"));
135-
}
136-
137-
try {
138-
mapperService.merge("type2", new CompressedXContent(Strings.toString(update)), MapperService.MergeReason.MAPPING_UPDATE);
130+
mapperService.merge("type", new CompressedXContent(Strings.toString(update)), MapperService.MergeReason.MAPPING_UPDATE);
139131
fail();
140132
} catch (IllegalArgumentException e) {
141133
// expected
142134
assertTrue(e.getMessage(), e.getMessage().contains("mapper [foo] cannot be changed from type [long] to [double]"));
143135
}
144136

145-
assertThat(((FieldMapper) mapperService.documentMapper("type1").mapping().root().getMapper("foo")).fieldType().typeName(),
137+
assertThat(((FieldMapper) mapperService.documentMapper("type").mapping().root().getMapper("foo")).fieldType().typeName(),
146138
equalTo("long"));
147-
assertNull(mapperService.documentMapper("type2"));
148139
}
149140

150141
// same as the testConflictNewType except that the mapping update is on an existing type
@@ -208,15 +199,15 @@ public void testReuseMetaField() throws IOException {
208199

209200
public void testRejectFieldDefinedTwice() throws IOException {
210201
String mapping1 = Strings.toString(XContentFactory.jsonBuilder().startObject()
211-
.startObject("type1")
202+
.startObject("type")
212203
.startObject("properties")
213204
.startObject("foo")
214205
.field("type", "object")
215206
.endObject()
216207
.endObject()
217208
.endObject().endObject());
218209
String mapping2 = Strings.toString(XContentFactory.jsonBuilder().startObject()
219-
.startObject("type2")
210+
.startObject("type")
220211
.startObject("properties")
221212
.startObject("foo")
222213
.field("type", "long")
@@ -225,17 +216,15 @@ public void testRejectFieldDefinedTwice() throws IOException {
225216
.endObject().endObject());
226217

227218
MapperService mapperService1 = createIndex("test1").mapperService();
228-
mapperService1.merge("type1", new CompressedXContent(mapping1), MergeReason.MAPPING_UPDATE);
219+
mapperService1.merge("type", new CompressedXContent(mapping1), MergeReason.MAPPING_UPDATE);
229220
IllegalArgumentException e = expectThrows(IllegalArgumentException.class,
230-
() -> mapperService1.merge("type2", new CompressedXContent(mapping2), MergeReason.MAPPING_UPDATE));
231-
assertThat(e.getMessage(), equalTo("[foo] is defined as a field in mapping [type2"
232-
+ "] but this name is already used for an object in other types"));
221+
() -> mapperService1.merge("type", new CompressedXContent(mapping2), MergeReason.MAPPING_UPDATE));
222+
assertThat(e.getMessage(), equalTo("Can't merge a non object mapping [foo] with an object mapping [foo]"));
233223

234224
MapperService mapperService2 = createIndex("test2").mapperService();
235-
mapperService2.merge("type2", new CompressedXContent(mapping2), MergeReason.MAPPING_UPDATE);
225+
mapperService2.merge("type", new CompressedXContent(mapping2), MergeReason.MAPPING_UPDATE);
236226
e = expectThrows(IllegalArgumentException.class,
237-
() -> mapperService2.merge("type1", new CompressedXContent(mapping1), MergeReason.MAPPING_UPDATE));
238-
assertThat(e.getMessage(), equalTo("[foo] is defined as an object in mapping [type1"
239-
+ "] but this name is already used for a field in other types"));
227+
() -> mapperService2.merge("type", new CompressedXContent(mapping1), MergeReason.MAPPING_UPDATE));
228+
assertThat(e.getMessage(), equalTo("mapper [foo] of different type, current_type [long], merged_type [ObjectMapper]"));
240229
}
241230
}

0 commit comments

Comments
 (0)