|
@@ -8,13 +8,20 @@
|
|
|
|
|
|
package org.elasticsearch.rest.action.admin.indices;
|
|
|
|
|
|
+import org.elasticsearch.action.ActionRequestValidationException;
|
|
|
+import org.elasticsearch.action.admin.indices.forcemerge.ForceMergeAction;
|
|
|
import org.elasticsearch.action.admin.indices.forcemerge.ForceMergeRequest;
|
|
|
import org.elasticsearch.action.support.IndicesOptions;
|
|
|
import org.elasticsearch.client.node.NodeClient;
|
|
|
import org.elasticsearch.common.Strings;
|
|
|
import org.elasticsearch.rest.BaseRestHandler;
|
|
|
+import org.elasticsearch.rest.BytesRestResponse;
|
|
|
import org.elasticsearch.rest.RestRequest;
|
|
|
+import org.elasticsearch.rest.RestStatus;
|
|
|
import org.elasticsearch.rest.action.RestToXContentListener;
|
|
|
+import org.elasticsearch.tasks.LoggingTaskListener;
|
|
|
+import org.elasticsearch.tasks.Task;
|
|
|
+import org.elasticsearch.xcontent.XContentBuilder;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
import java.util.List;
|
|
@@ -40,7 +47,34 @@ public class RestForceMergeAction extends BaseRestHandler {
|
|
|
mergeRequest.maxNumSegments(request.paramAsInt("max_num_segments", mergeRequest.maxNumSegments()));
|
|
|
mergeRequest.onlyExpungeDeletes(request.paramAsBoolean("only_expunge_deletes", mergeRequest.onlyExpungeDeletes()));
|
|
|
mergeRequest.flush(request.paramAsBoolean("flush", mergeRequest.flush()));
|
|
|
- return channel -> client.admin().indices().forceMerge(mergeRequest, new RestToXContentListener<>(channel));
|
|
|
+ if (request.paramAsBoolean("wait_for_completion", true)) {
|
|
|
+ return channel -> client.admin().indices().forceMerge(mergeRequest, new RestToXContentListener<>(channel));
|
|
|
+ } else {
|
|
|
+ mergeRequest.setShouldStoreResult(true);
|
|
|
+ /*
|
|
|
+ * Let's try and validate before forking so the user gets some error. The
|
|
|
+ * task can't totally validate until it starts but this is better than
|
|
|
+ * nothing.
|
|
|
+ */
|
|
|
+ ActionRequestValidationException validationException = mergeRequest.validate();
|
|
|
+ if (validationException != null) {
|
|
|
+ throw validationException;
|
|
|
+ }
|
|
|
+ return sendTask(
|
|
|
+ client.getLocalNodeId(),
|
|
|
+ client.executeLocally(ForceMergeAction.INSTANCE, mergeRequest, LoggingTaskListener.instance())
|
|
|
+ );
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ private RestChannelConsumer sendTask(String localNodeId, Task task) {
|
|
|
+ return channel -> {
|
|
|
+ try (XContentBuilder builder = channel.newBuilder()) {
|
|
|
+ builder.startObject();
|
|
|
+ builder.field("task", localNodeId + ":" + task.getId());
|
|
|
+ builder.endObject();
|
|
|
+ channel.sendResponse(new BytesRestResponse(RestStatus.OK, builder));
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
}
|