[CCR] Handle leader index with no mapping correctly (#33770)
When a leader index is created, it may not have a mapping yet. Currently if you follow such an index the shard follow tasks fail with NoSuchElementException, because they expect a single mapping. This commit fixes that, by allowing that a leader index does not yet have a mapping.
This commit is contained in:
parent
48a5b45d28
commit
d8dc042514
|
@ -111,6 +111,12 @@ public class ShardFollowTasksExecutor extends PersistentTasksExecutor<ShardFollo
|
|||
|
||||
leaderClient.admin().cluster().state(clusterStateRequest, ActionListener.wrap(clusterStateResponse -> {
|
||||
IndexMetaData indexMetaData = clusterStateResponse.getState().metaData().getIndexSafe(leaderIndex);
|
||||
if (indexMetaData.getMappings().isEmpty()) {
|
||||
assert indexMetaData.getMappingVersion() == 1;
|
||||
handler.accept(indexMetaData.getMappingVersion());
|
||||
return;
|
||||
}
|
||||
|
||||
assert indexMetaData.getMappings().size() == 1 : "expected exactly one mapping, but got [" +
|
||||
indexMetaData.getMappings().size() + "]";
|
||||
MappingMetaData mappingMetaData = indexMetaData.getMappings().iterator().next().value;
|
||||
|
|
|
@ -21,6 +21,7 @@ import org.elasticsearch.action.search.SearchRequest;
|
|||
import org.elasticsearch.action.search.SearchResponse;
|
||||
import org.elasticsearch.analysis.common.CommonAnalysisPlugin;
|
||||
import org.elasticsearch.cluster.ClusterState;
|
||||
import org.elasticsearch.cluster.metadata.IndexMetaData;
|
||||
import org.elasticsearch.cluster.metadata.MappingMetaData;
|
||||
import org.elasticsearch.common.CheckedRunnable;
|
||||
import org.elasticsearch.common.bytes.BytesReference;
|
||||
|
@ -259,6 +260,29 @@ public class ShardChangesIT extends ESIntegTestCase {
|
|||
unfollowIndex("index2");
|
||||
}
|
||||
|
||||
public void testNoMappingDefined() throws Exception {
|
||||
assertAcked(client().admin().indices().prepareCreate("index1")
|
||||
.setSettings(Settings.builder()
|
||||
.put(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), true)
|
||||
.put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1)
|
||||
.put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
|
||||
.build()));
|
||||
ensureGreen("index1");
|
||||
|
||||
final FollowIndexAction.Request followRequest = createFollowRequest("index1", "index2");
|
||||
final CreateAndFollowIndexAction.Request createAndFollowRequest = new CreateAndFollowIndexAction.Request(followRequest);
|
||||
client().execute(CreateAndFollowIndexAction.INSTANCE, createAndFollowRequest).get();
|
||||
|
||||
client().prepareIndex("index1", "doc", "1").setSource("{\"f\":1}", XContentType.JSON).get();
|
||||
assertBusy(() -> assertThat(client().prepareSearch("index2").get().getHits().totalHits, equalTo(1L)));
|
||||
unfollowIndex("index2");
|
||||
|
||||
MappingMetaData mappingMetaData = client().admin().indices().prepareGetMappings("index2").get().getMappings()
|
||||
.get("index2").get("doc");
|
||||
assertThat(XContentMapValues.extractValue("properties.f.type", mappingMetaData.sourceAsMap()), equalTo("long"));
|
||||
assertThat(XContentMapValues.extractValue("properties.k", mappingMetaData.sourceAsMap()), nullValue());
|
||||
}
|
||||
|
||||
public void testFollowIndex_backlog() throws Exception {
|
||||
String leaderIndexSettings = getIndexSettings(between(1, 5), between(0, 1),
|
||||
singletonMap(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), "true"));
|
||||
|
|
Loading…
Reference in New Issue