do not update mapping if it is newer than the current version (elastic/x-pack-elasticsearch#1971)
In case of mixed version in a cluster the update could potentially downgrade the mappings. This CL changes the check to avoid this situation. Original commit: elastic/x-pack-elasticsearch@9ecd5df70e
This commit is contained in:
parent
753690bf5c
commit
f5cfb98ea2
|
@ -495,7 +495,7 @@ public class OpenJobAction extends Action<OpenJobAction.Request, OpenJobAction.R
|
|||
String[] concreteIndices = aliasOrIndex.getIndices().stream().map(IndexMetaData::getIndex).map(Index::getName)
|
||||
.toArray(String[]::new);
|
||||
|
||||
String[] indicesThatRequireAnUpdate = mappingRequiresUpdate(state, concreteIndices, logger);
|
||||
String[] indicesThatRequireAnUpdate = mappingRequiresUpdate(state, concreteIndices, Version.CURRENT, logger);
|
||||
|
||||
if (indicesThatRequireAnUpdate.length > 0) {
|
||||
try (XContentBuilder mapping = mappingSupplier.get()) {
|
||||
|
@ -755,7 +755,7 @@ public class OpenJobAction extends Action<OpenJobAction.Request, OpenJobAction.R
|
|||
return nodeVersion.onOrAfter(Version.V_5_5_0);
|
||||
}
|
||||
|
||||
static String[] mappingRequiresUpdate(ClusterState state, String[] concreteIndices, Logger logger) {
|
||||
static String[] mappingRequiresUpdate(ClusterState state, String[] concreteIndices, Version minVersion, Logger logger) {
|
||||
List<String> indicesToUpdate = new ArrayList<>();
|
||||
|
||||
ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> currentMapping = state.metaData().findMappings(concreteIndices,
|
||||
|
@ -777,7 +777,7 @@ public class OpenJobAction extends Action<OpenJobAction.Request, OpenJobAction.R
|
|||
|
||||
Version mappingVersion = Version.fromString(versionString);
|
||||
|
||||
if (mappingVersion.equals(Version.CURRENT)) {
|
||||
if (mappingVersion.onOrAfter(minVersion)) {
|
||||
continue;
|
||||
} else {
|
||||
logger.info("Mappings for [{}] are outdated [{}], updating it[{}].", index, mappingVersion, Version.CURRENT);
|
||||
|
|
|
@ -27,6 +27,7 @@ import org.elasticsearch.index.Index;
|
|||
import org.elasticsearch.index.shard.ShardId;
|
||||
import org.elasticsearch.rest.RestStatus;
|
||||
import org.elasticsearch.test.ESTestCase;
|
||||
import org.elasticsearch.test.VersionUtils;
|
||||
import org.elasticsearch.xpack.ml.MachineLearning;
|
||||
import org.elasticsearch.xpack.ml.MlMetaIndex;
|
||||
import org.elasticsearch.xpack.ml.MlMetadata;
|
||||
|
@ -347,44 +348,57 @@ public class OpenJobActionTests extends ESTestCase {
|
|||
ClusterState cs = csBuilder.build();
|
||||
String[] indices = new String[] { "no_index" };
|
||||
|
||||
assertArrayEquals(new String[] { "no_index" }, OpenJobAction.mappingRequiresUpdate(cs, indices, logger));
|
||||
assertArrayEquals(new String[] { "no_index" }, OpenJobAction.mappingRequiresUpdate(cs, indices, Version.CURRENT, logger));
|
||||
}
|
||||
|
||||
public void testMappingRequiresUpdateNullMapping() throws IOException {
|
||||
ClusterState cs = getClusterStateWithMappingsWithMetaData(Collections.singletonMap("null_mapping", null));
|
||||
String[] indices = new String[] { "null_index" };
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, logger));
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, Version.CURRENT, logger));
|
||||
}
|
||||
|
||||
public void testMappingRequiresUpdateNoVersion() throws IOException {
|
||||
ClusterState cs = getClusterStateWithMappingsWithMetaData(Collections.singletonMap("no_version_field", "NO_VERSION_FIELD"));
|
||||
String[] indices = new String[] { "no_version_field" };
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, logger));
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, Version.CURRENT, logger));
|
||||
}
|
||||
|
||||
public void testMappingRequiresUpdateRecentMappingVersion() throws IOException {
|
||||
ClusterState cs = getClusterStateWithMappingsWithMetaData(Collections.singletonMap("version_current", Version.CURRENT.toString()));
|
||||
String[] indices = new String[] { "version_current" };
|
||||
assertArrayEquals(new String[] {}, OpenJobAction.mappingRequiresUpdate(cs, indices, logger));
|
||||
assertArrayEquals(new String[] {}, OpenJobAction.mappingRequiresUpdate(cs, indices, Version.CURRENT, logger));
|
||||
}
|
||||
|
||||
public void testMappingRequiresUpdateMaliciousMappingVersion() throws IOException {
|
||||
ClusterState cs = getClusterStateWithMappingsWithMetaData(
|
||||
Collections.singletonMap("version_current", Collections.singletonMap("nested", "1.0")));
|
||||
String[] indices = new String[] { "version_nested" };
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, logger));
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, Version.CURRENT, logger));
|
||||
}
|
||||
|
||||
public void testMappingRequiresUpdateOldMappingVersion() throws IOException {
|
||||
ClusterState cs = getClusterStateWithMappingsWithMetaData(Collections.singletonMap("version_54", Version.V_5_4_0.toString()));
|
||||
String[] indices = new String[] { "version_54" };
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, logger));
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, Version.CURRENT, logger));
|
||||
}
|
||||
|
||||
public void testMappingRequiresUpdateBogusMappingVersion() throws IOException {
|
||||
ClusterState cs = getClusterStateWithMappingsWithMetaData(Collections.singletonMap("version_bogus", "0.0"));
|
||||
String[] indices = new String[] { "version_bogus" };
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, logger));
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, Version.CURRENT, logger));
|
||||
}
|
||||
|
||||
public void testMappingRequiresUpdateNewerMappingVersion() throws IOException {
|
||||
ClusterState cs = getClusterStateWithMappingsWithMetaData(Collections.singletonMap("version_newer", Version.CURRENT));
|
||||
String[] indices = new String[] { "version_newer" };
|
||||
assertArrayEquals(new String[] {}, OpenJobAction.mappingRequiresUpdate(cs, indices, VersionUtils.getPreviousVersion(), logger));
|
||||
}
|
||||
|
||||
public void testMappingRequiresUpdateNewerMappingVersionMinor() throws IOException {
|
||||
ClusterState cs = getClusterStateWithMappingsWithMetaData(Collections.singletonMap("version_newer_minor", Version.CURRENT));
|
||||
String[] indices = new String[] { "version_newer_minor" };
|
||||
assertArrayEquals(new String[] {},
|
||||
OpenJobAction.mappingRequiresUpdate(cs, indices, VersionUtils.getPreviousMinorVersion(), logger));
|
||||
}
|
||||
|
||||
public void testMappingRequiresUpdateSomeVersionMix() throws IOException {
|
||||
|
@ -399,7 +413,7 @@ public class OpenJobActionTests extends ESTestCase {
|
|||
|
||||
ClusterState cs = getClusterStateWithMappingsWithMetaData(versionMix);
|
||||
String[] indices = new String[] { "version_54", "version_null", "version_bogus", "version_bogus2" };
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, logger));
|
||||
assertArrayEquals(indices, OpenJobAction.mappingRequiresUpdate(cs, indices, Version.CURRENT, logger));
|
||||
}
|
||||
|
||||
public static void addJobTask(String jobId, String nodeId, JobState jobState, PersistentTasksCustomMetaData.Builder builder) {
|
||||
|
|
Loading…
Reference in New Issue