Skip to content

Commit 801fed8

Browse files
authored
Fix validation of close_point_in_time request (#88702) (#88730)
ClosePointInTimeRequest#validate should return a validation error for an invalid pit_id, but it throws an IAE instead. This mistake prevents close_point_in_time tasks of requests with empty pit_id from being removed.
1 parent 8f0d91b commit 801fed8

File tree

5 files changed

+30
-4
lines changed

5 files changed

+30
-4
lines changed

docs/changelog/88702.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 88702
2+
summary: Fix validation of `close_pit` request
3+
area: Search
4+
type: bug
5+
issues: []

server/src/internalClusterTest/java/org/elasticsearch/action/search/PointInTimeIT.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.elasticsearch.search.sort.SortBuilder;
3030
import org.elasticsearch.search.sort.SortBuilders;
3131
import org.elasticsearch.search.sort.SortOrder;
32+
import org.elasticsearch.tasks.TaskInfo;
3233
import org.elasticsearch.test.ESIntegTestCase;
3334

3435
import java.util.HashSet;
@@ -42,6 +43,7 @@
4243
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
4344
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertNoFailures;
4445
import static org.hamcrest.Matchers.arrayWithSize;
46+
import static org.hamcrest.Matchers.empty;
4547
import static org.hamcrest.Matchers.equalTo;
4648
import static org.hamcrest.Matchers.everyItem;
4749
import static org.hamcrest.Matchers.in;
@@ -418,6 +420,12 @@ public void testPITTiebreak() throws Exception {
418420
}
419421
}
420422

423+
public void testCloseInvalidPointInTime() {
424+
expectThrows(Exception.class, () -> client().execute(ClosePointInTimeAction.INSTANCE, new ClosePointInTimeRequest("")).actionGet());
425+
List<TaskInfo> tasks = client().admin().cluster().prepareListTasks().setActions(ClosePointInTimeAction.NAME).get().getTasks();
426+
assertThat(tasks, empty());
427+
}
428+
421429
@SuppressWarnings({ "rawtypes", "unchecked" })
422430
private void assertPagination(PointInTimeBuilder pit, int expectedNumDocs, int size, SortBuilder<?>... sorts) throws Exception {
423431
Set<String> seen = new HashSet<>();

server/src/main/java/org/elasticsearch/action/search/ClosePointInTimeRequest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import org.elasticsearch.action.ActionRequest;
1212
import org.elasticsearch.action.ActionRequestValidationException;
13+
import org.elasticsearch.action.ValidateActions;
1314
import org.elasticsearch.common.Strings;
1415
import org.elasticsearch.common.io.stream.StreamInput;
1516
import org.elasticsearch.common.io.stream.StreamOutput;
@@ -41,7 +42,7 @@ public String getId() {
4142
@Override
4243
public ActionRequestValidationException validate() {
4344
if (Strings.isEmpty(id)) {
44-
throw new IllegalArgumentException("reader id must be specified");
45+
return ValidateActions.addValidationError("id is empty", null);
4546
}
4647
return null;
4748
}

server/src/main/java/org/elasticsearch/action/support/TransportAction.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,19 @@ protected TransportAction(String actionName, ActionFilters actionFilters, TaskMa
4040
* Use this method when the transport action should continue to run in the context of the current task
4141
*/
4242
public final void execute(Task task, Request request, ActionListener<Response> listener) {
43-
ActionRequestValidationException validationException = request.validate();
43+
final ActionRequestValidationException validationException;
44+
try {
45+
validationException = request.validate();
46+
} catch (Exception e) {
47+
assert false : new AssertionError("validating of request [" + request + "] threw exception", e);
48+
logger.warn("validating of request [" + request + "] threw exception", e);
49+
listener.onFailure(e);
50+
return;
51+
}
4452
if (validationException != null) {
4553
listener.onFailure(validationException);
4654
return;
4755
}
48-
4956
if (task != null && request.getShouldStoreResult()) {
5057
listener = new TaskResultStoringActionListener<>(taskManager, task, listener);
5158
}

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ilm/action/PutLifecycleAction.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import org.elasticsearch.action.ActionRequestValidationException;
1010
import org.elasticsearch.action.ActionType;
11+
import org.elasticsearch.action.ValidateActions;
1112
import org.elasticsearch.action.support.master.AcknowledgedRequest;
1213
import org.elasticsearch.action.support.master.AcknowledgedResponse;
1314
import org.elasticsearch.common.Strings;
@@ -62,8 +63,12 @@ public LifecyclePolicy getPolicy() {
6263

6364
@Override
6465
public ActionRequestValidationException validate() {
65-
this.policy.validate();
6666
ActionRequestValidationException err = null;
67+
try {
68+
this.policy.validate();
69+
} catch (IllegalArgumentException iae) {
70+
err = ValidateActions.addValidationError(iae.getMessage(), null);
71+
}
6772
String phaseTimingErr = TimeseriesLifecycleType.validateMonotonicallyIncreasingPhaseTimings(this.policy.getPhases().values());
6873
if (Strings.hasText(phaseTimingErr)) {
6974
err = new ActionRequestValidationException();

0 commit comments

Comments
 (0)