Skip to content

Commit da907c9

Browse files
committed
Fetch phase when searching might fail when mapping are updated with type missing, closes elastic#1369.
1 parent 8252eae commit da907c9

File tree

1 file changed

+48
-36
lines changed

1 file changed

+48
-36
lines changed

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

Lines changed: 48 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ public void add(String type, String mappingSource) {
167167
}
168168
}
169169

170+
// never expose this to the outside world, we need to reparse the doc mapper so we get fresh
171+
// instances of field mappers to properly remove existing doc mapper
170172
private void add(DocumentMapper mapper) {
171173
synchronized (mutex) {
172174
if (mapper.type().charAt(0) == '_') {
@@ -181,10 +183,17 @@ private void add(DocumentMapper mapper) {
181183
if (mapper.type().contains(".")) {
182184
logger.warn("Type [{}] contains a '.', it is recommended not to include it within a type name", mapper.type());
183185
}
184-
remove(mapper.type()); // first remove it (in case its an update, we need to remove the aggregated mappers)
186+
// we can add new field/object mappers while the old ones are there
187+
// since we get new instances of those, and when we remove, we remove
188+
// by instance equality
189+
DocumentMapper oldMapper = mappers.get(mapper.type());
185190
mapper.addFieldMapperListener(fieldMapperListener, true);
186191
mapper.addObjectMapperListener(objectMapperListener, true);
187192
mappers = newMapBuilder(mappers).put(mapper.type(), mapper).immutableMap();
193+
if (oldMapper != null) {
194+
removeObjectFieldMappers(oldMapper);
195+
oldMapper.close();
196+
}
188197
}
189198
}
190199

@@ -196,49 +205,52 @@ public void remove(String type) {
196205
}
197206
docMapper.close();
198207
mappers = newMapBuilder(mappers).remove(type).immutableMap();
208+
removeObjectFieldMappers(docMapper);
209+
}
210+
}
199211

200-
// we need to remove those mappers
201-
for (FieldMapper mapper : docMapper.mappers()) {
202-
FieldMappers mappers = nameFieldMappers.get(mapper.names().name());
203-
if (mappers != null) {
204-
mappers = mappers.remove(mapper);
205-
if (mappers.isEmpty()) {
206-
nameFieldMappers = newMapBuilder(nameFieldMappers).remove(mapper.names().name()).immutableMap();
207-
} else {
208-
nameFieldMappers = newMapBuilder(nameFieldMappers).put(mapper.names().name(), mappers).immutableMap();
209-
}
212+
private void removeObjectFieldMappers(DocumentMapper docMapper) {
213+
// we need to remove those mappers
214+
for (FieldMapper mapper : docMapper.mappers()) {
215+
FieldMappers mappers = nameFieldMappers.get(mapper.names().name());
216+
if (mappers != null) {
217+
mappers = mappers.remove(mapper);
218+
if (mappers.isEmpty()) {
219+
nameFieldMappers = newMapBuilder(nameFieldMappers).remove(mapper.names().name()).immutableMap();
220+
} else {
221+
nameFieldMappers = newMapBuilder(nameFieldMappers).put(mapper.names().name(), mappers).immutableMap();
210222
}
223+
}
211224

212-
mappers = indexNameFieldMappers.get(mapper.names().indexName());
213-
if (mappers != null) {
214-
mappers = mappers.remove(mapper);
215-
if (mappers.isEmpty()) {
216-
indexNameFieldMappers = newMapBuilder(indexNameFieldMappers).remove(mapper.names().indexName()).immutableMap();
217-
} else {
218-
indexNameFieldMappers = newMapBuilder(indexNameFieldMappers).put(mapper.names().indexName(), mappers).immutableMap();
219-
}
225+
mappers = indexNameFieldMappers.get(mapper.names().indexName());
226+
if (mappers != null) {
227+
mappers = mappers.remove(mapper);
228+
if (mappers.isEmpty()) {
229+
indexNameFieldMappers = newMapBuilder(indexNameFieldMappers).remove(mapper.names().indexName()).immutableMap();
230+
} else {
231+
indexNameFieldMappers = newMapBuilder(indexNameFieldMappers).put(mapper.names().indexName(), mappers).immutableMap();
220232
}
233+
}
221234

222-
mappers = fullNameFieldMappers.get(mapper.names().fullName());
223-
if (mappers != null) {
224-
mappers = mappers.remove(mapper);
225-
if (mappers.isEmpty()) {
226-
fullNameFieldMappers = newMapBuilder(fullNameFieldMappers).remove(mapper.names().fullName()).immutableMap();
227-
} else {
228-
fullNameFieldMappers = newMapBuilder(fullNameFieldMappers).put(mapper.names().fullName(), mappers).immutableMap();
229-
}
235+
mappers = fullNameFieldMappers.get(mapper.names().fullName());
236+
if (mappers != null) {
237+
mappers = mappers.remove(mapper);
238+
if (mappers.isEmpty()) {
239+
fullNameFieldMappers = newMapBuilder(fullNameFieldMappers).remove(mapper.names().fullName()).immutableMap();
240+
} else {
241+
fullNameFieldMappers = newMapBuilder(fullNameFieldMappers).put(mapper.names().fullName(), mappers).immutableMap();
230242
}
231243
}
244+
}
232245

233-
for (ObjectMapper mapper : docMapper.objectMappers().values()) {
234-
ObjectMappers mappers = objectMappers.get(mapper.fullPath());
235-
if (mappers != null) {
236-
mappers = mappers.remove(mapper);
237-
if (mappers.isEmpty()) {
238-
objectMappers = newMapBuilder(objectMappers).remove(mapper.fullPath()).immutableMap();
239-
} else {
240-
objectMappers = newMapBuilder(objectMappers).put(mapper.fullPath(), mappers).immutableMap();
241-
}
246+
for (ObjectMapper mapper : docMapper.objectMappers().values()) {
247+
ObjectMappers mappers = objectMappers.get(mapper.fullPath());
248+
if (mappers != null) {
249+
mappers = mappers.remove(mapper);
250+
if (mappers.isEmpty()) {
251+
objectMappers = newMapBuilder(objectMappers).remove(mapper.fullPath()).immutableMap();
252+
} else {
253+
objectMappers = newMapBuilder(objectMappers).put(mapper.fullPath(), mappers).immutableMap();
242254
}
243255
}
244256
}

0 commit comments

Comments
 (0)