[ML] checking if p-tasks metadata is null before updating state (#41091) (#41123)

* [ML] checking if p-tasks metadata is null before updating state

* Adding test that validates fix

* removing debug println
This commit is contained in:
Benjamin Trent 2019-04-11 13:54:41 -05:00 committed by GitHub
parent 9e32e36799
commit 05cf53934a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 5 deletions

View File

@ -246,10 +246,14 @@ public class MlConfigMigrator {
currentState.metaData().custom(PersistentTasksCustomMetaData.TYPE), currentState.nodes());
ClusterState.Builder newState = ClusterState.builder(currentState);
newState.metaData(MetaData.builder(currentState.getMetaData())
.putCustom(MlMetadata.TYPE, removed.mlMetadata)
.putCustom(PersistentTasksCustomMetaData.TYPE, updatedTasks)
.build());
MetaData.Builder metaDataBuilder = MetaData.builder(currentState.getMetaData())
.putCustom(MlMetadata.TYPE, removed.mlMetadata);
// If there are no tasks in the cluster state metadata to begin with, this could be null.
if (updatedTasks != null) {
metaDataBuilder = metaDataBuilder.putCustom(PersistentTasksCustomMetaData.TYPE, updatedTasks);
}
newState.metaData(metaDataBuilder.build());
return newState.build();
}

View File

@ -5,6 +5,7 @@
*/
package org.elasticsearch.xpack.ml.integration;
import com.carrotsearch.hppc.cursors.ObjectCursor;
import org.elasticsearch.Version;
import org.elasticsearch.action.DocWriteRequest;
import org.elasticsearch.action.index.IndexRequest;
@ -47,10 +48,12 @@ import org.junit.Before;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
@ -148,9 +151,13 @@ public class MlConfigMigratorIT extends MlSingleNodeTestCase {
.routingTable(routingTable.build())
.build();
when(clusterService.state()).thenReturn(clusterState);
List<MetaData.Custom> customs = new ArrayList<>();
doAnswer(invocation -> {
ClusterStateUpdateTask listener = (ClusterStateUpdateTask) invocation.getArguments()[1];
ClusterState result = listener.execute(clusterState);
for (ObjectCursor<MetaData.Custom> value : result.metaData().customs().values()){
customs.add(value.value);
}
listener.clusterStateProcessed("source", mock(ClusterState.class), mock(ClusterState.class));
return null;
}).when(clusterService).submitStateUpdateTask(eq("remove-migrated-ml-configs"), any());
@ -164,6 +171,9 @@ public class MlConfigMigratorIT extends MlSingleNodeTestCase {
blockingCall(actionListener -> mlConfigMigrator.migrateConfigs(clusterState, actionListener),
responseHolder, exceptionHolder);
// Verify that we have custom values in the new cluster state and that none of them is null
assertThat(customs.size(), greaterThan(0));
assertThat(customs.stream().anyMatch(Objects::isNull), is(false));
assertNull(exceptionHolder.get());
assertTrue(responseHolder.get());
assertSnapshot(mlMetadata.build());