elastic / elastic/elasticsearch-java
get task status of forcemerge(wait_for_completion=false) results in error when task completed
- Dominant language
- Java
- Stars
- 524
- Forks
- 300
- Avg merge
- 1d 11h
- Merged PRs (30d)
- 16
Description
### Java API client version
8.5.2
### Java version
1.8
### Elasticsearch Version
8.5.0
### Problem description
when submit a force merge request with wait_for_completion=false, i got a taskid. and I use task id to query task status
```
logger.info("force merge taskId: {}", taskId);
boolean completed = false;
GetTasksResponse tasksResponse = null;
while (!completed) {
tasksResponse = client.tasks().get(t -> t.taskId(taskId));
completed = tasksResponse.completed();
logger.info("force merge task not completed yet");
try {
Thread.sleep(2 * 60_000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
```
all seems good when task is still running. but when task finally completes, get task response throws exception
```
Error deserializing co.elastic.clients.elasticsearch.tasks.GetTasksResponse: co.elastic.clients.util.MissingRequiredPropertyException: Missing required property 'TaskStatus.batches' (JSON path: response) (line no=1, column no=449, offset=-1)
at co.elastic.clients.json.JsonpMappingException.from0(JsonpMappingException.java:134)
at co.elastic.clients.json.JsonpMappingException.from(JsonpMappingException.java:121)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:218)
at co.elastic.clients.json.ObjectDeserializer.deserialize(ObjectDeserializer.java:148)
at co.elastic.clients.json.JsonpDeserializer.deserialize(JsonpDeserializer.java:76)
at co.elastic.clients.json.ObjectBuilderDeserializer.deserialize(ObjectBuilderDeserializer.java:79)
at co.elastic.clients.json.DelegatingDeserializer$SameType.deserialize(DelegatingDeserializer.java:43)
at co.elastic.clients.transport.rest_client.RestClientTransport.decodeResponse(RestClientTransport.java:325)
at co.elastic.clients.transport.rest_client.RestClientTransport.getHighLevelResponse(RestClientTransport.java:295)
at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:148)
at co.elastic.clients.elasticsearch.tasks.ElasticsearchTasksClient.get(ElasticsearchTasksClient.java:117)
at co.elastic.clients.elasticsearch.tasks.ElasticsearchTasksClient.get(ElasticsearchTasksClient.java:133)
```
and the completed response json string should be something like this
```json
{
"completed": true,
"task": {
"node": "xD7kSXXeSXWMURif3cX16w",
"id": 2180131,
"type": "transport",
"action": "indices:admin/forcemerge",
"description": "Force-merge indices [xxx], maxSegments[1], onlyExpungeDeletes[false], flush[true]",
"start_time_in_millis": 1671621375383,
"running_time_in_nanos": 9551767091603,
"cancellable": false,
"headers": {}
},
"response": {
"_shards": {
"total": 6,
"successful": 6,
"failed": 0
}
}
}
```
no response.batches exists however `batches` is force required in `TaskStatus` of the client code
```java
private TaskStatus(Builder builder) {
this.batches = ApiTypeHelper.requireNonNull(builder.batches, this, "batches");
...
}
```
i think this a bug not related to https://github.com/elastic/elasticsearch-specification/issues/1767, so i opened this issue
Contributor guide
Assessment
This issue has not been assessed yet.