Skip to content

Commit 8c54795

Browse files
committed
Scripting: Use ParameterMap for deprecated ctx var in update scripts (elastic#34065)
This commit removes the sysprop controlling whether ctx is in params for update scripts and replaces it with use of the new ParameterMap, which outputs a deprecation warning whenever params.ctx is used.
1 parent d7ea82f commit 8c54795

File tree

5 files changed

+44
-44
lines changed

5 files changed

+44
-44
lines changed

modules/reindex/src/main/java/org/elasticsearch/index/reindex/AbstractAsyncBulkByScrollAction.java

+4-13
Original file line numberDiff line numberDiff line change
@@ -763,9 +763,6 @@ public abstract static class ScriptApplier implements BiFunction<RequestWrapper<
763763
private final Script script;
764764
private final Map<String, Object> params;
765765

766-
private UpdateScript executable;
767-
private Map<String, Object> context;
768-
769766
public ScriptApplier(WorkerBulkByScrollTaskState taskWorker,
770767
ScriptService scriptService,
771768
Script script,
@@ -782,16 +779,8 @@ public RequestWrapper<?> apply(RequestWrapper<?> request, ScrollableHitSource.Hi
782779
if (script == null) {
783780
return request;
784781
}
785-
if (executable == null) {
786-
UpdateScript.Factory factory = scriptService.compile(script, UpdateScript.CONTEXT);
787-
executable = factory.newInstance(params);
788-
}
789-
if (context == null) {
790-
context = new HashMap<>();
791-
} else {
792-
context.clear();
793-
}
794782

783+
Map<String, Object> context = new HashMap<>();
795784
context.put(IndexFieldMapper.NAME, doc.getIndex());
796785
context.put(TypeFieldMapper.NAME, doc.getType());
797786
context.put(IdFieldMapper.NAME, doc.getId());
@@ -806,7 +795,9 @@ public RequestWrapper<?> apply(RequestWrapper<?> request, ScrollableHitSource.Hi
806795
OpType oldOpType = OpType.INDEX;
807796
context.put("op", oldOpType.toString());
808797

809-
executable.execute(context);
798+
UpdateScript.Factory factory = scriptService.compile(script, UpdateScript.CONTEXT);
799+
UpdateScript updateScript = factory.newInstance(params, context);
800+
updateScript.execute();
810801

811802
String newOp = (String) context.remove("op");
812803
if (newOp == null) {

modules/reindex/src/test/java/org/elasticsearch/index/reindex/AbstractAsyncBulkByScrollActionScriptTestCase.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,12 @@ public void setupScriptService() {
5656
protected <T extends ActionRequest> T applyScript(Consumer<Map<String, Object>> scriptBody) {
5757
IndexRequest index = new IndexRequest("index", "type", "1").source(singletonMap("foo", "bar"));
5858
ScrollableHitSource.Hit doc = new ScrollableHitSource.BasicHit("test", "type", "id", 0);
59-
UpdateScript updateScript = new UpdateScript(Collections.emptyMap()) {
59+
UpdateScript.Factory factory = (params, ctx) -> new UpdateScript(Collections.emptyMap(), ctx) {
6060
@Override
61-
public void execute(Map<String, Object> ctx) {
61+
public void execute() {
6262
scriptBody.accept(ctx);
6363
}
64-
};
65-
UpdateScript.Factory factory = params -> updateScript;
64+
};;
6665
ExecutableScript simpleExecutableScript = new SimpleExecutableScript(scriptBody);
6766
when(scriptService.compile(any(), eq(ExecutableScript.CONTEXT))).thenReturn(params -> simpleExecutableScript);
6867
when(scriptService.compile(any(), eq(UpdateScript.CONTEXT))).thenReturn(factory);

server/src/main/java/org/elasticsearch/action/update/UpdateHelper.java

+6-20
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,6 @@
1919

2020
package org.elasticsearch.action.update;
2121

22-
import java.io.IOException;
23-
import java.util.HashMap;
24-
import java.util.Map;
25-
import java.util.function.LongSupplier;
2622
import org.apache.logging.log4j.Logger;
2723
import org.elasticsearch.ElasticsearchException;
2824
import org.elasticsearch.action.DocWriteResponse;
@@ -53,18 +49,17 @@
5349
import org.elasticsearch.script.UpdateScript;
5450
import org.elasticsearch.search.lookup.SourceLookup;
5551

52+
import java.io.IOException;
5653
import java.util.ArrayList;
57-
import static org.elasticsearch.common.Booleans.parseBoolean;
54+
import java.util.HashMap;
55+
import java.util.Map;
56+
import java.util.function.LongSupplier;
5857

5958
/**
6059
* Helper for translating an update request to an index, delete request or update response.
6160
*/
6261
public class UpdateHelper extends AbstractComponent {
6362

64-
/** Whether scripts should add the ctx variable to the params map. */
65-
private static final boolean CTX_IN_PARAMS =
66-
parseBoolean(System.getProperty("es.scripting.update.ctx_in_params"), true);
67-
6863
private final ScriptService scriptService;
6964

7065
public UpdateHelper(Settings settings, ScriptService scriptService) {
@@ -304,17 +299,8 @@ private Map<String, Object> executeScript(Script script, Map<String, Object> ctx
304299
try {
305300
if (scriptService != null) {
306301
UpdateScript.Factory factory = scriptService.compile(script, UpdateScript.CONTEXT);
307-
final Map<String, Object> params;
308-
if (CTX_IN_PARAMS) {
309-
params = new HashMap<>(script.getParams());
310-
params.put(ContextFields.CTX, ctx);
311-
deprecationLogger.deprecated("Using `ctx` via `params.ctx` is deprecated. " +
312-
"Use -Des.scripting.update.ctx_in_params=false to enforce non-deprecated usage.");
313-
} else {
314-
params = script.getParams();
315-
}
316-
UpdateScript executableScript = factory.newInstance(params);
317-
executableScript.execute(ctx);
302+
UpdateScript executableScript = factory.newInstance(script.getParams(), ctx);
303+
executableScript.execute();
318304
}
319305
} catch (Exception e) {
320306
throw new IllegalArgumentException("failed to execute script", e);

server/src/main/java/org/elasticsearch/script/UpdateScript.java

+29-5
Original file line numberDiff line numberDiff line change
@@ -20,33 +20,57 @@
2020

2121
package org.elasticsearch.script;
2222

23+
import java.util.Collections;
24+
import java.util.HashMap;
2325
import java.util.Map;
2426

2527
/**
2628
* An update script.
2729
*/
2830
public abstract class UpdateScript {
2931

30-
public static final String[] PARAMETERS = { "ctx" };
32+
public static final String[] PARAMETERS = { };
33+
34+
private static final Map<String, String> DEPRECATIONS;
35+
static {
36+
Map<String, String> deprecations = new HashMap<>();
37+
deprecations.put(
38+
"ctx",
39+
"Accessing variable [ctx] via [params.ctx] from within a update script " +
40+
"is deprecated in favor of directly accessing [ctx]."
41+
);
42+
DEPRECATIONS = Collections.unmodifiableMap(deprecations);
43+
}
3144

3245
/** The context used to compile {@link UpdateScript} factories. */
3346
public static final ScriptContext<Factory> CONTEXT = new ScriptContext<>("update", Factory.class);
3447

3548
/** The generic runtime parameters for the script. */
3649
private final Map<String, Object> params;
3750

38-
public UpdateScript(Map<String, Object> params) {
39-
this.params = params;
51+
/** The update context for the script. */
52+
private final Map<String, Object> ctx;
53+
54+
public UpdateScript(Map<String, Object> params, Map<String, Object> ctx) {
55+
Map<String, Object> paramsWithCtx = new HashMap<>(params);
56+
paramsWithCtx.put("ctx", ctx);
57+
this.params = new ParameterMap(paramsWithCtx, DEPRECATIONS);
58+
this.ctx = ctx;
4059
}
4160

4261
/** Return the parameters for this script. */
4362
public Map<String, Object> getParams() {
4463
return params;
4564
}
4665

47-
public abstract void execute(Map<String, Object> ctx);
66+
/** Return the update context for this script. */
67+
public Map<String, Object> getCtx() {
68+
return ctx;
69+
}
70+
71+
public abstract void execute();
4872

4973
public interface Factory {
50-
UpdateScript newInstance(Map<String, Object> params);
74+
UpdateScript newInstance(Map<String, Object> params, Map<String, Object> ctx);
5175
}
5276
}

test/framework/src/main/java/org/elasticsearch/script/MockScriptEngine.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,9 @@ public boolean execute(Map<String, Object> ctx) {
117117
};
118118
return context.factoryClazz.cast(factory);
119119
} else if (context.instanceClazz.equals(UpdateScript.class)) {
120-
UpdateScript.Factory factory = parameters -> new UpdateScript(parameters) {
120+
UpdateScript.Factory factory = (parameters, ctx) -> new UpdateScript(parameters, ctx) {
121121
@Override
122-
public void execute(Map<String, Object> ctx) {
122+
public void execute() {
123123
final Map<String, Object> vars = new HashMap<>();
124124
vars.put("ctx", ctx);
125125
vars.put("params", parameters);

0 commit comments

Comments
 (0)