Skip to content

Commit 51a56b3

Browse files
authored
Drop compile limit on runtime fields scripts (#61297)
This opts all of the script contexts used by `runtime_script` our of the compilation rate limiting because it'd be lame to prevent a mapping update because we can't compile the script.
1 parent 40e3aec commit 51a56b3

13 files changed

+209
-63
lines changed

x-pack/plugin/runtime-fields/src/main/java/org/elasticsearch/xpack/runtimefields/BooleanScriptFieldScript.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.util.Map;
2020

2121
public abstract class BooleanScriptFieldScript extends AbstractScriptFieldScript {
22-
public static final ScriptContext<Factory> CONTEXT = new ScriptContext<>("boolean_script_field", Factory.class);
22+
public static final ScriptContext<Factory> CONTEXT = newContext("boolean_script_field", Factory.class);
2323

2424
static List<Whitelist> whitelist() {
2525
return List.of(WhitelistLoader.loadFromResourceFiles(RuntimeFieldsPainlessExtension.class, "boolean_whitelist.txt"));

x-pack/plugin/runtime-fields/src/main/java/org/elasticsearch/xpack/runtimefields/DoubleScriptFieldScript.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.util.Map;
2020

2121
public abstract class DoubleScriptFieldScript extends AbstractScriptFieldScript {
22-
public static final ScriptContext<Factory> CONTEXT = new ScriptContext<>("double_script_field", Factory.class);
22+
public static final ScriptContext<Factory> CONTEXT = newContext("double_script_field", Factory.class);
2323

2424
static List<Whitelist> whitelist() {
2525
return List.of(WhitelistLoader.loadFromResourceFiles(RuntimeFieldsPainlessExtension.class, "double_whitelist.txt"));

x-pack/plugin/runtime-fields/src/main/java/org/elasticsearch/xpack/runtimefields/IpScriptFieldScript.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
* </ul>
4141
*/
4242
public abstract class IpScriptFieldScript extends AbstractScriptFieldScript {
43-
public static final ScriptContext<Factory> CONTEXT = new ScriptContext<>("ip_script_field", Factory.class);
43+
public static final ScriptContext<Factory> CONTEXT = newContext("ip_script_field", Factory.class);
4444

4545
static List<Whitelist> whitelist() {
4646
return List.of(WhitelistLoader.loadFromResourceFiles(RuntimeFieldsPainlessExtension.class, "ip_whitelist.txt"));

x-pack/plugin/runtime-fields/src/main/java/org/elasticsearch/xpack/runtimefields/LongScriptFieldScript.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import java.util.Map;
1919

2020
public abstract class LongScriptFieldScript extends AbstractLongScriptFieldScript {
21-
public static final ScriptContext<Factory> CONTEXT = new ScriptContext<>("long_script_field", Factory.class);
21+
public static final ScriptContext<Factory> CONTEXT = newContext("long_script_field", Factory.class);
2222

2323
static List<Whitelist> whitelist() {
2424
return List.of(WhitelistLoader.loadFromResourceFiles(RuntimeFieldsPainlessExtension.class, "long_whitelist.txt"));

x-pack/plugin/runtime-fields/src/main/java/org/elasticsearch/xpack/runtimefields/StringScriptFieldScript.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
import java.util.Map;
2020

2121
public abstract class StringScriptFieldScript extends AbstractScriptFieldScript {
22-
public static final ScriptContext<Factory> CONTEXT = new ScriptContext<>("string_script_field", Factory.class);
22+
public static final ScriptContext<Factory> CONTEXT = newContext("string_script_field", Factory.class);
2323

2424
static List<Whitelist> whitelist() {
2525
return List.of(WhitelistLoader.loadFromResourceFiles(RuntimeFieldsPainlessExtension.class, "string_whitelist.txt"));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
package org.elasticsearch.xpack.runtimefields;
8+
9+
import org.elasticsearch.script.ScriptContext;
10+
11+
public class BooleanScriptFieldScriptTests extends ScriptFieldScriptTestCase<BooleanScriptFieldScript.Factory> {
12+
public static final BooleanScriptFieldScript.Factory DUMMY = (params, lookup) -> ctx -> new BooleanScriptFieldScript(
13+
params,
14+
lookup,
15+
ctx
16+
) {
17+
@Override
18+
public void execute() {
19+
new BooleanScriptFieldScript.Value(this).value(false);
20+
}
21+
};
22+
23+
@Override
24+
protected ScriptContext<BooleanScriptFieldScript.Factory> context() {
25+
return BooleanScriptFieldScript.CONTEXT;
26+
}
27+
28+
@Override
29+
protected BooleanScriptFieldScript.Factory dummyScript() {
30+
return DUMMY;
31+
}
32+
}

x-pack/plugin/runtime-fields/src/test/java/org/elasticsearch/xpack/runtimefields/DateScriptFieldScriptTests.java

+10-14
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,9 @@
66

77
package org.elasticsearch.xpack.runtimefields;
88

9-
import org.elasticsearch.script.Script;
10-
import org.elasticsearch.script.ScriptService;
11-
import org.elasticsearch.script.ScriptType;
12-
import org.elasticsearch.test.ESTestCase;
9+
import org.elasticsearch.script.ScriptContext;
1310

14-
import java.io.IOException;
15-
import java.util.Map;
16-
17-
public class DateScriptFieldScriptTests extends ESTestCase {
11+
public class DateScriptFieldScriptTests extends ScriptFieldScriptTestCase<DateScriptFieldScript.Factory> {
1812
public static final DateScriptFieldScript.Factory DUMMY = (params, lookup, formatter) -> ctx -> new DateScriptFieldScript(
1913
params,
2014
lookup,
@@ -27,11 +21,13 @@ public void execute() {
2721
}
2822
};
2923

30-
public void testRateLimitingDisabled() throws IOException {
31-
try (ScriptService scriptService = TestScriptEngine.scriptService(DateScriptFieldScript.CONTEXT, DUMMY)) {
32-
for (int i = 0; i < 1000; i++) {
33-
scriptService.compile(new Script(ScriptType.INLINE, "test", "test_" + i, Map.of()), DateScriptFieldScript.CONTEXT);
34-
}
35-
}
24+
@Override
25+
protected ScriptContext<DateScriptFieldScript.Factory> context() {
26+
return DateScriptFieldScript.CONTEXT;
27+
}
28+
29+
@Override
30+
protected DateScriptFieldScript.Factory dummyScript() {
31+
return DUMMY;
3632
}
3733
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
package org.elasticsearch.xpack.runtimefields;
8+
9+
import org.elasticsearch.script.ScriptContext;
10+
11+
public class DoubleScriptFieldScriptTests extends ScriptFieldScriptTestCase<DoubleScriptFieldScript.Factory> {
12+
public static final DoubleScriptFieldScript.Factory DUMMY = (params, lookup) -> ctx -> new DoubleScriptFieldScript(
13+
params,
14+
lookup,
15+
ctx
16+
) {
17+
@Override
18+
public void execute() {
19+
new DoubleScriptFieldScript.Value(this).value(1.0);
20+
}
21+
};
22+
23+
@Override
24+
protected ScriptContext<DoubleScriptFieldScript.Factory> context() {
25+
return DoubleScriptFieldScript.CONTEXT;
26+
}
27+
28+
@Override
29+
protected DoubleScriptFieldScript.Factory dummyScript() {
30+
return DUMMY;
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
package org.elasticsearch.xpack.runtimefields;
8+
9+
import org.elasticsearch.script.ScriptContext;
10+
11+
public class IpScriptFieldScriptTests extends ScriptFieldScriptTestCase<IpScriptFieldScript.Factory> {
12+
public static final IpScriptFieldScript.Factory DUMMY = (params, lookup) -> ctx -> new IpScriptFieldScript(params, lookup, ctx) {
13+
@Override
14+
public void execute() {
15+
new IpScriptFieldScript.StringValue(this).stringValue("192.168.0.1");
16+
}
17+
};
18+
19+
@Override
20+
protected ScriptContext<IpScriptFieldScript.Factory> context() {
21+
return IpScriptFieldScript.CONTEXT;
22+
}
23+
24+
@Override
25+
protected IpScriptFieldScript.Factory dummyScript() {
26+
return DUMMY;
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
package org.elasticsearch.xpack.runtimefields;
8+
9+
import org.elasticsearch.script.ScriptContext;
10+
11+
public class LongScriptFieldScriptTests extends ScriptFieldScriptTestCase<LongScriptFieldScript.Factory> {
12+
public static final LongScriptFieldScript.Factory DUMMY = (params, lookup) -> ctx -> new LongScriptFieldScript(params, lookup, ctx) {
13+
@Override
14+
public void execute() {
15+
new LongScriptFieldScript.Value(this).value(1);
16+
}
17+
};
18+
19+
@Override
20+
protected ScriptContext<LongScriptFieldScript.Factory> context() {
21+
return LongScriptFieldScript.CONTEXT;
22+
}
23+
24+
@Override
25+
protected LongScriptFieldScript.Factory dummyScript() {
26+
return DUMMY;
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
package org.elasticsearch.xpack.runtimefields;
8+
9+
import org.elasticsearch.script.Script;
10+
import org.elasticsearch.script.ScriptContext;
11+
import org.elasticsearch.script.ScriptService;
12+
import org.elasticsearch.script.ScriptType;
13+
import org.elasticsearch.test.ESTestCase;
14+
15+
import java.io.IOException;
16+
import java.util.Map;
17+
18+
public abstract class ScriptFieldScriptTestCase<T> extends ESTestCase {
19+
protected abstract ScriptContext<T> context();
20+
21+
protected abstract T dummyScript();
22+
23+
public final void testRateLimitingDisabled() throws IOException {
24+
try (ScriptService scriptService = TestScriptEngine.scriptService(context(), dummyScript())) {
25+
for (int i = 0; i < 1000; i++) {
26+
scriptService.compile(new Script(ScriptType.INLINE, "test", "test_" + i, Map.of()), context());
27+
}
28+
}
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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+
* you may not use this file except in compliance with the Elastic License.
5+
*/
6+
7+
package org.elasticsearch.xpack.runtimefields;
8+
9+
import org.elasticsearch.script.ScriptContext;
10+
11+
public class StringScriptFieldScriptTests extends ScriptFieldScriptTestCase<StringScriptFieldScript.Factory> {
12+
public static final StringScriptFieldScript.Factory DUMMY = (params, lookup) -> ctx -> new StringScriptFieldScript(
13+
params,
14+
lookup,
15+
ctx
16+
) {
17+
@Override
18+
public void execute() {
19+
new StringScriptFieldScript.Value(this).value("foo");
20+
}
21+
};
22+
23+
@Override
24+
protected ScriptContext<StringScriptFieldScript.Factory> context() {
25+
return StringScriptFieldScript.CONTEXT;
26+
}
27+
28+
@Override
29+
protected StringScriptFieldScript.Factory dummyScript() {
30+
return DUMMY;
31+
}
32+
}

x-pack/plugin/runtime-fields/src/test/java/org/elasticsearch/xpack/runtimefields/mapper/RuntimeScriptFieldMapperTests.java

+12-44
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,18 @@
2424
import org.elasticsearch.test.ESSingleNodeTestCase;
2525
import org.elasticsearch.test.InternalSettingsPlugin;
2626
import org.elasticsearch.xpack.runtimefields.BooleanScriptFieldScript;
27+
import org.elasticsearch.xpack.runtimefields.BooleanScriptFieldScriptTests;
2728
import org.elasticsearch.xpack.runtimefields.DateScriptFieldScript;
2829
import org.elasticsearch.xpack.runtimefields.DateScriptFieldScriptTests;
2930
import org.elasticsearch.xpack.runtimefields.DoubleScriptFieldScript;
31+
import org.elasticsearch.xpack.runtimefields.DoubleScriptFieldScriptTests;
3032
import org.elasticsearch.xpack.runtimefields.IpScriptFieldScript;
33+
import org.elasticsearch.xpack.runtimefields.IpScriptFieldScriptTests;
3134
import org.elasticsearch.xpack.runtimefields.LongScriptFieldScript;
35+
import org.elasticsearch.xpack.runtimefields.LongScriptFieldScriptTests;
3236
import org.elasticsearch.xpack.runtimefields.RuntimeFields;
3337
import org.elasticsearch.xpack.runtimefields.StringScriptFieldScript;
38+
import org.elasticsearch.xpack.runtimefields.StringScriptFieldScriptTests;
3439
import org.elasticsearch.xpack.runtimefields.TestScriptEngine;
3540

3641
import java.io.IOException;
@@ -320,59 +325,22 @@ public ScriptEngine getScriptEngine(Settings settings, Collection<ScriptContext<
320325
@Override
321326
protected Object buildScriptFactory(ScriptContext<?> context) {
322327
if (context == BooleanScriptFieldScript.CONTEXT) {
323-
return (BooleanScriptFieldScript.Factory) (params, lookup) -> ctx -> new BooleanScriptFieldScript(
324-
params,
325-
lookup,
326-
ctx
327-
) {
328-
@Override
329-
public void execute() {
330-
new BooleanScriptFieldScript.Value(this).value(true);
331-
}
332-
};
328+
return BooleanScriptFieldScriptTests.DUMMY;
333329
}
334330
if (context == DateScriptFieldScript.CONTEXT) {
335331
return DateScriptFieldScriptTests.DUMMY;
336332
}
337333
if (context == DoubleScriptFieldScript.CONTEXT) {
338-
return (DoubleScriptFieldScript.Factory) (params, lookup) -> ctx -> new DoubleScriptFieldScript(
339-
params,
340-
lookup,
341-
ctx
342-
) {
343-
@Override
344-
public void execute() {
345-
new DoubleScriptFieldScript.Value(this).value(1.0);
346-
}
347-
};
334+
return DoubleScriptFieldScriptTests.DUMMY;
348335
}
349336
if (context == IpScriptFieldScript.CONTEXT) {
350-
return (IpScriptFieldScript.Factory) (params, lookup) -> ctx -> new IpScriptFieldScript(params, lookup, ctx) {
351-
@Override
352-
public void execute() {
353-
new IpScriptFieldScript.StringValue(this).stringValue("192.168.0.1");
354-
}
355-
};
356-
}
357-
if (context == StringScriptFieldScript.CONTEXT) {
358-
return (StringScriptFieldScript.Factory) (params, lookup) -> ctx -> new StringScriptFieldScript(
359-
params,
360-
lookup,
361-
ctx
362-
) {
363-
@Override
364-
public void execute() {
365-
new StringScriptFieldScript.Value(this).value("test");
366-
}
367-
};
337+
return IpScriptFieldScriptTests.DUMMY;
368338
}
369339
if (context == LongScriptFieldScript.CONTEXT) {
370-
return (LongScriptFieldScript.Factory) (params, lookup) -> ctx -> new LongScriptFieldScript(params, lookup, ctx) {
371-
@Override
372-
public void execute() {
373-
new LongScriptFieldScript.Value(this).value(1);
374-
}
375-
};
340+
return LongScriptFieldScriptTests.DUMMY;
341+
}
342+
if (context == StringScriptFieldScript.CONTEXT) {
343+
return StringScriptFieldScriptTests.DUMMY;
376344
}
377345
throw new IllegalArgumentException("No test script for [" + context + "]");
378346
}

0 commit comments

Comments
 (0)