Do not lose default mapper on metadata updates (#33153)
When applying index metadata updates we run through the mappings updating them if needed. Today if there is not an update to the default mapper, we can lose the default mapping. This means that, for example, if we apply a settings update to an index we will lose the default mapper. This happens because we were not guarding updating the default mapping with a check that the default mapping was updated in the metadata update. When there is no update in the metadata update, we need to continue to preserve the previous default mapping. This commit achieves this by moving the updating of the default mapping under the same guard that we use for updating the default mapping source. We add a test that fails before putting the update under a guard and now passes after moving the update under the guard.
This commit is contained in:
parent
f8b07a0d84
commit
143cd9bbaa
|
@ -468,11 +468,11 @@ public class MapperService extends AbstractIndexComponent implements Closeable {
|
|||
// commit the change
|
||||
if (defaultMappingSource != null) {
|
||||
this.defaultMappingSource = defaultMappingSource;
|
||||
this.defaultMapper = defaultMapper;
|
||||
}
|
||||
if (newMapper != null) {
|
||||
this.mapper = newMapper;
|
||||
}
|
||||
this.defaultMapper = defaultMapper;
|
||||
this.fieldTypes = fieldTypes;
|
||||
this.hasNested = hasNested;
|
||||
this.fullPathObjectMappers = fullPathObjectMappers;
|
||||
|
|
|
@ -21,13 +21,16 @@ package org.elasticsearch.index.mapper;
|
|||
|
||||
import org.elasticsearch.ExceptionsHelper;
|
||||
import org.elasticsearch.Version;
|
||||
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
|
||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.common.Strings;
|
||||
import org.elasticsearch.common.bytes.BytesReference;
|
||||
import org.elasticsearch.common.compress.CompressedXContent;
|
||||
import org.elasticsearch.common.settings.Settings;
|
||||
import org.elasticsearch.common.xcontent.XContentBuilder;
|
||||
import org.elasticsearch.common.xcontent.XContentFactory;
|
||||
import org.elasticsearch.common.xcontent.XContentType;
|
||||
import org.elasticsearch.common.xcontent.json.JsonXContent;
|
||||
import org.elasticsearch.index.IndexService;
|
||||
import org.elasticsearch.index.mapper.KeywordFieldMapper.KeywordFieldType;
|
||||
import org.elasticsearch.index.mapper.MapperService.MergeReason;
|
||||
|
@ -119,6 +122,35 @@ public class MapperServiceTests extends ESSingleNodeTestCase {
|
|||
assertNull(indexService.mapperService().documentMapper(MapperService.DEFAULT_MAPPING));
|
||||
}
|
||||
|
||||
public void testIndexMetaDataUpdateDoesNotLoseDefaultMapper() throws IOException {
|
||||
final IndexService indexService =
|
||||
createIndex("test", Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_6_3_0).build());
|
||||
try (XContentBuilder builder = JsonXContent.contentBuilder()) {
|
||||
builder.startObject();
|
||||
{
|
||||
builder.startObject(MapperService.DEFAULT_MAPPING);
|
||||
{
|
||||
builder.field("date_detection", false);
|
||||
}
|
||||
builder.endObject();
|
||||
}
|
||||
builder.endObject();
|
||||
final PutMappingRequest putMappingRequest = new PutMappingRequest();
|
||||
putMappingRequest.indices("test");
|
||||
putMappingRequest.type(MapperService.DEFAULT_MAPPING);
|
||||
putMappingRequest.source(builder);
|
||||
client().admin().indices().preparePutMapping("test").setType(MapperService.DEFAULT_MAPPING).setSource(builder).get();
|
||||
}
|
||||
assertNotNull(indexService.mapperService().documentMapper(MapperService.DEFAULT_MAPPING));
|
||||
final Settings zeroReplicasSettings = Settings.builder().put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0).build();
|
||||
client().admin().indices().prepareUpdateSettings("test").setSettings(zeroReplicasSettings).get();
|
||||
/*
|
||||
* This assertion is a guard against a previous bug that would lose the default mapper when applying a metadata update that did not
|
||||
* update the default mapping.
|
||||
*/
|
||||
assertNotNull(indexService.mapperService().documentMapper(MapperService.DEFAULT_MAPPING));
|
||||
}
|
||||
|
||||
public void testTotalFieldsExceedsLimit() throws Throwable {
|
||||
Function<String, String> mapping = type -> {
|
||||
try {
|
||||
|
|
Loading…
Reference in New Issue