Skip to content

Commit e3f1de2

Browse files
authored
Script: UpdateByQuery can read doc version if requested (#88740)
Allow UpdateByQuery to read the doc version if set in the request via `version=true`. If `version=true` is unset or false, the `ctx._version` is `-1` indicating internal versioning via seq. Fixes: #55745
1 parent 9fc5e2f commit e3f1de2

File tree

4 files changed

+140
-2
lines changed

4 files changed

+140
-2
lines changed

docs/changelog/88740.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 88740
2+
summary: "Script: `UpdateByQuery` can read doc version if requested"
3+
area: "Infra/Scripting"
4+
type: bug
5+
issues: []

modules/reindex/src/main/java/org/elasticsearch/reindex/TransportUpdateByQueryAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ static class AsyncIndexBySearchAction extends AbstractAsyncBulkByScrollAction<Up
100100
) {
101101
super(
102102
task,
103-
// use sequence number powered optimistic concurrency control
104-
false,
103+
// use sequence number powered optimistic concurrency control unless requested
104+
request.getSearchRequest().source() != null && Boolean.TRUE.equals(request.getSearchRequest().source().version()),
105105
true,
106106
logger,
107107
client,
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0 and the Server Side Public License, v 1; you may not use this file except
5+
* in compliance with, at your election, the Elastic License 2.0 or the Server
6+
* Side Public License, v 1.
7+
*/
8+
9+
package org.elasticsearch.reindex;
10+
11+
import org.elasticsearch.cluster.ClusterState;
12+
import org.elasticsearch.index.reindex.BulkByScrollResponse;
13+
import org.elasticsearch.index.reindex.ScrollableHitSource.Hit;
14+
import org.elasticsearch.index.reindex.UpdateByQueryRequest;
15+
16+
public class UpdateByQueryVersionTests extends AbstractAsyncBulkByScrollActionMetadataTestCase<UpdateByQueryRequest, BulkByScrollResponse> {
17+
18+
UpdateByQueryRequest request;
19+
20+
public void testVersion() {
21+
request = null;
22+
assertFalse(action().mainRequest.getSearchRequest().source().version());
23+
24+
request = new UpdateByQueryRequest();
25+
request.getSearchRequest().source().version(false);
26+
assertFalse(action().mainRequest.getSearchRequest().source().version());
27+
28+
request = new UpdateByQueryRequest();
29+
request.getSearchRequest().source().version(null);
30+
assertFalse(action().mainRequest.getSearchRequest().source().version());
31+
32+
request = new UpdateByQueryRequest();
33+
request.getSearchRequest().source().version(true);
34+
assertTrue(action().mainRequest.getSearchRequest().source().version());
35+
}
36+
37+
@Override
38+
protected TestAction action() {
39+
return new TestAction();
40+
}
41+
42+
@Override
43+
protected UpdateByQueryRequest request() {
44+
return request != null ? request : new UpdateByQueryRequest();
45+
}
46+
47+
private class TestAction extends TransportUpdateByQueryAction.AsyncIndexBySearchAction {
48+
TestAction() {
49+
super(
50+
UpdateByQueryVersionTests.this.task,
51+
UpdateByQueryVersionTests.this.logger,
52+
null,
53+
UpdateByQueryVersionTests.this.threadPool,
54+
null,
55+
request(),
56+
ClusterState.EMPTY_STATE,
57+
listener()
58+
);
59+
}
60+
61+
@Override
62+
public RequestWrapper<?> copyMetadata(RequestWrapper<?> request, Hit doc) {
63+
return super.copyMetadata(request, doc);
64+
}
65+
}
66+
}

modules/reindex/src/yamlRestTest/resources/rest-api-spec/test/update_by_query/80_scripting.yml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,3 +432,70 @@
432432
lang: painless
433433
source: syntax errors are fun!
434434
- match: {error.reason: 'compile error'}
435+
436+
---
437+
"Can read version":
438+
- skip:
439+
version: " - 8.3.99"
440+
reason: fixed in 8.4.0
441+
442+
- do:
443+
index:
444+
index: twitter
445+
id: "1"
446+
body: { "user": "kimchy" }
447+
version: 500
448+
version_type: "external"
449+
- do:
450+
indices.refresh: {}
451+
452+
- do:
453+
update_by_query:
454+
refresh: true
455+
index: twitter
456+
version: true
457+
body:
458+
script:
459+
lang: painless
460+
source: |
461+
ctx._source.old_version = ctx._version;
462+
463+
- match: {updated: 1}
464+
465+
- do:
466+
search:
467+
rest_total_hits_as_int: true
468+
index: twitter
469+
version: true
470+
body:
471+
query:
472+
match_all: {}
473+
474+
- match: { hits.total: 1 }
475+
- match: { hits.hits.0._source.old_version: 500 }
476+
477+
- do:
478+
update_by_query:
479+
refresh: true
480+
index: twitter
481+
# no version
482+
body:
483+
script:
484+
lang: painless
485+
source: |
486+
ctx._source.old_version = ctx._version;
487+
488+
- match: {updated: 1}
489+
490+
- do:
491+
search:
492+
rest_total_hits_as_int: true
493+
index: twitter
494+
version: true
495+
body:
496+
query:
497+
match_all: {}
498+
499+
- match: { hits.total: 1 }
500+
- match: { hits.hits.0._source.old_version: -1 }
501+

0 commit comments

Comments
 (0)