diff --git a/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportPauseFollowAction.java b/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportPauseFollowAction.java index 92e3377f376..8aa813cc826 100644 --- a/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportPauseFollowAction.java +++ b/x-pack/plugin/ccr/src/main/java/org/elasticsearch/xpack/ccr/action/TransportPauseFollowAction.java @@ -13,14 +13,17 @@ import org.elasticsearch.action.support.master.TransportMasterNodeAction; import org.elasticsearch.cluster.ClusterState; import org.elasticsearch.cluster.block.ClusterBlockException; import org.elasticsearch.cluster.block.ClusterBlockLevel; +import org.elasticsearch.cluster.metadata.IndexMetaData; import org.elasticsearch.cluster.metadata.IndexNameExpressionResolver; import org.elasticsearch.cluster.service.ClusterService; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.io.stream.StreamInput; +import org.elasticsearch.index.IndexNotFoundException; import org.elasticsearch.persistent.PersistentTasksCustomMetaData; import org.elasticsearch.persistent.PersistentTasksService; import org.elasticsearch.threadpool.ThreadPool; import org.elasticsearch.transport.TransportService; +import org.elasticsearch.xpack.ccr.Ccr; import org.elasticsearch.xpack.core.ccr.action.PauseFollowAction; import java.io.IOException; @@ -58,9 +61,18 @@ public class TransportPauseFollowAction extends TransportMasterNodeAction<PauseF protected void masterOperation(PauseFollowAction.Request request, ClusterState state, ActionListener<AcknowledgedResponse> listener) throws Exception { + final IndexMetaData followerIMD = state.metaData().index(request.getFollowIndex()); + if (followerIMD == null) { + listener.onFailure(new IndexNotFoundException(request.getFollowIndex())); + return; + } + if (followerIMD.getCustomData(Ccr.CCR_CUSTOM_METADATA_KEY) == null) { + listener.onFailure(new IllegalArgumentException("index [" + request.getFollowIndex() + "] is not a follower index")); + return; + } PersistentTasksCustomMetaData persistentTasksMetaData = state.metaData().custom(PersistentTasksCustomMetaData.TYPE); if (persistentTasksMetaData == null) { - listener.onFailure(new IllegalArgumentException("no shard follow tasks for [" + request.getFollowIndex() + "]")); + listener.onFailure(new IllegalArgumentException("no shard follow tasks found")); return; } diff --git a/x-pack/plugin/ccr/src/test/java/org/elasticsearch/xpack/ccr/IndexFollowingIT.java b/x-pack/plugin/ccr/src/test/java/org/elasticsearch/xpack/ccr/IndexFollowingIT.java index 0eac94aac8f..79a65014491 100644 --- a/x-pack/plugin/ccr/src/test/java/org/elasticsearch/xpack/ccr/IndexFollowingIT.java +++ b/x-pack/plugin/ccr/src/test/java/org/elasticsearch/xpack/ccr/IndexFollowingIT.java @@ -577,7 +577,7 @@ public class IndexFollowingIT extends CcrIntegTestCase { public void testUnfollowNonExistingIndex() { PauseFollowAction.Request unfollowRequest = new PauseFollowAction.Request("non-existing-index"); - expectThrows(IllegalArgumentException.class, + expectThrows(IndexNotFoundException.class, () -> followerClient().execute(PauseFollowAction.INSTANCE, unfollowRequest).actionGet()); } @@ -818,6 +818,27 @@ public class IndexFollowingIT extends CcrIntegTestCase { ensureNoCcrTasks(); } + public void testPauseIndex() throws Exception { + assertAcked(leaderClient().admin().indices().prepareCreate("leader") + .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())); + followerClient().execute(PutFollowAction.INSTANCE, putFollow("leader", "follower")).get(); + assertAcked(followerClient().admin().indices().prepareCreate("regular-index")); + assertAcked(followerClient().execute(PauseFollowAction.INSTANCE, new PauseFollowAction.Request("follower")).actionGet()); + assertThat(expectThrows(IllegalArgumentException.class, () -> followerClient().execute( + PauseFollowAction.INSTANCE, new PauseFollowAction.Request("follower")).actionGet()).getMessage(), + equalTo("no shard follow tasks for [follower]")); + assertThat(expectThrows(IllegalArgumentException.class, () -> followerClient().execute( + PauseFollowAction.INSTANCE, new PauseFollowAction.Request("regular-index")).actionGet()).getMessage(), + equalTo("index [regular-index] is not a follower index")); + assertThat(expectThrows(IndexNotFoundException.class, () -> followerClient().execute( + PauseFollowAction.INSTANCE, new PauseFollowAction.Request("xyz")).actionGet()).getMessage(), + equalTo("no such index [xyz]")); + } + public void testUnfollowIndex() throws Exception { String leaderIndexSettings = getIndexSettings(1, 0, singletonMap(IndexSettings.INDEX_SOFT_DELETES_SETTING.getKey(), "true")); assertAcked(leaderClient().admin().indices().prepareCreate("index1").setSource(leaderIndexSettings, XContentType.JSON).get());