Skip to content

Commit df4ffbe

Browse files
committed
better error handling when processing refresh/update mapping
don't fail the whole bulk of updates, just the specific ones, and warn log it
1 parent dd86db3 commit df4ffbe

File tree

1 file changed

+65
-58
lines changed

1 file changed

+65
-58
lines changed

src/main/java/org/elasticsearch/cluster/metadata/MetaDataMappingService.java

Lines changed: 65 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -160,80 +160,87 @@ ClusterState executeRefreshOrUpdate(final ClusterState currentState) throws Exce
160160

161161
if (task instanceof RefreshTask) {
162162
RefreshTask refreshTask = (RefreshTask) task;
163-
IndexService indexService = indicesService.indexService(index);
164-
if (indexService == null) {
165-
// we need to create the index here, and add the current mapping to it, so we can merge
166-
indexService = indicesService.createIndex(indexMetaData.index(), indexMetaData.settings(), currentState.nodes().localNode().id());
167-
removeIndex = true;
163+
try {
164+
IndexService indexService = indicesService.indexService(index);
165+
if (indexService == null) {
166+
// we need to create the index here, and add the current mapping to it, so we can merge
167+
indexService = indicesService.createIndex(indexMetaData.index(), indexMetaData.settings(), currentState.nodes().localNode().id());
168+
removeIndex = true;
169+
for (String type : refreshTask.types) {
170+
// only add the current relevant mapping (if exists)
171+
if (indexMetaData.mappings().containsKey(type)) {
172+
// don't apply the default mapping, it has been applied when the mapping was created
173+
indexService.mapperService().merge(type, indexMetaData.mappings().get(type).source(), false);
174+
}
175+
}
176+
}
177+
IndexMetaData.Builder indexMetaDataBuilder = IndexMetaData.builder(indexMetaData);
178+
List<String> updatedTypes = Lists.newArrayList();
168179
for (String type : refreshTask.types) {
169-
// only add the current relevant mapping (if exists)
170-
if (indexMetaData.mappings().containsKey(type)) {
171-
// don't apply the default mapping, it has been applied when the mapping was created
172-
indexService.mapperService().merge(type, indexMetaData.mappings().get(type).source(), false);
180+
if (processedRefreshes.contains(type)) {
181+
continue;
173182
}
183+
DocumentMapper mapper = indexService.mapperService().documentMapper(type);
184+
if (!mapper.mappingSource().equals(indexMetaData.mappings().get(type).source())) {
185+
updatedTypes.add(type);
186+
indexMetaDataBuilder.putMapping(new MappingMetaData(mapper));
187+
}
188+
processedRefreshes.add(type);
174189
}
175-
}
176-
IndexMetaData.Builder indexMetaDataBuilder = IndexMetaData.builder(indexMetaData);
177-
List<String> updatedTypes = Lists.newArrayList();
178-
for (String type : refreshTask.types) {
179-
if (processedRefreshes.contains(type)) {
190+
191+
if (updatedTypes.isEmpty()) {
180192
continue;
181193
}
182-
DocumentMapper mapper = indexService.mapperService().documentMapper(type);
183-
if (!mapper.mappingSource().equals(indexMetaData.mappings().get(type).source())) {
184-
updatedTypes.add(type);
185-
indexMetaDataBuilder.putMapping(new MappingMetaData(mapper));
186-
}
187-
processedRefreshes.add(type);
188-
}
189194

190-
if (updatedTypes.isEmpty()) {
191-
continue;
195+
logger.warn("[{}] re-syncing mappings with cluster state for types [{}]", index, updatedTypes);
196+
mdBuilder.put(indexMetaDataBuilder);
197+
dirty = true;
198+
} catch (Throwable t) {
199+
logger.warn("[{}] failed to refresh-mapping in cluster state, types [{}]", index, refreshTask.types);
192200
}
193-
194-
logger.warn("[{}] re-syncing mappings with cluster state for types [{}]", index, updatedTypes);
195-
mdBuilder.put(indexMetaDataBuilder);
196-
dirty = true;
197-
198201
} else if (task instanceof UpdateTask) {
199202
UpdateTask updateTask = (UpdateTask) task;
200-
String type = updateTask.type;
201-
CompressedString mappingSource = updateTask.mappingSource;
203+
try {
204+
String type = updateTask.type;
205+
CompressedString mappingSource = updateTask.mappingSource;
202206

203-
if (indexMetaData.mappings().containsKey(type) && indexMetaData.mapping(type).source().equals(mappingSource)) {
204-
logger.debug("[{}] update_mapping [{}] ignoring mapping update task as its source is equal to ours", index, updateTask.type);
205-
continue;
206-
}
207+
if (indexMetaData.mappings().containsKey(type) && indexMetaData.mapping(type).source().equals(mappingSource)) {
208+
logger.debug("[{}] update_mapping [{}] ignoring mapping update task as its source is equal to ours", index, updateTask.type);
209+
continue;
210+
}
207211

208-
IndexService indexService = indicesService.indexService(index);
209-
if (indexService == null) {
210-
// we need to create the index here, and add the current mapping to it, so we can merge
211-
indexService = indicesService.createIndex(indexMetaData.index(), indexMetaData.settings(), currentState.nodes().localNode().id());
212-
removeIndex = true;
213-
// only add the current relevant mapping (if exists)
214-
if (indexMetaData.mappings().containsKey(type)) {
215-
indexService.mapperService().merge(type, indexMetaData.mappings().get(type).source(), false);
212+
IndexService indexService = indicesService.indexService(index);
213+
if (indexService == null) {
214+
// we need to create the index here, and add the current mapping to it, so we can merge
215+
indexService = indicesService.createIndex(indexMetaData.index(), indexMetaData.settings(), currentState.nodes().localNode().id());
216+
removeIndex = true;
217+
// only add the current relevant mapping (if exists)
218+
if (indexMetaData.mappings().containsKey(type)) {
219+
indexService.mapperService().merge(type, indexMetaData.mappings().get(type).source(), false);
220+
}
216221
}
217-
}
218222

219-
DocumentMapper updatedMapper = indexService.mapperService().merge(type, mappingSource, false);
220-
processedRefreshes.add(type);
223+
DocumentMapper updatedMapper = indexService.mapperService().merge(type, mappingSource, false);
224+
processedRefreshes.add(type);
225+
226+
// if we end up with the same mapping as the original once, ignore
227+
if (indexMetaData.mappings().containsKey(type) && indexMetaData.mapping(type).source().equals(updatedMapper.mappingSource())) {
228+
logger.debug("[{}] update_mapping [{}] ignoring mapping update task as it results in the same source as what we have", index, updateTask.type);
229+
continue;
230+
}
221231

222-
// if we end up with the same mapping as the original once, ignore
223-
if (indexMetaData.mappings().containsKey(type) && indexMetaData.mapping(type).source().equals(updatedMapper.mappingSource())) {
224-
logger.debug("[{}] update_mapping [{}] ignoring mapping update task as it results in the same source as what we have", index, updateTask.type);
225-
continue;
226-
}
232+
// build the updated mapping source
233+
if (logger.isDebugEnabled()) {
234+
logger.debug("[{}] update_mapping [{}] (dynamic) with source [{}]", index, type, updatedMapper.mappingSource());
235+
} else if (logger.isInfoEnabled()) {
236+
logger.info("[{}] update_mapping [{}] (dynamic)", index, type);
237+
}
227238

228-
// build the updated mapping source
229-
if (logger.isDebugEnabled()) {
230-
logger.debug("[{}] update_mapping [{}] (dynamic) with source [{}]", index, type, updatedMapper.mappingSource());
231-
} else if (logger.isInfoEnabled()) {
232-
logger.info("[{}] update_mapping [{}] (dynamic)", index, type);
239+
mdBuilder.put(IndexMetaData.builder(indexMetaData).putMapping(new MappingMetaData(updatedMapper)));
240+
dirty = true;
241+
} catch (Throwable t) {
242+
logger.warn("[{}] failed to update-mapping in cluster state, type [{}]", index, updateTask.type);
233243
}
234-
235-
mdBuilder.put(IndexMetaData.builder(indexMetaData).putMapping(new MappingMetaData(updatedMapper)));
236-
dirty = true;
237244
} else {
238245
logger.warn("illegal state, got wrong mapping task type [{}]", task);
239246
}

0 commit comments

Comments
 (0)